From c4fb693035a3fbb7f949d5c013c9e167321fc37e Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Mon, 28 Jun 2021 10:54:25 +0200 Subject: [PATCH 001/227] RFC: Kibana `preboot` lifecycle stage. (#99318) --- rfcs/images/0019_lifecycle_preboot.png | Bin 0 -> 109099 bytes rfcs/text/0019_lifecycle_preboot.md | 261 +++++++++++++++++++++++++ 2 files changed, 261 insertions(+) create mode 100644 rfcs/images/0019_lifecycle_preboot.png create mode 100644 rfcs/text/0019_lifecycle_preboot.md diff --git a/rfcs/images/0019_lifecycle_preboot.png b/rfcs/images/0019_lifecycle_preboot.png new file mode 100644 index 0000000000000000000000000000000000000000..73eeb901eb33f5d38fdb8d4a90f0388b9e0ab241 GIT binary patch literal 109099 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%0DtX{nClzq*DFa4iS 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
DcS2GAnlJy}cnCZG>*kjc94ujR>MOf+4 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 { + setup(core: CorePrebootSetup, plugins: TPluginsSetup): TSetup; + stop?(): void; +} +``` + +To differentiate preboot and standard plugins we'll introduce a new _optional_ `type` property in the plugin manifest. The property can have only two possible values: `preboot` for `preboot` plugins and `standard` for the standard ones. If `type` is omitted, the `standard` value will be assumed. + +```json5 +// NOTE(azasypkin): all other existing properties have been omitted for brevity. +{ + "type": "preboot", // 'preboot' | 'standard' | undefined +} +``` + +The Plugins service will split plugins into two separate groups during discovery to use them separately at the `preboot`, `setup`, and `start` stages. The Core contract that preboot plugins will receive during their `setup` will be different from the one standard plugins receive, and will only include the functionality that is currently required for the interactive setup mode. We'll discuss this functionality in details in the following sections: + +```ts +export interface CorePrebootSetup { + elasticsearch: ElasticsearchServicePrebootSetup; + http: HttpServicePrebootSetup; + preboot: PrebootServiceSetup; +} +``` + +### 3.2.2 HTTP service + +We'll change HTTP service to initialize and start preboot HTTP server (formerly known as `Not Ready` server) in the new `preboot` method instead of `setup`. The returned `InternalHttpServicePrebootSetup` contract will presumably be very similar to the existing `InternalHttpServiceSetup` contract, but will only include APIs we currently need to support interactive setup mode: + +```ts +// NOTE(azasypkin): some existing properties have been omitted for brevity. +export interface InternalHttpServicePrebootSetup + extends Pick { + server: HttpServerSetup['server']; + externalUrl: ExternalUrlConfig; + registerRoutes(path: string, callback: (router: IRouter) => void): void; +} +``` + +The only part of this contract that will be available to the preboot plugins via `CorePrebootSetup` is the API to register HTTP routes on the already running preboot HTTP server: + +```ts +export interface HttpServicePrebootSetup { + registerRoutes(path: string, callback: (router: IRouter) => void): void; +} +``` + +The Core HTTP context available to handlers of the routes registered on the preboot HTTP server will only expose the `uiSettings` service. As explained in the [UI Settings service section](#324-ui-settings-service), this service will only give access to the **default Core** UI settings and their overrides set through Kibana configuration, if any. +```ts +// NOTE(azasypkin): the fact that the client is lazily initialized has been omitted for brevity. +export interface PrebootCoreRouteHandlerContext { + readonly uiSettings: { client: IUiSettingsClient }; +} +``` + +The authentication and authorization components are not available at the `preboot` stage, and hence all preboot HTTP server routes can be freely accessed by anyone with access to the network Kibana is exposed to. + +Just as today, Kibana will shut the preboot HTTP server down as soon as it's ready to start the main HTTP server. + +### 3.2.3 Elasticsearch service + +As mentioned in the [Motivation section](#2-motivation), the main goal of the interactive setup mode is to give the user a hassle-free way to configure Kibana connection to an Elasticsearch cluster. That means that users might provide certain connection information, and Kibana preboot plugins should be able to construct a new Elasticsearch client using this information to verify it and potentially call Elasticsearch APIs. + +To support this use case we'll add a new `preboot` method to the Elasticsearch service that will return the following contract, and make it available to the preboot plugins via `CorePrebootSetup`: + +```ts +export interface ElasticsearchServicePrebootSetup { + readonly createClient: ( + type: string, + clientConfig?: Partial + ) => ICustomClusterClient; +} +``` + +The Elasticsearch clients created with `createClient` rely on the default Kibana Elasticsearch configuration and any configuration overrides specified by the consumer. + +__NOTE:__ We may need to expose a full or portion of Elasticsearch config to the preboot plugins for them to check if the user has already configured Elasticsearch connection. There are other ways to check that without direct access to the configuration though. + +### 3.2.4 UI Settings service + +We'll introduce a new `preboot` method in the UI Settings service that will produce a UI Settings client instance. Since during the `preboot` stage Kibana can access neither user information nor Saved Objects, this client will only give access to the **default Core** UI settings and their overrides set through Kibana configuration, if any: + +```ts +export interface InternalUiSettingsServicePrebootSetup { + defaultsClient(): IUiSettingsClient; +} +``` + +UI Settings service isn't strictly necessary during the `preboot` stage, but many Kibana Core components rely on it explicitly and implicitly, which justifies this simple change. + +### 3.2.5 Rendering service + +We'll introduce a new `preboot` method in the Rendering service that will register Kibana main UI bootstrap template route on the preboot HTTP server as it does for the main HTTP server today. The main difference is that bootstrap UI will only reference bundles of the preboot plugins and will rely on the default UI settings. + +### 3.2.6 I18n service + +We'll introduce a new `preboot` method in the I18n service to only include translations for the Core itself and preboot plugins in the translations bundle loaded with the preboot UI bootstrap template. This would potentially allow us to switch locale during interactive setup mode if there is such a need in the future. + +### 3.2.7 Environment service + +There are no changes required in the Environment service itself, but we'll expose one additional property from its `setup` contract to the plugins: the paths to the known configuration files. The interactive setup mode should be able to figure out to which configuration file Kibana should save any changes users might need to make. + +### 3.2.8 Core app service + +We'll introduce a new `preboot` method in the Core app service to register routes on the preboot HTTP server necessary for the rendering of the Kibana preboot applications. Most of the routes will be the same as for the main HTTP server, but there are three notable exceptions: + +1. JS bundles routes will only include those exposed by the preboot plugins + +2. Default route for the preboot HTTP server will be hardcoded to the root path (`/`) since we cannot rely on the default value of the `defaultRoute` UI setting (`/app/home`) + +3. Main application route (`/app/{id}/{any*}`) will be replaced with the catch-all route (`/{path*}`). The reason is that if the user tries to access Kibana with a legit standard application URL (e.g. `/app/discover/?parameters`) while Kibana is still at the `preboot` stage, they will end up with `Application is not found` error. Instead, with the catch-all route, Kibana will capture the original URL in the `next` query string parameter and redirect the user to the root (e.g. `/?next=%2Fapp%2Fdiscover%2F%3Fparameters`). This will allow us to automatically redirect the user back to the original URL as soon as Kibana is ready. The main drawback and limitation of this approach are that there can be only one root-level preboot application. We can lift this limitation in the future if we have to though, for example, to support post-preboot Saved Objects migration UI or something similar. + +Serving a proper Kibana application on the root route of the preboot HTTP server implies that we'll also have a chance to replace the static `Kibana server is not ready yet` string with a more helpful and user-friendly application. Such application may potentially display a certain set of Kibana status information. + +### 3.2.9 Preboot service + +To support interactive applications at the `preboot` stage we should allow preboot plugins to pause Kibana startup sequence. This functionality will be exposed by the new Preboot service, and will be available to the preboot plugins via `CorePrebootSetup`. Preboot plugins will be able to provide a promise to hold `setup` and/or `start` for as long as needed, and also let Kibana know if it has to reload configuration before it enters the `setup` stage. + +```ts +export interface PrebootServiceSetup { + readonly isSetupOnHold: () => boolean; + readonly holdSetupUntilResolved: ( + reason: string, + promise: Promise<{ shouldReloadConfig: boolean } | void> + ) => void; + readonly isStartOnHold: () => boolean; + readonly holdStartUntilResolved: ( + reason: string, + promise: Promise + ) => void +} +``` + +Preboot service will provide a pair of helper `isSetupOnHold` and `isStartOnHold` methods that would allow consumers to check if `setup` or `start` are on hold before they are blocked on waiting. + +Internal Preboot service contract will also expose `waitUntilCanSetup` and `waitUntilCanStart` methods that bootstrap process can use to know when it can proceed to `setup` and `start` stages. If any of these methods returns a `Promise` that is rejected, Kibana will shut down. + +```ts +// NOTE(azasypkin): some existing properties have been omitted for brevity. +export interface InternalPrebootServiceSetup { + readonly waitUntilCanSetup: () => Promise<{ shouldReloadConfig: boolean } | void>; + readonly waitUntilCanStart: () => Promise; +} +``` + +### 3.2.10 Bootstrap + +We'll update Kibana bootstrap sequence to include `preboot` stage and to conditionally reload configuration before proceeding to `setup` and `start` stages: + +```ts +// NOTE(azasypkin): some functionality and checks have been omitted for brevity. +const { preboot } = await root.preboot(); + +const { shouldReloadConfig } = await preboot.waitUntilCanSetup(); +if (shouldReloadConfig) { + await reloadConfiguration('pre-boot request'); +} +await root.setup(); + +await preboot.waitUntilCanStart(); +await root.start(); +``` + +It's not yet clear if we need to adjust the base path proxy to account for this new lifecycle stage (see [unresolved question 2](#82-development-mode-and-basepath-proxy)). + +# 4. Drawbacks + +The main drawback is that proposed changes affect quite a few Kibana Core services that may impose a risk of breaking something in the critical parts of Kibana. + +# 5. Alternatives + +The most viable alternative to support interactive setup mode for Kibana was a standalone application that would be completely separated from Kibana. We ruled out this option since we won't be able to leverage existing and battle-tested Core services, UI components, and development tools. This would make the long-term maintenance burden unreasonably high. + +# 6. Adoption strategy + +The new `preboot` stage doesn't need an adoption strategy since it's intended for internal platform use only. + +# 7. How we teach this + +The new `preboot` stage shouldn't need much knowledge sharing since it's intended for internal platform use only and doesn't affect the standard plugins. All new services, methods, and contracts will be sufficiently documented in the code. + +# 8. Unresolved questions + +## 8.1 Lifecycle stage name + +Is `preboot` the right name for this new lifecycle stage? Do we have a better alternative? + +## 8.2 Development mode and basepath proxy + +Currently, the base path proxy blocks any requests to Kibana until it receives `SERVER_LISTENING` message. Kibana's main process sends this message only after `start`, but we should change that to support interactive preboot applications. It's not yet clear how big the impact of this change will be. + +# 9. Resolved questions + +## 9.1 Core client-side changes + +The server-side part of the `preboot` plugins will follow a new `PrebootPlugin` interface that doesn't have a `start` method, but the client-side part will stay the same as for standard plugins. This significantly simplifies implementation and doesn't introduce any known technical issues, but, unfortunately, brings some inconsistency to the codebase. We agreed that it's tolerable assuming we define a dedicated client-side `PrebootPlugin` interface that would hide from `CoreStart` all services that are unavailable to the preboot plugins (e.g., Saved Objects service). \ No newline at end of file From bfadab632463fc7b9e8ad50b51d0980829bd06a1 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 28 Jun 2021 12:05:46 +0200 Subject: [PATCH 002/227] [Lens] Improve pie suggestions (#102755) --- .../pie_visualization/suggestions.test.ts | 77 ++++++++++++++++++- .../public/pie_visualization/suggestions.ts | 18 +++-- 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts b/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts index 5ff233b9e11e1d..a527a3c8645430 100644 --- a/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts +++ b/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts @@ -6,7 +6,7 @@ */ import { PaletteOutput } from 'src/plugins/charts/public'; -import { DataType } from '../types'; +import { DataType, SuggestionRequest } from '../types'; import { suggestions } from './suggestions'; import { PieVisualizationState } from './types'; @@ -354,6 +354,81 @@ describe('suggestions', () => { ); }); + it('should score higher for more groups', () => { + const config: SuggestionRequest = { + table: { + layerId: 'first', + isMultiRow: true, + columns: [ + { + columnId: 'a', + operation: { label: 'Top 5', dataType: 'string' as DataType, isBucketed: true }, + }, + { + columnId: 'b', + operation: { label: 'Top 5', dataType: 'string' as DataType, isBucketed: true }, + }, + { + columnId: 'e', + operation: { label: 'Count', dataType: 'number' as DataType, isBucketed: false }, + }, + ], + changeType: 'initial', + }, + state: undefined, + keptLayerIds: ['first'], + }; + const twoGroupsResults = suggestions(config); + config.table.columns.splice(1, 1); + const oneGroupResults = suggestions(config); + + expect(Math.max(...twoGroupsResults.map((suggestion) => suggestion.score))).toBeGreaterThan( + Math.max(...oneGroupResults.map((suggestion) => suggestion.score)) + ); + }); + + it('should score higher for more groups for each subvis with passed-in subvis id', () => { + const config: SuggestionRequest = { + table: { + layerId: 'first', + isMultiRow: true, + columns: [ + { + columnId: 'a', + operation: { label: 'Top 5', dataType: 'string' as DataType, isBucketed: true }, + }, + { + columnId: 'b', + operation: { label: 'Top 5', dataType: 'string' as DataType, isBucketed: true }, + }, + { + columnId: 'e', + operation: { label: 'Count', dataType: 'number' as DataType, isBucketed: false }, + }, + ], + changeType: 'initial', + }, + state: undefined, + keptLayerIds: ['first'], + subVisualizationId: 'donut', + }; + const twoGroupsResults = suggestions(config); + config.table.columns.splice(1, 1); + const oneGroupResults = suggestions(config); + // collect scores for one or two groups for each sub vis + const scores: Record = {}; + twoGroupsResults.forEach((r) => { + scores[r.state.shape] = { ...(scores[r.state.shape] || {}), two: r.score }; + }); + oneGroupResults.forEach((r) => { + scores[r.state.shape] = { ...(scores[r.state.shape] || {}), one: r.score }; + }); + expect(Object.keys(scores).length).toEqual(2); + Object.values(scores).forEach(({ one, two }) => { + expect(two).toBeGreaterThan(one); + }); + }); + it('should keep passed in palette', () => { const mainPalette: PaletteOutput = { type: 'palette', name: 'mock' }; const results = suggestions({ diff --git a/x-pack/plugins/lens/public/pie_visualization/suggestions.ts b/x-pack/plugins/lens/public/pie_visualization/suggestions.ts index 7240203267d7ce..644f0a0cd8aaf8 100644 --- a/x-pack/plugins/lens/public/pie_visualization/suggestions.ts +++ b/x-pack/plugins/lens/public/pie_visualization/suggestions.ts @@ -51,9 +51,10 @@ export function suggestions({ const results: Array> = []; - if (groups.length <= MAX_PIE_BUCKETS) { - let newShape: PieVisualizationState['shape'] = 'donut'; - if (groups.length !== 1) { + if (groups.length <= MAX_PIE_BUCKETS && subVisualizationId !== 'treemap') { + let newShape: PieVisualizationState['shape'] = + (subVisualizationId as PieVisualizationState['shape']) || 'donut'; + if (groups.length !== 1 && !subVisualizationId) { newShape = 'pie'; } @@ -108,7 +109,10 @@ export function suggestions({ }); } - if (groups.length <= MAX_TREEMAP_BUCKETS) { + if ( + groups.length <= MAX_TREEMAP_BUCKETS && + (!subVisualizationId || subVisualizationId === 'treemap') + ) { results.push({ title: i18n.translate('xpack.lens.pie.treemapSuggestionLabel', { defaultMessage: 'As Treemap', @@ -149,7 +153,11 @@ export function suggestions({ } return [...results] - .sort((a, b) => a.score - b.score) + .map((suggestion) => ({ + ...suggestion, + score: suggestion.score + 0.05 * groups.length, + })) + .sort((a, b) => b.score - a.score) .map((suggestion) => ({ ...suggestion, hide: incompleteConfiguration || suggestion.hide, From 96c4350289adace86b877e6836be0029a062f662 Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Mon, 28 Jun 2021 08:13:41 -0400 Subject: [PATCH 003/227] Remove post-installation redirect for integrations (#103179) When installation integrations via the browse -> add integration flow in the integrations UI, we will no longer redirect the user back to the integration details page. Closes #100978 Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../sections/epm/screens/detail/index.tsx | 67 ++----------------- 1 file changed, 5 insertions(+), 62 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx index cf6007026afebc..e840da142cfbf8 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx @@ -6,7 +6,7 @@ */ import type { ReactEventHandler } from 'react'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { Redirect, Route, Switch, useLocation, useParams, useHistory } from 'react-router-dom'; +import { Redirect, Route, Switch, useLocation, useParams } from 'react-router-dom'; import styled from 'styled-components'; import { EuiBetaBadge, @@ -31,12 +31,7 @@ import { useBreadcrumbs, useStartServices, } from '../../../../hooks'; -import { - PLUGIN_ID, - INTEGRATIONS_PLUGIN_ID, - INTEGRATIONS_ROUTING_PATHS, - pagePathGetters, -} from '../../../../constants'; +import { PLUGIN_ID, INTEGRATIONS_ROUTING_PATHS, pagePathGetters } from '../../../../constants'; import { useCapabilities, useGetPackageInfoByKey, @@ -44,11 +39,7 @@ import { useAgentPolicyContext, } from '../../../../hooks'; import { pkgKeyFromPackageInfo } from '../../../../services'; -import type { - CreatePackagePolicyRouteState, - DetailViewPanelName, - PackageInfo, -} from '../../../../types'; +import type { DetailViewPanelName, PackageInfo } from '../../../../types'; import { InstallStatus } from '../../../../types'; import { Error, Loading } from '../../../../components'; import type { WithHeaderLayoutProps } from '../../../../layouts'; @@ -89,8 +80,7 @@ export function Detail() { const { pkgkey, panel } = useParams(); const { getHref } = useLink(); const hasWriteCapabilites = useCapabilities().write; - const history = useHistory(); - const { pathname, search, hash } = useLocation(); + const { search } = useLocation(); const queryParams = useMemo(() => new URLSearchParams(search), [search]); const integration = useMemo(() => queryParams.get('integration'), [queryParams]); const services = useStartServices(); @@ -212,66 +202,19 @@ export function Detail() { (ev) => { ev.preventDefault(); - // The object below, given to `createHref` is explicitly accessing keys of `location` in order - // to ensure that dependencies to this `useCallback` is set correctly (because `location` is mutable) - const currentPath = history.createHref({ - pathname, - search, - hash, - }); - const path = pagePathGetters.add_integration_to_policy({ pkgkey, ...(integration ? { integration } : {}), ...(agentPolicyIdFromContext ? { agentPolicyId: agentPolicyIdFromContext } : {}), })[1]; - let redirectToPath: CreatePackagePolicyRouteState['onSaveNavigateTo'] & - CreatePackagePolicyRouteState['onCancelNavigateTo']; - - if (agentPolicyIdFromContext) { - redirectToPath = [ - PLUGIN_ID, - { - path: `#${ - pagePathGetters.policy_details({ - policyId: agentPolicyIdFromContext, - })[1] - }`, - }, - ]; - } else { - redirectToPath = [ - INTEGRATIONS_PLUGIN_ID, - { - path: currentPath, - }, - ]; - } - - const redirectBackRouteState: CreatePackagePolicyRouteState = { - onSaveNavigateTo: redirectToPath, - onCancelNavigateTo: redirectToPath, - onCancelUrl: currentPath, - }; - services.application.navigateToApp(PLUGIN_ID, { // Necessary because of Fleet's HashRouter. Can be changed when // https://github.com/elastic/kibana/issues/96134 is resolved path: `#${path}`, - state: redirectBackRouteState, }); }, - [ - history, - hash, - pathname, - search, - pkgkey, - integration, - services.application, - agentPolicyIdFromContext, - ] + [pkgkey, integration, services.application, agentPolicyIdFromContext] ); const headerRightContent = useMemo( From f89dc9cc31aa139f47d83133bdc10145ab7c0468 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 28 Jun 2021 14:16:08 +0200 Subject: [PATCH 004/227] sanitize drilldown (#103299) --- .../application/components/vis_types/table/vis.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js index faf6fef0aa5494..8f19644132d3fa 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js @@ -8,6 +8,7 @@ import _, { isArray, last, get } from 'lodash'; import React, { Component } from 'react'; +import { parse as parseUrl } from 'url'; import PropTypes from 'prop-types'; import { RedirectAppLinks } from '../../../../../../kibana_react/public'; import { createTickFormatter } from '../../lib/tick_formatter'; @@ -33,6 +34,14 @@ function getColor(rules, colorKey, value) { return color; } +function sanitizeUrl(url) { + // eslint-disable-next-line no-script-url + if (parseUrl(url).protocol === 'javascript:') { + return ''; + } + return url; +} + class TableVis extends Component { constructor(props) { super(props); @@ -52,7 +61,7 @@ class TableVis extends Component { let rowDisplay = model.pivot_type === 'date' ? this.dateFormatter.convert(row.key) : row.key; if (model.drilldown_url) { const url = replaceVars(model.drilldown_url, {}, { key: row.key }); - rowDisplay = {rowDisplay}; + rowDisplay = {rowDisplay}; } const columns = row.series .filter((item) => item) From 2ff2a6fa5029671cb5cc8d68a53bdf0a63d75ad1 Mon Sep 17 00:00:00 2001 From: ymao1 Date: Mon, 28 Jun 2021 09:47:32 -0400 Subject: [PATCH 005/227] Adding tooltip to rules that are disabled due to license (#103295) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/alerts_list.test.tsx | 120 ++++++++++++++++++ .../alerts_list/components/alerts_list.tsx | 37 ++++-- 2 files changed, 148 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx index 01e63f2c608141..311166f09e466b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx @@ -69,6 +69,7 @@ const alertTypeFromApi = { defaultActionGroupId: 'default', producer: ALERTS_FEATURE_ID, minimumLicenseRequired: 'basic', + enabledInLicense: true, authorizedConsumers: { [ALERTS_FEATURE_ID]: { read: true, all: true }, }, @@ -520,3 +521,122 @@ describe('alerts_list with show only capability', () => { // TODO: check delete button }); }); + +describe('alerts_list with disabled itmes', () => { + let wrapper: ReactWrapper; + + async function setup() { + loadAlerts.mockResolvedValue({ + page: 1, + perPage: 10000, + total: 2, + data: [ + { + id: '1', + name: 'test alert', + tags: ['tag1'], + enabled: true, + alertTypeId: 'test_alert_type', + schedule: { interval: '5d' }, + actions: [], + params: { name: 'test alert type name' }, + scheduledTaskId: null, + createdBy: null, + updatedBy: null, + apiKeyOwner: null, + throttle: '1m', + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'active', + lastExecutionDate: new Date('2020-08-20T19:23:38Z'), + error: null, + }, + }, + { + id: '2', + name: 'test alert 2', + tags: ['tag1'], + enabled: true, + alertTypeId: 'test_alert_type_disabled_by_license', + schedule: { interval: '5d' }, + actions: [{ id: 'test', group: 'alert', params: { message: 'test' } }], + params: { name: 'test alert type name' }, + scheduledTaskId: null, + createdBy: null, + updatedBy: null, + apiKeyOwner: null, + throttle: '1m', + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'active', + lastExecutionDate: new Date('2020-08-20T19:23:38Z'), + error: null, + }, + }, + ], + }); + loadActionTypes.mockResolvedValue([ + { + id: 'test', + name: 'Test', + }, + { + id: 'test2', + name: 'Test2', + }, + ]); + + loadAlertTypes.mockResolvedValue([ + alertTypeFromApi, + { + id: 'test_alert_type_disabled_by_license', + name: 'some alert type that is not allowed', + actionGroups: [{ id: 'default', name: 'Default' }], + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + actionVariables: { context: [], state: [] }, + defaultActionGroupId: 'default', + producer: ALERTS_FEATURE_ID, + minimumLicenseRequired: 'platinum', + enabledInLicense: false, + authorizedConsumers: { + [ALERTS_FEATURE_ID]: { read: true, all: true }, + }, + }, + ]); + loadAllActions.mockResolvedValue([]); + + alertTypeRegistry.has.mockReturnValue(false); + // eslint-disable-next-line react-hooks/rules-of-hooks + useKibanaMock().services.alertTypeRegistry = alertTypeRegistry; + + // eslint-disable-next-line react-hooks/rules-of-hooks + useKibanaMock().services.actionTypeRegistry = actionTypeRegistry; + wrapper = mountWithIntl(); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + } + + it('renders rules list with disabled indicator if disabled due to license', async () => { + await setup(); + expect(wrapper.find('EuiBasicTable')).toHaveLength(1); + expect(wrapper.find('EuiTableRow')).toHaveLength(2); + expect(wrapper.find('EuiTableRow').at(0).prop('className')).toEqual(''); + expect(wrapper.find('EuiTableRow').at(1).prop('className')).toEqual( + 'actAlertsList__tableRowDisabled' + ); + expect(wrapper.find('EuiIconTip[data-test-subj="ruleDisabledByLicenseTooltip"]').length).toBe( + 1 + ); + expect( + wrapper.find('EuiIconTip[data-test-subj="ruleDisabledByLicenseTooltip"]').props().type + ).toEqual('questionInCircle'); + expect( + wrapper.find('EuiIconTip[data-test-subj="ruleDisabledByLicenseTooltip"]').props().content + ).toEqual('This rule type requires a Platinum license.'); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx index 1fb688c4dd6bf4..1c1633ff4a72f4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx @@ -18,6 +18,7 @@ import { EuiFieldSearch, EuiFlexGroup, EuiFlexItem, + EuiIconTip, EuiSpacer, EuiLink, EuiEmptyPrompt, @@ -63,6 +64,7 @@ import { DEFAULT_HIDDEN_ACTION_TYPES } from '../../../../common/constants'; import './alerts_list.scss'; import { CenterJustifiedSpinner } from '../../../components/center_justified_spinner'; import { ManageLicenseModal } from './manage_license_modal'; +import { checkAlertTypeEnabled } from '../../../lib/check_alert_type_enabled'; const ENTER_KEY = 13; @@ -318,15 +320,32 @@ export const AlertsList: React.FunctionComponent = () => { width: '35%', 'data-test-subj': 'alertsTableCell-name', render: (name: string, alert: AlertTableItem) => { - return ( - { - history.push(routeToRuleDetails.replace(`:ruleId`, alert.id)); - }} - > - {name} - + const ruleType = alertTypesState.data.get(alert.alertTypeId); + const checkEnabledResult = checkAlertTypeEnabled(ruleType); + const link = ( + <> + { + history.push(routeToRuleDetails.replace(`:ruleId`, alert.id)); + }} + > + {name} + + + ); + return checkEnabledResult.isEnabled ? ( + link + ) : ( + <> + {link} + + ); }, }, From 4f45535c90bdf2f273e9def0b9d0cf2efcf8fa39 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 28 Jun 2021 15:55:53 +0200 Subject: [PATCH 006/227] [Exploratory view] Update types names (#103214) --- .../apm/service_latency_config.ts | 53 ------ .../configurations/constants/constants.ts | 2 + .../configurations/constants/url_constants.ts | 1 + .../configurations/lens_attributes.test.ts | 57 +++++-- .../configurations/lens_attributes.ts | 154 +++++++++--------- .../metrics/cpu_usage_config.ts | 38 ----- .../metrics/memory_usage_config.ts | 38 ----- .../metrics/network_activity_config.ts | 37 ----- .../mobile/device_distribution_config.ts | 17 +- .../mobile/distribution_config.ts | 55 +++---- .../mobile/kpi_over_time_config.ts | 77 ++++----- .../rum/core_web_vitals_config.ts | 127 +++++++-------- .../rum/data_distribution_config.ts | 48 ++---- .../rum/kpi_over_time_config.ts | 58 +++---- .../synthetics/data_distribution_config.ts | 34 ++-- .../synthetics/kpi_over_time_config.ts | 53 +++--- .../test_data/sample_attribute_kpi.ts | 71 ++++++++ .../exploratory_view/configurations/utils.ts | 2 + .../hooks/use_lens_attributes.ts | 26 +-- .../hooks/use_series_storage.tsx | 4 +- .../columns/report_breakdowns.test.tsx | 6 +- .../columns/report_breakdowns.tsx | 10 +- .../columns/report_definition_col.test.tsx | 8 +- .../columns/report_definition_col.tsx | 56 ++++--- .../columns/report_definition_field.tsx | 16 +- .../columns/report_filters.test.tsx | 2 +- .../series_builder/columns/report_filters.tsx | 14 +- .../columns/report_types_col.test.tsx | 2 +- .../columns/report_types_col.tsx | 12 +- ...rt_field.tsx => report_metric_options.tsx} | 18 +- .../series_builder/series_builder.tsx | 17 +- .../series_editor/chart_edit_options.tsx | 12 +- .../series_editor/columns/breakdowns.test.tsx | 8 +- .../series_editor/columns/breakdowns.tsx | 10 +- .../series_editor/columns/chart_options.tsx | 13 +- .../series_editor/columns/filter_expanded.tsx | 4 +- .../series_editor/columns/series_filter.tsx | 20 +-- .../series_editor/selected_filters.test.tsx | 4 +- .../series_editor/selected_filters.tsx | 10 +- .../series_editor/series_editor.tsx | 16 +- .../shared/exploratory_view/types.ts | 33 ++-- 41 files changed, 543 insertions(+), 700 deletions(-) delete mode 100644 x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/apm/service_latency_config.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/cpu_usage_config.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/memory_usage_config.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/network_activity_config.ts create mode 100644 x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_kpi.ts rename x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/{custom_report_field.tsx => report_metric_options.tsx} (66%) diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/apm/service_latency_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/apm/service_latency_config.ts deleted file mode 100644 index 7c3abba3e5b051..00000000000000 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/apm/service_latency_config.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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 { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels } from '../constants'; -import { buildPhraseFilter } from '../utils'; -import { TRANSACTION_DURATION } from '../constants/elasticsearch_fieldnames'; - -export function getServiceLatencyLensConfig({ indexPattern }: ConfigProps): DataSeries { - return { - reportType: 'kpi-over-time', - defaultSeriesType: 'line', - seriesTypes: ['line', 'bar'], - xAxisColumn: { - sourceField: '@timestamp', - }, - yAxisColumns: [ - { - operationType: 'average', - sourceField: 'transaction.duration.us', - label: 'Latency', - }, - ], - hasOperationType: true, - defaultFilters: [ - 'user_agent.name', - 'user_agent.os.name', - 'client.geo.country_name', - 'user_agent.device.name', - ], - breakdowns: [ - 'user_agent.name', - 'user_agent.os.name', - 'client.geo.country_name', - 'user_agent.device.name', - ], - filters: buildPhraseFilter('transaction.type', 'request', indexPattern), - labels: { ...FieldLabels, [TRANSACTION_DURATION]: 'Latency' }, - reportDefinitions: [ - { - field: 'service.name', - required: true, - }, - { - field: 'service.environment', - }, - ], - }; -} diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts index 01e8d023ae96bd..52faa2dccaeac7 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts @@ -96,3 +96,5 @@ export const USE_BREAK_DOWN_COLUMN = 'USE_BREAK_DOWN_COLUMN'; export const FILTER_RECORDS = 'FILTER_RECORDS'; export const TERMS_COLUMN = 'TERMS_COLUMN'; export const OPERATION_COLUMN = 'operation'; + +export const REPORT_METRIC_FIELD = 'REPORT_METRIC_FIELD'; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/url_constants.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/url_constants.ts index b5a5169216b7ba..6f990015fbc620 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/url_constants.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/url_constants.ts @@ -13,4 +13,5 @@ export enum URL_KEYS { BREAK_DOWN = 'bd', FILTERS = 'ft', REPORT_DEFINITIONS = 'rdf', + SELECTED_METRIC = 'mt', } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts index 5189a529bda8f5..72b4bd7919c3e7 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts @@ -9,8 +9,14 @@ import { LayerConfig, LensAttributes } from './lens_attributes'; import { mockAppIndexPattern, mockIndexPattern } from '../rtl_helpers'; import { getDefaultConfigs } from './default_configs'; import { sampleAttribute } from './test_data/sample_attribute'; -import { LCP_FIELD, USER_AGENT_NAME } from './constants/elasticsearch_fieldnames'; +import { + LCP_FIELD, + TRANSACTION_DURATION, + USER_AGENT_NAME, +} from './constants/elasticsearch_fieldnames'; import { buildExistsFilter, buildPhrasesFilter } from './utils'; +import { sampleAttributeKpi } from './test_data/sample_attribute_kpi'; +import { REPORT_METRIC_FIELD } from './constants'; describe('Lens Attribute', () => { mockAppIndexPattern(); @@ -21,12 +27,12 @@ describe('Lens Attribute', () => { indexPattern: mockIndexPattern, }); - reportViewConfig.filters?.push(...buildExistsFilter('transaction.type', mockIndexPattern)); + reportViewConfig.baseFilters?.push(...buildExistsFilter('transaction.type', mockIndexPattern)); let lnsAttr: LensAttributes; const layerConfig: LayerConfig = { - reportConfig: reportViewConfig, + seriesConfig: reportViewConfig, seriesType: 'line', operationType: 'count', indexPattern: mockIndexPattern, @@ -42,6 +48,27 @@ describe('Lens Attribute', () => { expect(lnsAttr.getJSON()).toEqual(sampleAttribute); }); + it('should return expected json for kpi report type', function () { + const seriesConfigKpi = getDefaultConfigs({ + reportType: 'kpi-over-time', + dataType: 'ux', + indexPattern: mockIndexPattern, + }); + + const lnsAttrKpi = new LensAttributes([ + { + seriesConfig: seriesConfigKpi, + seriesType: 'line', + operationType: 'count', + indexPattern: mockIndexPattern, + reportDefinitions: { 'service.name': ['elastic-co'] }, + time: { from: 'now-15m', to: 'now' }, + }, + ]); + + expect(lnsAttrKpi.getJSON()).toEqual(sampleAttributeKpi); + }); + it('should return main y axis', function () { expect(lnsAttr.getMainYAxis(layerConfig)).toEqual({ dataType: 'number', @@ -72,7 +99,7 @@ describe('Lens Attribute', () => { }); it('should return expected field type for custom field with default value', function () { - expect(JSON.stringify(lnsAttr.getFieldMeta('performance.metric', layerConfig))).toEqual( + expect(JSON.stringify(lnsAttr.getFieldMeta(REPORT_METRIC_FIELD, layerConfig))).toEqual( JSON.stringify({ fieldMeta: { count: 0, @@ -92,7 +119,7 @@ describe('Lens Attribute', () => { it('should return expected field type for custom field with passed value', function () { const layerConfig1: LayerConfig = { - reportConfig: reportViewConfig, + seriesConfig: reportViewConfig, seriesType: 'line', operationType: 'count', indexPattern: mockIndexPattern, @@ -102,20 +129,20 @@ describe('Lens Attribute', () => { lnsAttr = new LensAttributes([layerConfig1]); - expect(JSON.stringify(lnsAttr.getFieldMeta('performance.metric', layerConfig1))).toEqual( + expect(JSON.stringify(lnsAttr.getFieldMeta(REPORT_METRIC_FIELD, layerConfig1))).toEqual( JSON.stringify({ fieldMeta: { count: 0, - name: LCP_FIELD, + name: TRANSACTION_DURATION, type: 'number', - esTypes: ['scaled_float'], + esTypes: ['long'], scripted: false, searchable: true, aggregatable: true, readFromDocValues: true, }, - fieldName: LCP_FIELD, - columnLabel: 'Largest contentful paint', + fieldName: TRANSACTION_DURATION, + columnLabel: 'Page load time', }) ); }); @@ -269,7 +296,7 @@ describe('Lens Attribute', () => { describe('Layer breakdowns', function () { it('should return breakdown column', function () { const layerConfig1: LayerConfig = { - reportConfig: reportViewConfig, + seriesConfig: reportViewConfig, seriesType: 'line', operationType: 'count', indexPattern: mockIndexPattern, @@ -322,7 +349,7 @@ describe('Lens Attribute', () => { 'x-axis-column-layer0': { dataType: 'number', isBucketed: true, - label: 'Largest contentful paint', + label: 'Page load time', operationType: 'range', params: { maxBars: 'auto', @@ -330,7 +357,7 @@ describe('Lens Attribute', () => { type: 'histogram', }, scale: 'interval', - sourceField: 'transaction.marks.agent.largestContentfulPaint', + sourceField: 'transaction.duration.us', }, 'y-axis-column-layer0': { dataType: 'number', @@ -353,12 +380,12 @@ describe('Lens Attribute', () => { describe('Layer Filters', function () { it('should return expected filters', function () { - reportViewConfig.filters?.push( + reportViewConfig.baseFilters?.push( ...buildPhrasesFilter('service.name', ['elastic', 'kibana'], mockIndexPattern) ); const layerConfig1: LayerConfig = { - reportConfig: reportViewConfig, + seriesConfig: reportViewConfig, seriesType: 'line', operationType: 'count', indexPattern: mockIndexPattern, diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts index 208e8d8ba43c28..eaf9c1c884a9d0 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts @@ -29,8 +29,14 @@ import { } from '../../../../../../lens/public'; import { urlFiltersToKueryString } from '../utils/stringify_kueries'; import { ExistsFilter, IndexPattern } from '../../../../../../../../src/plugins/data/common'; -import { FieldLabels, FILTER_RECORDS, USE_BREAK_DOWN_COLUMN, TERMS_COLUMN } from './constants'; -import { ColumnFilter, DataSeries, UrlFilter, URLReportDefinition } from '../types'; +import { + FieldLabels, + FILTER_RECORDS, + USE_BREAK_DOWN_COLUMN, + TERMS_COLUMN, + REPORT_METRIC_FIELD, +} from './constants'; +import { ColumnFilter, SeriesConfig, UrlFilter, URLReportDefinition } from '../types'; import { PersistableFilter } from '../../../../../../lens/common'; import { parseAbsoluteDate } from '../series_date_picker/date_range_picker'; @@ -47,54 +53,47 @@ function buildNumberColumn(sourceField: string) { }; } -export const parseCustomFieldName = ( - sourceField: string, - reportViewConfig: DataSeries, - selectedDefinitions: URLReportDefinition -) => { - let fieldName = sourceField; +export const parseCustomFieldName = (seriesConfig: SeriesConfig, selectedMetricField?: string) => { let columnType; let columnFilters; let timeScale; let columnLabel; - const rdf = reportViewConfig.reportDefinitions ?? []; - - const customField = rdf.find(({ field }) => field === fieldName); - - if (customField) { - if (selectedDefinitions[fieldName]) { - fieldName = selectedDefinitions[fieldName][0]; - if (customField?.options) { - const currField = customField?.options?.find( - ({ field, id }) => field === fieldName || id === fieldName - ); - columnType = currField?.columnType; - columnFilters = currField?.columnFilters; - timeScale = currField?.timeScale; - columnLabel = currField?.label; - } - } else if (customField.options?.[0].field || customField.options?.[0].id) { - fieldName = customField.options?.[0].field || customField.options?.[0].id; - columnType = customField.options?.[0].columnType; - columnFilters = customField.options?.[0].columnFilters; - timeScale = customField.options?.[0].timeScale; - columnLabel = customField.options?.[0].label; + const metricOptions = seriesConfig.metricOptions ?? []; + + if (selectedMetricField) { + if (metricOptions) { + const currField = metricOptions.find( + ({ field, id }) => field === selectedMetricField || id === selectedMetricField + ); + columnType = currField?.columnType; + columnFilters = currField?.columnFilters; + timeScale = currField?.timeScale; + columnLabel = currField?.label; } + } else if (metricOptions?.[0].field || metricOptions?.[0].id) { + const firstMetricOption = metricOptions?.[0]; + + selectedMetricField = firstMetricOption.field || firstMetricOption.id; + columnType = firstMetricOption.columnType; + columnFilters = firstMetricOption.columnFilters; + timeScale = firstMetricOption.timeScale; + columnLabel = firstMetricOption.label; } - return { fieldName, columnType, columnFilters, timeScale, columnLabel }; + return { fieldName: selectedMetricField!, columnType, columnFilters, timeScale, columnLabel }; }; export interface LayerConfig { filters?: UrlFilter[]; - reportConfig: DataSeries; + seriesConfig: SeriesConfig; breakdown?: string; seriesType?: SeriesType; operationType?: OperationType; reportDefinitions: URLReportDefinition; time: { to: string; from: string }; indexPattern: IndexPattern; + selectedMetricField?: string; } export class LensAttributes { @@ -105,9 +104,9 @@ export class LensAttributes { constructor(layerConfigs: LayerConfig[]) { this.layers = {}; - layerConfigs.forEach(({ reportConfig, operationType }) => { + layerConfigs.forEach(({ seriesConfig, operationType }) => { if (operationType) { - reportConfig.yAxisColumns.forEach((yAxisColumn) => { + seriesConfig.yAxisColumns.forEach((yAxisColumn) => { if (typeof yAxisColumn.operationType !== undefined) { yAxisColumn.operationType = operationType as FieldBasedIndexPatternColumn['operationType']; } @@ -150,12 +149,12 @@ export class LensAttributes { getNumberRangeColumn( sourceField: string, - reportViewConfig: DataSeries, + seriesConfig: SeriesConfig, label?: string ): RangeIndexPatternColumn { return { sourceField, - label: reportViewConfig.labels[sourceField] ?? label, + label: seriesConfig.labels[sourceField] ?? label, dataType: 'number', operationType: 'range', isBucketed: true, @@ -171,22 +170,22 @@ export class LensAttributes { getCardinalityColumn({ sourceField, label, - reportViewConfig, + seriesConfig, }: { sourceField: string; label?: string; - reportViewConfig: DataSeries; + seriesConfig: SeriesConfig; }) { return this.getNumberOperationColumn({ sourceField, operationType: 'unique_count', label, - reportViewConfig, + seriesConfig, }); } getNumberColumn({ - reportViewConfig, + seriesConfig, label, sourceField, columnType, @@ -196,7 +195,7 @@ export class LensAttributes { columnType?: string; operationType?: string; label?: string; - reportViewConfig: DataSeries; + seriesConfig: SeriesConfig; }) { if (columnType === 'operation' || operationType) { if ( @@ -209,26 +208,26 @@ export class LensAttributes { sourceField, operationType, label, - reportViewConfig, + seriesConfig, }); } if (operationType?.includes('th')) { - return this.getPercentileNumberColumn(sourceField, operationType, reportViewConfig!); + return this.getPercentileNumberColumn(sourceField, operationType, seriesConfig!); } } - return this.getNumberRangeColumn(sourceField, reportViewConfig!, label); + return this.getNumberRangeColumn(sourceField, seriesConfig!, label); } getNumberOperationColumn({ sourceField, label, - reportViewConfig, + seriesConfig, operationType, }: { sourceField: string; operationType: 'average' | 'median' | 'sum' | 'unique_count'; label?: string; - reportViewConfig: DataSeries; + seriesConfig: SeriesConfig; }): | AvgIndexPatternColumn | MedianIndexPatternColumn @@ -239,7 +238,7 @@ export class LensAttributes { label: i18n.translate('xpack.observability.expView.columns.operation.label', { defaultMessage: '{operationType} of {sourceField}', values: { - sourceField: label || reportViewConfig.labels[sourceField], + sourceField: label || seriesConfig.labels[sourceField], operationType: capitalize(operationType), }, }), @@ -250,13 +249,13 @@ export class LensAttributes { getPercentileNumberColumn( sourceField: string, percentileValue: string, - reportViewConfig: DataSeries + seriesConfig: SeriesConfig ): PercentileIndexPatternColumn { return { ...buildNumberColumn(sourceField), label: i18n.translate('xpack.observability.expView.columns.label', { defaultMessage: '{percentileValue} percentile of {sourceField}', - values: { sourceField: reportViewConfig.labels[sourceField], percentileValue }, + values: { sourceField: seriesConfig.labels[sourceField], percentileValue }, }), operationType: 'percentile', params: { percentile: Number(percentileValue.split('th')[0]) }, @@ -295,13 +294,13 @@ export class LensAttributes { } getXAxis(layerConfig: LayerConfig, layerId: string) { - const { xAxisColumn } = layerConfig.reportConfig; + const { xAxisColumn } = layerConfig.seriesConfig; if (xAxisColumn?.sourceField === USE_BREAK_DOWN_COLUMN) { return this.getBreakdownColumn({ layerId, indexPattern: layerConfig.indexPattern, - sourceField: layerConfig.breakdown || layerConfig.reportConfig.breakdowns[0], + sourceField: layerConfig.breakdown || layerConfig.seriesConfig.breakdownFields[0], }); } @@ -333,6 +332,7 @@ export class LensAttributes { timeScale, columnFilters, } = this.getFieldMeta(sourceField, layerConfig); + const { type: fieldType } = fieldMeta ?? {}; if (columnType === TERMS_COLUMN) { @@ -356,14 +356,14 @@ export class LensAttributes { columnType, operationType, label: columnLabel || label, - reportViewConfig: layerConfig.reportConfig, + seriesConfig: layerConfig.seriesConfig, }); } if (operationType === 'unique_count') { return this.getCardinalityColumn({ sourceField: fieldName, label: columnLabel || label, - reportViewConfig: layerConfig.reportConfig, + seriesConfig: layerConfig.seriesConfig, }); } @@ -378,32 +378,26 @@ export class LensAttributes { sourceField: string; layerConfig: LayerConfig; }) { - return parseCustomFieldName( - sourceField, - layerConfig.reportConfig, - layerConfig.reportDefinitions - ); + return parseCustomFieldName(layerConfig.seriesConfig, sourceField); } getFieldMeta(sourceField: string, layerConfig: LayerConfig) { - const { - fieldName, - columnType, - columnLabel, - columnFilters, - timeScale, - } = this.getCustomFieldName({ - sourceField, - layerConfig, - }); - - const fieldMeta = layerConfig.indexPattern.getFieldByName(fieldName); + if (sourceField === REPORT_METRIC_FIELD) { + const { fieldName, columnType, columnLabel, columnFilters, timeScale } = parseCustomFieldName( + layerConfig.seriesConfig, + layerConfig.selectedMetricField + ); + const fieldMeta = layerConfig.indexPattern.getFieldByName(fieldName!); + return { fieldMeta, fieldName, columnType, columnLabel, columnFilters, timeScale }; + } else { + const fieldMeta = layerConfig.indexPattern.getFieldByName(sourceField); - return { fieldMeta, fieldName, columnType, columnLabel, columnFilters, timeScale }; + return { fieldMeta, fieldName: sourceField }; + } } getMainYAxis(layerConfig: LayerConfig) { - const { sourceField, operationType, label } = layerConfig.reportConfig.yAxisColumns[0]; + const { sourceField, operationType, label } = layerConfig.seriesConfig.yAxisColumns[0]; if (sourceField === 'Records' || !sourceField) { return this.getRecordsColumn(label); @@ -420,7 +414,7 @@ export class LensAttributes { getChildYAxises(layerConfig: LayerConfig) { const lensColumns: Record = {}; - const yAxisColumns = layerConfig.reportConfig.yAxisColumns; + const yAxisColumns = layerConfig.seriesConfig.yAxisColumns; // 1 means there is only main y axis if (yAxisColumns.length === 1) { return lensColumns; @@ -460,7 +454,7 @@ export class LensAttributes { const { filters, time: { from, to }, - reportConfig: { filters: layerFilters, reportType }, + seriesConfig: { baseFilters: layerFilters, reportType }, } = layerConfig; let baseFilters = ''; if (reportType !== 'kpi-over-time' && totalLayers > 1) { @@ -522,7 +516,7 @@ export class LensAttributes { } getTimeShift(mainLayerConfig: LayerConfig, layerConfig: LayerConfig, index: number) { - if (index === 0 || mainLayerConfig.reportConfig.reportType !== 'kpi-over-time') { + if (index === 0 || mainLayerConfig.seriesConfig.reportType !== 'kpi-over-time') { return null; } @@ -603,16 +597,16 @@ export class LensAttributes { ...Object.keys(this.getChildYAxises(layerConfig)), ], layerId: `layer${index}`, - seriesType: layerConfig.seriesType || layerConfig.reportConfig.defaultSeriesType, - palette: layerConfig.reportConfig.palette, - yConfig: layerConfig.reportConfig.yConfig || [ + seriesType: layerConfig.seriesType || layerConfig.seriesConfig.defaultSeriesType, + palette: layerConfig.seriesConfig.palette, + yConfig: layerConfig.seriesConfig.yConfig || [ { forAccessor: `y-axis-column-layer${index}` }, ], xAccessor: `x-axis-column-layer${index}`, ...(layerConfig.breakdown ? { splitAccessor: `breakdown-column-layer${index}` } : {}), })), - ...(this.layerConfigs[0].reportConfig.yTitle - ? { yTitle: this.layerConfigs[0].reportConfig.yTitle } + ...(this.layerConfigs[0].seriesConfig.yTitle + ? { yTitle: this.layerConfigs[0].seriesConfig.yTitle } : {}), }; } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/cpu_usage_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/cpu_usage_config.ts deleted file mode 100644 index 2d44e122af82da..00000000000000 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/cpu_usage_config.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 { DataSeries, ConfigProps } from '../../types'; -import { FieldLabels } from '../constants'; - -export function getCPUUsageLensConfig({}: ConfigProps): DataSeries { - return { - reportType: 'kpi-over-time', - defaultSeriesType: 'line', - seriesTypes: ['line', 'bar'], - xAxisColumn: { - sourceField: '@timestamp', - }, - yAxisColumns: [ - { - operationType: 'average', - sourceField: 'system.cpu.user.pct', - label: 'CPU Usage %', - }, - ], - hasOperationType: true, - defaultFilters: [], - breakdowns: ['host.hostname'], - filters: [], - labels: { ...FieldLabels, 'host.hostname': 'Host name' }, - reportDefinitions: [ - { - field: 'agent.hostname', - required: true, - }, - ], - }; -} diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/memory_usage_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/memory_usage_config.ts deleted file mode 100644 index deaa551dce6579..00000000000000 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/memory_usage_config.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 { DataSeries, ConfigProps } from '../../types'; -import { FieldLabels } from '../constants'; - -export function getMemoryUsageLensConfig({}: ConfigProps): DataSeries { - return { - reportType: 'kpi-over-time', - defaultSeriesType: 'line', - seriesTypes: ['line', 'bar'], - xAxisColumn: { - sourceField: '@timestamp', - }, - yAxisColumns: [ - { - operationType: 'average', - sourceField: 'system.memory.used.pct', - label: 'Memory Usage %', - }, - ], - hasOperationType: true, - defaultFilters: [], - breakdowns: ['host.hostname'], - filters: [], - labels: { ...FieldLabels, 'host.hostname': 'Host name' }, - reportDefinitions: [ - { - field: 'host.hostname', - required: true, - }, - ], - }; -} diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/network_activity_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/network_activity_config.ts deleted file mode 100644 index d27cdba207d633..00000000000000 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/metrics/network_activity_config.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 { DataSeries, ConfigProps } from '../../types'; -import { FieldLabels } from '../constants'; - -export function getNetworkActivityLensConfig({}: ConfigProps): DataSeries { - return { - reportType: 'kpi-over-time', - defaultSeriesType: 'line', - seriesTypes: ['line', 'bar'], - xAxisColumn: { - sourceField: '@timestamp', - }, - yAxisColumns: [ - { - operationType: 'average', - sourceField: 'system.memory.used.pct', - }, - ], - hasOperationType: true, - defaultFilters: [], - breakdowns: ['host.hostname'], - filters: [], - labels: { ...FieldLabels, 'host.hostname': 'Host name' }, - reportDefinitions: [ - { - field: 'host.hostname', - required: true, - }, - ], - }; -} diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/device_distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/device_distribution_config.ts index e1cb5a0370fb22..98979b9922a862 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/device_distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/device_distribution_config.ts @@ -5,14 +5,14 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; +import { ConfigProps, SeriesConfig } from '../../types'; import { FieldLabels, USE_BREAK_DOWN_COLUMN } from '../constants'; import { buildPhraseFilter } from '../utils'; import { SERVICE_NAME } from '../constants/elasticsearch_fieldnames'; import { MOBILE_APP, NUMBER_OF_DEVICES } from '../constants/labels'; import { MobileFields } from './mobile_fields'; -export function getMobileDeviceDistributionConfig({ indexPattern }: ConfigProps): DataSeries { +export function getMobileDeviceDistributionConfig({ indexPattern }: ConfigProps): SeriesConfig { return { reportType: 'device-data-distribution', defaultSeriesType: 'bar', @@ -28,9 +28,9 @@ export function getMobileDeviceDistributionConfig({ indexPattern }: ConfigProps) }, ], hasOperationType: false, - defaultFilters: Object.keys(MobileFields), - breakdowns: Object.keys(MobileFields), - filters: [ + filterFields: Object.keys(MobileFields), + breakdownFields: Object.keys(MobileFields), + baseFilters: [ ...buildPhraseFilter('agent.name', 'iOS/swift', indexPattern), ...buildPhraseFilter('processor.event', 'transaction', indexPattern), ], @@ -39,11 +39,6 @@ export function getMobileDeviceDistributionConfig({ indexPattern }: ConfigProps) ...MobileFields, [SERVICE_NAME]: MOBILE_APP, }, - reportDefinitions: [ - { - field: SERVICE_NAME, - required: true, - }, - ], + definitionFields: [SERVICE_NAME], }; } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/distribution_config.ts index 62dd38e55a32a6..b9894347d96c07 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/distribution_config.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, OPERATION_COLUMN, RECORDS_FIELD } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { FieldLabels, OPERATION_COLUMN, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; import { buildPhrasesFilter } from '../utils'; import { METRIC_SYSTEM_CPU_USAGE, @@ -19,13 +19,13 @@ import { import { CPU_USAGE, MEMORY_USAGE, MOBILE_APP, RESPONSE_LATENCY } from '../constants/labels'; import { MobileFields } from './mobile_fields'; -export function getMobileKPIDistributionConfig({ indexPattern }: ConfigProps): DataSeries { +export function getMobileKPIDistributionConfig({ indexPattern }: ConfigProps): SeriesConfig { return { reportType: 'data-distribution', defaultSeriesType: 'bar', seriesTypes: ['line', 'bar'], xAxisColumn: { - sourceField: 'performance.metric', + sourceField: REPORT_METRIC_FIELD, }, yAxisColumns: [ { @@ -33,9 +33,9 @@ export function getMobileKPIDistributionConfig({ indexPattern }: ConfigProps): D }, ], hasOperationType: false, - defaultFilters: Object.keys(MobileFields), - breakdowns: Object.keys(MobileFields), - filters: [ + filterFields: Object.keys(MobileFields), + breakdownFields: Object.keys(MobileFields), + baseFilters: [ ...buildPhrasesFilter('agent.name', ['iOS/swift', 'open-telemetry/swift'], indexPattern), ], labels: { @@ -43,38 +43,25 @@ export function getMobileKPIDistributionConfig({ indexPattern }: ConfigProps): D ...MobileFields, [SERVICE_NAME]: MOBILE_APP, }, - reportDefinitions: [ + definitionFields: [SERVICE_NAME, SERVICE_ENVIRONMENT], + metricOptions: [ { - field: SERVICE_NAME, - required: true, + label: RESPONSE_LATENCY, + field: TRANSACTION_DURATION, + id: TRANSACTION_DURATION, + columnType: OPERATION_COLUMN, }, { - field: SERVICE_ENVIRONMENT, - required: true, + label: MEMORY_USAGE, + field: METRIC_SYSTEM_MEMORY_USAGE, + id: METRIC_SYSTEM_MEMORY_USAGE, + columnType: OPERATION_COLUMN, }, { - field: 'performance.metric', - custom: true, - options: [ - { - label: RESPONSE_LATENCY, - field: TRANSACTION_DURATION, - id: TRANSACTION_DURATION, - columnType: OPERATION_COLUMN, - }, - { - label: MEMORY_USAGE, - field: METRIC_SYSTEM_MEMORY_USAGE, - id: METRIC_SYSTEM_MEMORY_USAGE, - columnType: OPERATION_COLUMN, - }, - { - label: CPU_USAGE, - field: METRIC_SYSTEM_CPU_USAGE, - id: METRIC_SYSTEM_CPU_USAGE, - columnType: OPERATION_COLUMN, - }, - ], + label: CPU_USAGE, + field: METRIC_SYSTEM_CPU_USAGE, + id: METRIC_SYSTEM_CPU_USAGE, + columnType: OPERATION_COLUMN, }, ], }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/kpi_over_time_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/kpi_over_time_config.ts index 9a2e86a8f79691..945a631078a335 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/kpi_over_time_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/mobile/kpi_over_time_config.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, OPERATION_COLUMN, RECORDS_FIELD } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { FieldLabels, OPERATION_COLUMN, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; import { buildPhrasesFilter } from '../utils'; import { METRIC_SYSTEM_CPU_USAGE, @@ -24,7 +24,7 @@ import { } from '../constants/labels'; import { MobileFields } from './mobile_fields'; -export function getMobileKPIConfig({ indexPattern }: ConfigProps): DataSeries { +export function getMobileKPIConfig({ indexPattern }: ConfigProps): SeriesConfig { return { reportType: 'kpi-over-time', defaultSeriesType: 'line', @@ -34,14 +34,14 @@ export function getMobileKPIConfig({ indexPattern }: ConfigProps): DataSeries { }, yAxisColumns: [ { - sourceField: 'business.kpi', + sourceField: REPORT_METRIC_FIELD, operationType: 'median', }, ], hasOperationType: true, - defaultFilters: Object.keys(MobileFields), - breakdowns: Object.keys(MobileFields), - filters: [ + filterFields: Object.keys(MobileFields), + breakdownFields: Object.keys(MobileFields), + baseFilters: [ ...buildPhrasesFilter('agent.name', ['iOS/swift', 'open-telemetry/swift'], indexPattern), ], labels: { @@ -52,50 +52,37 @@ export function getMobileKPIConfig({ indexPattern }: ConfigProps): DataSeries { [METRIC_SYSTEM_MEMORY_USAGE]: MEMORY_USAGE, [METRIC_SYSTEM_CPU_USAGE]: CPU_USAGE, }, - reportDefinitions: [ + definitionFields: [SERVICE_NAME, SERVICE_ENVIRONMENT], + metricOptions: [ { - field: SERVICE_NAME, - required: true, + label: RESPONSE_LATENCY, + field: TRANSACTION_DURATION, + id: TRANSACTION_DURATION, + columnType: OPERATION_COLUMN, }, { - field: SERVICE_ENVIRONMENT, - required: true, - }, - { - field: 'business.kpi', - custom: true, - options: [ - { - label: RESPONSE_LATENCY, - field: TRANSACTION_DURATION, - id: TRANSACTION_DURATION, - columnType: OPERATION_COLUMN, - }, - { - field: RECORDS_FIELD, - id: RECORDS_FIELD, - label: TRANSACTIONS_PER_MINUTE, - columnFilters: [ - { - language: 'kuery', - query: `processor.event: transaction`, - }, - ], - timeScale: 'm', - }, + field: RECORDS_FIELD, + id: RECORDS_FIELD, + label: TRANSACTIONS_PER_MINUTE, + columnFilters: [ { - label: MEMORY_USAGE, - field: METRIC_SYSTEM_MEMORY_USAGE, - id: METRIC_SYSTEM_MEMORY_USAGE, - columnType: OPERATION_COLUMN, - }, - { - label: CPU_USAGE, - field: METRIC_SYSTEM_CPU_USAGE, - id: METRIC_SYSTEM_CPU_USAGE, - columnType: OPERATION_COLUMN, + language: 'kuery', + query: `processor.event: transaction`, }, ], + timeScale: 'm', + }, + { + label: MEMORY_USAGE, + field: METRIC_SYSTEM_MEMORY_USAGE, + id: METRIC_SYSTEM_MEMORY_USAGE, + columnType: OPERATION_COLUMN, + }, + { + label: CPU_USAGE, + field: METRIC_SYSTEM_CPU_USAGE, + id: METRIC_SYSTEM_CPU_USAGE, + columnType: OPERATION_COLUMN, }, ], }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/core_web_vitals_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/core_web_vitals_config.ts index e34d8b0dcfdd01..1d04a9b3895035 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/core_web_vitals_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/core_web_vitals_config.ts @@ -6,8 +6,13 @@ */ import { euiPaletteForStatus } from '@elastic/eui'; -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, FILTER_RECORDS, USE_BREAK_DOWN_COLUMN } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { + FieldLabels, + FILTER_RECORDS, + REPORT_METRIC_FIELD, + USE_BREAK_DOWN_COLUMN, +} from '../constants'; import { buildPhraseFilter } from '../utils'; import { CLIENT_GEO_COUNTRY_NAME, @@ -27,7 +32,7 @@ import { SERVICE_ENVIRONMENT, } from '../constants/elasticsearch_fieldnames'; -export function getCoreWebVitalsConfig({ indexPattern }: ConfigProps): DataSeries { +export function getCoreWebVitalsConfig({ indexPattern }: ConfigProps): SeriesConfig { const statusPallete = euiPaletteForStatus(3); return { @@ -39,20 +44,20 @@ export function getCoreWebVitalsConfig({ indexPattern }: ConfigProps): DataSerie }, yAxisColumns: [ { - sourceField: 'core.web.vitals', + sourceField: REPORT_METRIC_FIELD, label: 'Good', }, { - sourceField: 'core.web.vitals', + sourceField: REPORT_METRIC_FIELD, label: 'Average', }, { - sourceField: 'core.web.vitals', + sourceField: REPORT_METRIC_FIELD, label: 'Poor', }, ], hasOperationType: false, - defaultFilters: [ + filterFields: [ { field: TRANSACTION_URL, isNegated: false, @@ -69,7 +74,7 @@ export function getCoreWebVitalsConfig({ indexPattern }: ConfigProps): DataSerie nested: USER_AGENT_VERSION, }, ], - breakdowns: [ + breakdownFields: [ SERVICE_NAME, USER_AGENT_NAME, USER_AGENT_OS, @@ -77,79 +82,67 @@ export function getCoreWebVitalsConfig({ indexPattern }: ConfigProps): DataSerie USER_AGENT_DEVICE, URL_FULL, ], - filters: [ + baseFilters: [ ...buildPhraseFilter(TRANSACTION_TYPE, 'page-load', indexPattern), ...buildPhraseFilter(PROCESSOR_EVENT, 'transaction', indexPattern), ], labels: { ...FieldLabels, [SERVICE_NAME]: 'Web Application' }, - reportDefinitions: [ + definitionFields: [SERVICE_NAME, SERVICE_ENVIRONMENT], + metricOptions: [ { - field: SERVICE_NAME, - required: true, + id: LCP_FIELD, + label: 'Largest contentful paint', + columnType: FILTER_RECORDS, + columnFilters: [ + { + language: 'kuery', + query: `${LCP_FIELD} < 2500`, + }, + { + language: 'kuery', + query: `${LCP_FIELD} > 2500 and ${LCP_FIELD} < 4000`, + }, + { + language: 'kuery', + query: `${LCP_FIELD} > 4000`, + }, + ], }, { - field: SERVICE_ENVIRONMENT, + label: 'First input delay', + id: FID_FIELD, + columnType: FILTER_RECORDS, + columnFilters: [ + { + language: 'kuery', + query: `${FID_FIELD} < 100`, + }, + { + language: 'kuery', + query: `${FID_FIELD} > 100 and ${FID_FIELD} < 300`, + }, + { + language: 'kuery', + query: `${FID_FIELD} > 300`, + }, + ], }, { - field: 'core.web.vitals', - custom: true, - options: [ + label: 'Cumulative layout shift', + id: CLS_FIELD, + columnType: FILTER_RECORDS, + columnFilters: [ { - id: LCP_FIELD, - label: 'Largest contentful paint', - columnType: FILTER_RECORDS, - columnFilters: [ - { - language: 'kuery', - query: `${LCP_FIELD} < 2500`, - }, - { - language: 'kuery', - query: `${LCP_FIELD} > 2500 and ${LCP_FIELD} < 4000`, - }, - { - language: 'kuery', - query: `${LCP_FIELD} > 4000`, - }, - ], + language: 'kuery', + query: `${CLS_FIELD} < 0.1`, }, { - label: 'First input delay', - id: FID_FIELD, - columnType: FILTER_RECORDS, - columnFilters: [ - { - language: 'kuery', - query: `${FID_FIELD} < 100`, - }, - { - language: 'kuery', - query: `${FID_FIELD} > 100 and ${FID_FIELD} < 300`, - }, - { - language: 'kuery', - query: `${FID_FIELD} > 300`, - }, - ], + language: 'kuery', + query: `${CLS_FIELD} > 0.1 and ${CLS_FIELD} < 0.25`, }, { - label: 'Cumulative layout shift', - id: CLS_FIELD, - columnType: FILTER_RECORDS, - columnFilters: [ - { - language: 'kuery', - query: `${CLS_FIELD} < 0.1`, - }, - { - language: 'kuery', - query: `${CLS_FIELD} > 0.1 and ${CLS_FIELD} < 0.25`, - }, - { - language: 'kuery', - query: `${CLS_FIELD} > 0.25`, - }, - ], + language: 'kuery', + query: `${CLS_FIELD} > 0.25`, }, ], }, diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts index 812f1b2e4cf33b..b171edf2901d58 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, RECORDS_FIELD } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { FieldLabels, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; import { buildPhraseFilter } from '../utils'; import { CLIENT_GEO_COUNTRY_NAME, @@ -39,13 +39,13 @@ import { WEB_APPLICATION_LABEL, } from '../constants/labels'; -export function getRumDistributionConfig({ indexPattern }: ConfigProps): DataSeries { +export function getRumDistributionConfig({ indexPattern }: ConfigProps): SeriesConfig { return { reportType: 'data-distribution', defaultSeriesType: 'line', seriesTypes: [], xAxisColumn: { - sourceField: 'performance.metric', + sourceField: REPORT_METRIC_FIELD, }, yAxisColumns: [ { @@ -54,7 +54,7 @@ export function getRumDistributionConfig({ indexPattern }: ConfigProps): DataSer }, ], hasOperationType: false, - defaultFilters: [ + filterFields: [ { field: TRANSACTION_URL, isNegated: false, @@ -67,34 +67,22 @@ export function getRumDistributionConfig({ indexPattern }: ConfigProps): DataSer nested: USER_AGENT_VERSION, }, ], - breakdowns: [USER_AGENT_NAME, USER_AGENT_OS, CLIENT_GEO_COUNTRY_NAME, USER_AGENT_DEVICE], - reportDefinitions: [ + breakdownFields: [USER_AGENT_NAME, USER_AGENT_OS, CLIENT_GEO_COUNTRY_NAME, USER_AGENT_DEVICE], + definitionFields: [SERVICE_NAME, SERVICE_ENVIRONMENT], + metricOptions: [ + { label: PAGE_LOAD_TIME_LABEL, id: TRANSACTION_DURATION, field: TRANSACTION_DURATION }, { - field: SERVICE_NAME, - required: true, - }, - { - field: SERVICE_ENVIRONMENT, - }, - { - field: 'performance.metric', - custom: true, - options: [ - { label: PAGE_LOAD_TIME_LABEL, id: TRANSACTION_DURATION, field: TRANSACTION_DURATION }, - { - label: BACKEND_TIME_LABEL, - id: TRANSACTION_TIME_TO_FIRST_BYTE, - field: TRANSACTION_TIME_TO_FIRST_BYTE, - }, - { label: FCP_LABEL, id: FCP_FIELD, field: FCP_FIELD }, - { label: TBT_LABEL, id: TBT_FIELD, field: TBT_FIELD }, - { label: LCP_LABEL, id: LCP_FIELD, field: LCP_FIELD }, - { label: FID_LABEL, id: FID_FIELD, field: FID_FIELD }, - { label: CLS_LABEL, id: CLS_FIELD, field: CLS_FIELD }, - ], + label: BACKEND_TIME_LABEL, + id: TRANSACTION_TIME_TO_FIRST_BYTE, + field: TRANSACTION_TIME_TO_FIRST_BYTE, }, + { label: FCP_LABEL, id: FCP_FIELD, field: FCP_FIELD }, + { label: TBT_LABEL, id: TBT_FIELD, field: TBT_FIELD }, + { label: LCP_LABEL, id: LCP_FIELD, field: LCP_FIELD }, + { label: FID_LABEL, id: FID_FIELD, field: FID_FIELD }, + { label: CLS_LABEL, id: CLS_FIELD, field: CLS_FIELD }, ], - filters: [ + baseFilters: [ ...buildPhraseFilter(TRANSACTION_TYPE, 'page-load', indexPattern), ...buildPhraseFilter(PROCESSOR_EVENT, 'transaction', indexPattern), ], diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/kpi_over_time_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/kpi_over_time_config.ts index 12d66c55c7d00a..5899b16d12b4f0 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/kpi_over_time_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/kpi_over_time_config.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, OPERATION_COLUMN, RECORDS_FIELD } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { FieldLabels, OPERATION_COLUMN, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; import { buildPhraseFilter } from '../utils'; import { CLIENT_GEO_COUNTRY_NAME, @@ -39,7 +39,7 @@ import { WEB_APPLICATION_LABEL, } from '../constants/labels'; -export function getKPITrendsLensConfig({ indexPattern }: ConfigProps): DataSeries { +export function getKPITrendsLensConfig({ indexPattern }: ConfigProps): SeriesConfig { return { defaultSeriesType: 'bar_stacked', seriesTypes: [], @@ -49,12 +49,12 @@ export function getKPITrendsLensConfig({ indexPattern }: ConfigProps): DataSerie }, yAxisColumns: [ { - sourceField: 'business.kpi', + sourceField: REPORT_METRIC_FIELD, operationType: 'median', }, ], hasOperationType: false, - defaultFilters: [ + filterFields: [ { field: TRANSACTION_URL, isNegated: false, @@ -67,44 +67,32 @@ export function getKPITrendsLensConfig({ indexPattern }: ConfigProps): DataSerie nested: USER_AGENT_VERSION, }, ], - breakdowns: [USER_AGENT_NAME, USER_AGENT_OS, CLIENT_GEO_COUNTRY_NAME, USER_AGENT_DEVICE], - filters: [ + breakdownFields: [USER_AGENT_NAME, USER_AGENT_OS, CLIENT_GEO_COUNTRY_NAME, USER_AGENT_DEVICE], + baseFilters: [ ...buildPhraseFilter(TRANSACTION_TYPE, 'page-load', indexPattern), ...buildPhraseFilter(PROCESSOR_EVENT, 'transaction', indexPattern), ], labels: { ...FieldLabels, [SERVICE_NAME]: WEB_APPLICATION_LABEL }, - reportDefinitions: [ + definitionFields: [SERVICE_NAME, SERVICE_ENVIRONMENT], + metricOptions: [ + { field: RECORDS_FIELD, id: RECORDS_FIELD, label: PAGE_VIEWS_LABEL }, { - field: SERVICE_NAME, - required: true, + label: PAGE_LOAD_TIME_LABEL, + field: TRANSACTION_DURATION, + id: TRANSACTION_DURATION, + columnType: OPERATION_COLUMN, }, { - field: SERVICE_ENVIRONMENT, - }, - { - field: 'business.kpi', - custom: true, - options: [ - { field: RECORDS_FIELD, id: RECORDS_FIELD, label: PAGE_VIEWS_LABEL }, - { - label: PAGE_LOAD_TIME_LABEL, - field: TRANSACTION_DURATION, - id: TRANSACTION_DURATION, - columnType: OPERATION_COLUMN, - }, - { - label: BACKEND_TIME_LABEL, - field: TRANSACTION_TIME_TO_FIRST_BYTE, - id: TRANSACTION_TIME_TO_FIRST_BYTE, - columnType: OPERATION_COLUMN, - }, - { label: FCP_LABEL, field: FCP_FIELD, id: FCP_FIELD, columnType: OPERATION_COLUMN }, - { label: TBT_LABEL, field: TBT_FIELD, id: TBT_FIELD, columnType: OPERATION_COLUMN }, - { label: LCP_LABEL, field: LCP_FIELD, id: LCP_FIELD, columnType: OPERATION_COLUMN }, - { label: FID_LABEL, field: FID_FIELD, id: FID_FIELD, columnType: OPERATION_COLUMN }, - { label: CLS_LABEL, field: CLS_FIELD, id: CLS_FIELD, columnType: OPERATION_COLUMN }, - ], + label: BACKEND_TIME_LABEL, + field: TRANSACTION_TIME_TO_FIRST_BYTE, + id: TRANSACTION_TIME_TO_FIRST_BYTE, + columnType: OPERATION_COLUMN, }, + { label: FCP_LABEL, field: FCP_FIELD, id: FCP_FIELD, columnType: OPERATION_COLUMN }, + { label: TBT_LABEL, field: TBT_FIELD, id: TBT_FIELD, columnType: OPERATION_COLUMN }, + { label: LCP_LABEL, field: LCP_FIELD, id: LCP_FIELD, columnType: OPERATION_COLUMN }, + { label: FID_LABEL, field: FID_FIELD, id: FID_FIELD, columnType: OPERATION_COLUMN }, + { label: CLS_LABEL, field: CLS_FIELD, id: CLS_FIELD, columnType: OPERATION_COLUMN }, ], }; } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts index b958c0dd715286..9783f63f5b9017 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts @@ -5,18 +5,21 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, RECORDS_FIELD } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { FieldLabels, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; import { buildExistsFilter } from '../utils'; import { MONITORS_DURATION_LABEL, PINGS_LABEL } from '../constants/labels'; -export function getSyntheticsDistributionConfig({ series, indexPattern }: ConfigProps): DataSeries { +export function getSyntheticsDistributionConfig({ + series, + indexPattern, +}: ConfigProps): SeriesConfig { return { reportType: 'data-distribution', defaultSeriesType: series?.seriesType || 'line', seriesTypes: [], xAxisColumn: { - sourceField: 'performance.metric', + sourceField: REPORT_METRIC_FIELD, }, yAxisColumns: [ { @@ -25,8 +28,8 @@ export function getSyntheticsDistributionConfig({ series, indexPattern }: Config }, ], hasOperationType: false, - defaultFilters: ['monitor.type', 'observer.geo.name', 'tags'], - breakdowns: [ + filterFields: ['monitor.type', 'observer.geo.name', 'tags'], + breakdownFields: [ 'observer.geo.name', 'monitor.name', 'monitor.id', @@ -34,21 +37,10 @@ export function getSyntheticsDistributionConfig({ series, indexPattern }: Config 'tags', 'url.port', ], - filters: [...buildExistsFilter('summary.up', indexPattern)], - reportDefinitions: [ - { - field: 'monitor.name', - }, - { - field: 'url.full', - }, - { - field: 'performance.metric', - custom: true, - options: [ - { label: 'Monitor duration', id: 'monitor.duration.us', field: 'monitor.duration.us' }, - ], - }, + baseFilters: [...buildExistsFilter('summary.up', indexPattern)], + definitionFields: ['monitor.name', 'url.full'], + metricOptions: [ + { label: 'Monitor duration', id: 'monitor.duration.us', field: 'monitor.duration.us' }, ], labels: { ...FieldLabels, 'monitor.duration.us': MONITORS_DURATION_LABEL }, }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts index 3e928454363638..6bf280e93eb11a 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { ConfigProps, DataSeries } from '../../types'; -import { FieldLabels, OPERATION_COLUMN } from '../constants'; +import { ConfigProps, SeriesConfig } from '../../types'; +import { FieldLabels, OPERATION_COLUMN, REPORT_METRIC_FIELD } from '../constants'; import { buildExistsFilter } from '../utils'; import { DOWN_LABEL, MONITORS_DURATION_LABEL, UP_LABEL } from '../constants/labels'; import { MONITOR_DURATION_US } from '../constants/field_names/synthetics'; const SUMMARY_UP = 'summary.up'; const SUMMARY_DOWN = 'summary.down'; -export function getSyntheticsKPIConfig({ indexPattern }: ConfigProps): DataSeries { +export function getSyntheticsKPIConfig({ indexPattern }: ConfigProps): SeriesConfig { return { reportType: 'kpi-over-time', defaultSeriesType: 'bar_stacked', @@ -23,45 +23,34 @@ export function getSyntheticsKPIConfig({ indexPattern }: ConfigProps): DataSerie }, yAxisColumns: [ { - sourceField: 'business.kpi', + sourceField: REPORT_METRIC_FIELD, operationType: 'median', }, ], hasOperationType: false, - defaultFilters: ['observer.geo.name', 'monitor.type', 'tags'], - breakdowns: ['observer.geo.name', 'monitor.type'], - filters: [...buildExistsFilter('summary.up', indexPattern)], + filterFields: ['observer.geo.name', 'monitor.type', 'tags'], + breakdownFields: ['observer.geo.name', 'monitor.type'], + baseFilters: [...buildExistsFilter('summary.up', indexPattern)], palette: { type: 'palette', name: 'status' }, - reportDefinitions: [ + definitionFields: ['monitor.name', 'url.full'], + metricOptions: [ { - field: 'monitor.name', + label: MONITORS_DURATION_LABEL, + field: MONITOR_DURATION_US, + id: MONITOR_DURATION_US, + columnType: OPERATION_COLUMN, }, { - field: 'url.full', + field: SUMMARY_UP, + id: SUMMARY_UP, + label: UP_LABEL, + columnType: OPERATION_COLUMN, }, { - field: 'business.kpi', - custom: true, - options: [ - { - label: MONITORS_DURATION_LABEL, - field: MONITOR_DURATION_US, - id: MONITOR_DURATION_US, - columnType: OPERATION_COLUMN, - }, - { - field: SUMMARY_UP, - id: SUMMARY_UP, - label: UP_LABEL, - columnType: OPERATION_COLUMN, - }, - { - field: SUMMARY_DOWN, - id: SUMMARY_DOWN, - label: DOWN_LABEL, - columnType: OPERATION_COLUMN, - }, - ], + field: SUMMARY_DOWN, + id: SUMMARY_DOWN, + label: DOWN_LABEL, + columnType: OPERATION_COLUMN, }, ], labels: { ...FieldLabels }, diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_kpi.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_kpi.ts new file mode 100644 index 00000000000000..7f066caf66bf1a --- /dev/null +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute_kpi.ts @@ -0,0 +1,71 @@ +/* + * 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. + */ +export const sampleAttributeKpi = { + title: 'Prefilled from exploratory view app', + description: '', + visualizationType: 'lnsXY', + references: [ + { id: 'apm-*', name: 'indexpattern-datasource-current-indexpattern', type: 'index-pattern' }, + { id: 'apm-*', name: 'indexpattern-datasource-layer-layer0', type: 'index-pattern' }, + ], + state: { + datasourceStates: { + indexpattern: { + layers: { + layer0: { + columnOrder: ['x-axis-column-layer0', 'y-axis-column-layer0'], + columns: { + 'x-axis-column-layer0': { + sourceField: '@timestamp', + dataType: 'date', + isBucketed: true, + label: '@timestamp', + operationType: 'date_histogram', + params: { interval: 'auto' }, + scale: 'interval', + }, + 'y-axis-column-layer0': { + dataType: 'number', + isBucketed: false, + label: 'Page views', + operationType: 'count', + scale: 'ratio', + sourceField: 'Records', + filter: { + query: 'transaction.type: page-load and processor.event: transaction', + language: 'kuery', + }, + }, + }, + incompleteColumns: {}, + }, + }, + }, + }, + visualization: { + legend: { isVisible: true, position: 'right' }, + valueLabels: 'hide', + fittingFunction: 'Linear', + curveType: 'CURVE_MONOTONE_X', + axisTitlesVisibilitySettings: { x: true, yLeft: true, yRight: true }, + tickLabelsVisibilitySettings: { x: true, yLeft: true, yRight: true }, + gridlinesVisibilitySettings: { x: true, yLeft: true, yRight: true }, + preferredSeriesType: 'line', + layers: [ + { + accessors: ['y-axis-column-layer0'], + layerId: 'layer0', + seriesType: 'line', + yConfig: [{ forAccessor: 'y-axis-column-layer0' }], + xAccessor: 'x-axis-column-layer0', + }, + ], + }, + query: { query: '', language: 'kuery' }, + filters: [], + }, +}; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts index 9b1e7ec141ca2a..f7df2939d99098 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts @@ -21,6 +21,7 @@ export function convertToShortUrl(series: SeriesUrl) { filters, reportDefinitions, dataType, + selectedMetricField, ...restSeries } = series; @@ -32,6 +33,7 @@ export function convertToShortUrl(series: SeriesUrl) { [URL_KEYS.FILTERS]: filters, [URL_KEYS.REPORT_DEFINITIONS]: reportDefinitions, [URL_KEYS.DATA_TYPE]: dataType, + [URL_KEYS.SELECTED_METRIC]: selectedMetricField, ...restSeries, }; } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts index 11487afe28e966..d14a26d13d928d 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts @@ -12,25 +12,16 @@ import { LayerConfig, LensAttributes } from '../configurations/lens_attributes'; import { useSeriesStorage } from './use_series_storage'; import { getDefaultConfigs } from '../configurations/default_configs'; -import { DataSeries, SeriesUrl, UrlFilter } from '../types'; +import { SeriesUrl, UrlFilter } from '../types'; import { useAppIndexPatternContext } from './use_app_index_pattern'; -export const getFiltersFromDefs = ( - reportDefinitions: SeriesUrl['reportDefinitions'], - dataViewConfig: DataSeries -) => { - const rdfFilters = Object.entries(reportDefinitions ?? {}).map(([field, value]) => { +export const getFiltersFromDefs = (reportDefinitions: SeriesUrl['reportDefinitions']) => { + return Object.entries(reportDefinitions ?? {}).map(([field, value]) => { return { field, values: value, }; }) as UrlFilter[]; - - // let's filter out custom fields - return rdfFilters.filter(({ field }) => { - const rdf = dataViewConfig.reportDefinitions.find(({ field: fd }) => field === fd); - return !rdf?.custom; - }); }; export const useLensAttributes = (): TypedLensByValueInput['attributes'] | null => { @@ -49,25 +40,26 @@ export const useLensAttributes = (): TypedLensByValueInput['attributes'] | null const seriesT = allSeries[seriesIdT]; const indexPattern = indexPatterns?.[seriesT?.dataType]; if (indexPattern && seriesT.reportType && !isEmpty(seriesT.reportDefinitions)) { - const reportViewConfig = getDefaultConfigs({ + const seriesConfig = getDefaultConfigs({ reportType: seriesT.reportType, dataType: seriesT.dataType, indexPattern, }); const filters: UrlFilter[] = (seriesT.filters ?? []).concat( - getFiltersFromDefs(seriesT.reportDefinitions, reportViewConfig) + getFiltersFromDefs(seriesT.reportDefinitions) ); layerConfigs.push({ filters, indexPattern, - reportConfig: reportViewConfig, + seriesConfig, + time: seriesT.time, breakdown: seriesT.breakdown, - operationType: seriesT.operationType, seriesType: seriesT.seriesType, + operationType: seriesT.operationType, reportDefinitions: seriesT.reportDefinitions ?? {}, - time: seriesT.time, + selectedMetricField: seriesT.selectedMetricField, }); } }); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_series_storage.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_series_storage.tsx index e9ae43950d47d3..7e9b69a276d0b7 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_series_storage.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_series_storage.tsx @@ -110,7 +110,7 @@ export function useSeriesStorage() { } function convertFromShortUrl(newValue: ShortUrlSeries): SeriesUrl { - const { dt, op, st, rt, bd, ft, time, rdf, ...restSeries } = newValue; + const { dt, op, st, rt, bd, ft, time, rdf, mt, ...restSeries } = newValue; return { operationType: op, reportType: rt!, @@ -120,6 +120,7 @@ function convertFromShortUrl(newValue: ShortUrlSeries): SeriesUrl { time: time!, reportDefinitions: rdf, dataType: dt!, + selectedMetricField: mt, ...restSeries, }; } @@ -132,6 +133,7 @@ interface ShortUrlSeries { [URL_KEYS.BREAK_DOWN]?: string; [URL_KEYS.FILTERS]?: UrlFilter[]; [URL_KEYS.REPORT_DEFINITIONS]?: URLReportDefinition; + [URL_KEYS.SELECTED_METRIC]?: string; time?: { to: string; from: string; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.test.tsx index 203382afc16243..a5e5ad3900dedd 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.test.tsx @@ -21,7 +21,7 @@ describe('Series Builder ReportBreakdowns', function () { }); it('should render properly', function () { - render(); + render(); screen.getByText('Select an option: , is selected'); screen.getAllByText('Browser family'); @@ -29,7 +29,7 @@ describe('Series Builder ReportBreakdowns', function () { it('should set new series breakdown on change', function () { const { setSeries } = render( - + ); const btn = screen.getByRole('button', { @@ -51,7 +51,7 @@ describe('Series Builder ReportBreakdowns', function () { }); it('should set undefined on new series on no select breakdown', function () { const { setSeries } = render( - + ); const btn = screen.getByRole('button', { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.tsx index e95cd894df5f23..fa2d01691ce1d6 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_breakdowns.tsx @@ -7,19 +7,19 @@ import React from 'react'; import { Breakdowns } from '../../series_editor/columns/breakdowns'; -import { DataSeries } from '../../types'; +import { SeriesConfig } from '../../types'; export function ReportBreakdowns({ seriesId, - dataViewSeries, + seriesConfig, }: { - dataViewSeries: DataSeries; + seriesConfig: SeriesConfig; seriesId: string; }) { return ( ); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.test.tsx index 2e5c674b9fad88..cac1eccada311d 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.test.tsx @@ -21,7 +21,7 @@ describe('Series Builder ReportDefinitionCol', function () { mockAppIndexPattern(); const seriesId = 'test-series-id'; - const dataViewSeries = getDefaultConfigs({ + const seriesConfig = getDefaultConfigs({ reportType: 'data-distribution', indexPattern: mockIndexPattern, dataType: 'ux', @@ -41,7 +41,7 @@ describe('Series Builder ReportDefinitionCol', function () { mockUseValuesList([{ label: 'elastic-co', count: 10 }]); it('should render properly', async function () { - render(, { + render(, { initSeries, }); @@ -52,7 +52,7 @@ describe('Series Builder ReportDefinitionCol', function () { }); it('should render selected report definitions', async function () { - render(, { + render(, { initSeries, }); @@ -63,7 +63,7 @@ describe('Series Builder ReportDefinitionCol', function () { it('should be able to remove selected definition', async function () { const { setSeries } = render( - , + , { initSeries } ); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.tsx index 47962af0d4bc46..0c620abf56e8a6 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_col.tsx @@ -9,39 +9,40 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule } from '@elastic/eui'; import styled from 'styled-components'; import { useSeriesStorage } from '../../hooks/use_series_storage'; -import { CustomReportField } from '../custom_report_field'; -import { DataSeries, URLReportDefinition } from '../../types'; +import { ReportMetricOptions } from '../report_metric_options'; +import { SeriesConfig } from '../../types'; import { SeriesChartTypesSelect } from './chart_types'; import { OperationTypeSelect } from './operation_type_select'; import { DatePickerCol } from './date_picker_col'; import { parseCustomFieldName } from '../../configurations/lens_attributes'; import { ReportDefinitionField } from './report_definition_field'; -function getColumnType(dataView: DataSeries, selectedDefinition: URLReportDefinition) { - const { reportDefinitions } = dataView; - const customColumn = reportDefinitions.find((item) => item.custom); - if (customColumn?.field && selectedDefinition[customColumn?.field]) { - const { columnType } = parseCustomFieldName(customColumn.field, dataView, selectedDefinition); +function getColumnType(seriesConfig: SeriesConfig, selectedMetricField?: string) { + const { columnType } = parseCustomFieldName(seriesConfig, selectedMetricField); - return columnType; - } - return null; + return columnType; } export function ReportDefinitionCol({ - dataViewSeries, + seriesConfig, seriesId, }: { - dataViewSeries: DataSeries; + seriesConfig: SeriesConfig; seriesId: string; }) { const { getSeries, setSeries } = useSeriesStorage(); const series = getSeries(seriesId); - const { reportDefinitions: selectedReportDefinitions = {} } = series ?? {}; + const { reportDefinitions: selectedReportDefinitions = {}, selectedMetricField } = series ?? {}; - const { reportDefinitions, defaultSeriesType, hasOperationType, yAxisColumns } = dataViewSeries; + const { + definitionFields, + defaultSeriesType, + hasOperationType, + yAxisColumns, + metricOptions, + } = seriesConfig; const onChange = (field: string, value?: string[]) => { if (!value?.[0]) { @@ -58,7 +59,7 @@ export function ReportDefinitionCol({ } }; - const columnType = getColumnType(dataViewSeries, selectedReportDefinitions); + const columnType = getColumnType(seriesConfig, selectedMetricField); return ( @@ -66,20 +67,21 @@ export function ReportDefinitionCol({ - {reportDefinitions.map(({ field, custom, options }) => ( + {definitionFields.map((field) => ( - {!custom ? ( - - ) : ( - - )} + ))} + {metricOptions && ( + + + + )} {(hasOperationType || columnType === 'operation') && ( diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx index 51f4edaae93daa..61f6f85dbeaf23 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx @@ -15,16 +15,16 @@ import { ESFilter } from '../../../../../../../../../src/core/types/elasticsearc import { PersistableFilter } from '../../../../../../../lens/common'; import { ExistsFilter } from '../../../../../../../../../src/plugins/data/common/es_query/filters'; import { buildPhrasesFilter } from '../../configurations/utils'; -import { DataSeries } from '../../types'; +import { SeriesConfig } from '../../types'; interface Props { seriesId: string; field: string; - dataSeries: DataSeries; + seriesConfig: SeriesConfig; onChange: (field: string, value?: string[]) => void; } -export function ReportDefinitionField({ seriesId, field, dataSeries, onChange }: Props) { +export function ReportDefinitionField({ seriesId, field, seriesConfig, onChange }: Props) { const { getSeries } = useSeriesStorage(); const series = getSeries(seriesId); @@ -33,11 +33,11 @@ export function ReportDefinitionField({ seriesId, field, dataSeries, onChange }: const { reportDefinitions: selectedReportDefinitions = {} } = series; - const { labels, filters, reportDefinitions } = dataSeries; + const { labels, baseFilters, definitionFields } = seriesConfig; const queryFilters = useMemo(() => { const filtersN: ESFilter[] = []; - (filters ?? []).forEach((qFilter: PersistableFilter | ExistsFilter) => { + (baseFilters ?? []).forEach((qFilter: PersistableFilter | ExistsFilter) => { if (qFilter.query) { filtersN.push(qFilter.query); } @@ -48,8 +48,8 @@ export function ReportDefinitionField({ seriesId, field, dataSeries, onChange }: }); if (!isEmpty(selectedReportDefinitions)) { - reportDefinitions.forEach(({ field: fieldT, custom }) => { - if (!custom && indexPattern && selectedReportDefinitions?.[fieldT] && fieldT !== field) { + definitionFields.forEach((fieldT) => { + if (indexPattern && selectedReportDefinitions?.[fieldT] && fieldT !== field) { const values = selectedReportDefinitions?.[fieldT]; const valueFilter = buildPhrasesFilter(fieldT, values, indexPattern)[0]; filtersN.push(valueFilter.query); @@ -59,7 +59,7 @@ export function ReportDefinitionField({ seriesId, field, dataSeries, onChange }: return filtersN; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(selectedReportDefinitions), JSON.stringify(filters)]); + }, [JSON.stringify(selectedReportDefinitions), JSON.stringify(baseFilters)]); return ( diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.test.tsx index f35639388aac5e..0b183b5f20c039 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.test.tsx @@ -21,7 +21,7 @@ describe('Series Builder ReportFilters', function () { }); it('should render properly', function () { - render(); + render(); screen.getByText('Add filter'); }); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.tsx index 4571ecfe252e96..d5938c5387e8f9 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_filters.tsx @@ -7,23 +7,23 @@ import React from 'react'; import { SeriesFilter } from '../../series_editor/columns/series_filter'; -import { DataSeries } from '../../types'; +import { SeriesConfig } from '../../types'; export function ReportFilters({ - dataViewSeries, + seriesConfig, seriesId, }: { - dataViewSeries: DataSeries; + seriesConfig: SeriesConfig; seriesId: string; }) { return ( ); } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.test.tsx index f7cfe06c0d9280..07048d47b2bc32 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.test.tsx @@ -38,7 +38,7 @@ describe('ReportTypesCol', function () { expect(setSeries).toHaveBeenCalledWith(seriesId, { breakdown: 'user_agent.name', dataType: 'ux', - reportDefinitions: {}, + selectedMetricField: undefined, reportType: 'kpi-over-time', time: { from: 'now-15m', to: 'now' }, }); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.tsx index 64c7b48c668b89..396f8c4f1deb39 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_types_col.tsx @@ -15,7 +15,7 @@ import { ReportViewType, SeriesUrl } from '../../types'; import { useSeriesStorage } from '../../hooks/use_series_storage'; import { DEFAULT_TIME } from '../../configurations/constants'; import { useAppIndexPatternContext } from '../../hooks/use_app_index_pattern'; -import { ReportTypeItem, SELECT_DATA_TYPE } from '../series_builder'; +import { ReportTypeItem } from '../series_builder'; interface Props { seriesId: string; @@ -30,7 +30,12 @@ export function ReportTypesCol({ seriesId, reportTypes }: Props) { const { loading, hasData } = useAppIndexPatternContext(restSeries.dataType); if (!restSeries.dataType) { - return {SELECT_DATA_TYPE}; + return ( + + ); } if (!loading && !hasData) { @@ -72,8 +77,7 @@ export function ReportTypesCol({ seriesId, reportTypes }: Props) { setSeries(seriesId, { ...restSeries, reportType, - operationType: undefined, - reportDefinitions: {}, + selectedMetricField: undefined, time: restSeries?.time ?? DEFAULT_TIME, }); } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/custom_report_field.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/report_metric_options.tsx similarity index 66% rename from x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/custom_report_field.tsx rename to x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/report_metric_options.tsx index 201df9628e1357..a2a3e34c21834a 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/custom_report_field.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/report_metric_options.tsx @@ -8,28 +8,26 @@ import React from 'react'; import { EuiSuperSelect } from '@elastic/eui'; import { useSeriesStorage } from '../hooks/use_series_storage'; -import { ReportDefinition } from '../types'; +import { SeriesConfig } from '../types'; interface Props { - field: string; seriesId: string; defaultValue?: string; - options: ReportDefinition['options']; + options: SeriesConfig['metricOptions']; } -export function CustomReportField({ field, seriesId, options: opts }: Props) { +export function ReportMetricOptions({ seriesId, options: opts }: Props) { const { getSeries, setSeries } = useSeriesStorage(); const series = getSeries(seriesId); - const { reportDefinitions: rtd = {} } = series; - const onChange = (value: string) => { - setSeries(seriesId, { ...series, reportDefinitions: { ...rtd, [field]: [value] } }); + setSeries(seriesId, { + ...series, + selectedMetricField: value, + }); }; - const { reportDefinitions } = series; - const options = opts ?? []; return ( @@ -41,7 +39,7 @@ export function CustomReportField({ field, seriesId, options: opts }: Props) { value: fd || id, inputDisplay: label, }))} - valueOfSelected={reportDefinitions?.[field]?.[0] || options?.[0].field || options?.[0].id} + valueOfSelected={series.selectedMetricField || options?.[0].field || options?.[0].id} onChange={(value) => onChange(value)} /> ); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx index e596eb6be354a5..684cf3a210a51e 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/series_builder.tsx @@ -17,7 +17,7 @@ import { EuiSwitch, } from '@elastic/eui'; import { rgba } from 'polished'; -import { AppDataType, DataSeries, ReportViewType, SeriesUrl } from '../types'; +import { AppDataType, SeriesConfig, ReportViewType, SeriesUrl } from '../types'; import { DataTypesCol } from './columns/data_types_col'; import { ReportTypesCol } from './columns/report_types_col'; import { ReportDefinitionCol } from './columns/report_definition_col'; @@ -66,7 +66,7 @@ export const ReportTypes: Record = { interface BuilderItem { id: string; series: SeriesUrl; - seriesConfig?: DataSeries; + seriesConfig?: SeriesConfig; } export function SeriesBuilder({ @@ -142,7 +142,7 @@ export function SeriesBuilder({ return loading ? ( LOADING_VIEW ) : reportType ? ( - + ) : ( SELECT_REPORT_TYPE ); @@ -159,7 +159,7 @@ export function SeriesBuilder({ field: 'id', render: (seriesId: string, { series: { reportType }, seriesConfig }: BuilderItem) => reportType && seriesConfig ? ( - + ) : null, }, { @@ -170,7 +170,7 @@ export function SeriesBuilder({ field: 'id', render: (seriesId: string, { series: { reportType }, seriesConfig }: BuilderItem) => reportType && seriesConfig ? ( - + ) : null, }, ...(multiSeries @@ -301,10 +301,3 @@ export const SELECT_REPORT_TYPE = i18n.translate( defaultMessage: 'No report type selected', } ); - -export const SELECT_DATA_TYPE = i18n.translate( - 'xpack.observability.expView.seriesBuilder.selectDataType', - { - defaultMessage: 'No data type selected', - } -); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/chart_edit_options.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/chart_edit_options.tsx index a0d2fd86482a5e..207a53e13f1adf 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/chart_edit_options.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/chart_edit_options.tsx @@ -8,22 +8,22 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { Breakdowns } from './columns/breakdowns'; -import { DataSeries } from '../types'; +import { SeriesConfig } from '../types'; import { ChartOptions } from './columns/chart_options'; interface Props { - series: DataSeries; + seriesConfig: SeriesConfig; seriesId: string; - breakdowns: string[]; + breakdownFields: string[]; } -export function ChartEditOptions({ series, seriesId, breakdowns }: Props) { +export function ChartEditOptions({ seriesConfig, seriesId, breakdownFields }: Props) { return ( - + - + ); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.test.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.test.tsx index d180bf4529c205..84568e1c5068a0 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.test.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.test.tsx @@ -23,8 +23,8 @@ describe('Breakdowns', function () { render( ); @@ -37,8 +37,8 @@ describe('Breakdowns', function () { const { setSeries } = render( , { initSeries } ); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.tsx index cf24cb31951b19..2237935d466ad8 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/breakdowns.tsx @@ -10,15 +10,15 @@ import { EuiSuperSelect } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useSeriesStorage } from '../../hooks/use_series_storage'; import { USE_BREAK_DOWN_COLUMN } from '../../configurations/constants'; -import { DataSeries } from '../../types'; +import { SeriesConfig } from '../../types'; interface Props { seriesId: string; breakdowns: string[]; - reportViewConfig: DataSeries; + seriesConfig: SeriesConfig; } -export function Breakdowns({ reportViewConfig, seriesId, breakdowns = [] }: Props) { +export function Breakdowns({ seriesConfig, seriesId, breakdowns = [] }: Props) { const { setSeries, getSeries } = useSeriesStorage(); const series = getSeries(seriesId); @@ -40,11 +40,11 @@ export function Breakdowns({ reportViewConfig, seriesId, breakdowns = [] }: Prop } }; - const hasUseBreakdownColumn = reportViewConfig.xAxisColumn.sourceField === USE_BREAK_DOWN_COLUMN; + const hasUseBreakdownColumn = seriesConfig.xAxisColumn.sourceField === USE_BREAK_DOWN_COLUMN; const items = breakdowns.map((breakdown) => ({ id: breakdown, - label: reportViewConfig.labels[breakdown], + label: seriesConfig.labels[breakdown], })); if (!hasUseBreakdownColumn) { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/chart_options.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/chart_options.tsx index 08664ac75eb8da..f2a6377fd9b71c 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/chart_options.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/chart_options.tsx @@ -7,22 +7,25 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { DataSeries } from '../../types'; +import { SeriesConfig } from '../../types'; import { OperationTypeSelect } from '../../series_builder/columns/operation_type_select'; import { SeriesChartTypesSelect } from '../../series_builder/columns/chart_types'; interface Props { - series: DataSeries; + seriesConfig: SeriesConfig; seriesId: string; } -export function ChartOptions({ series, seriesId }: Props) { +export function ChartOptions({ seriesConfig, seriesId }: Props) { return ( - + - {series.hasOperationType && ( + {seriesConfig.hasOperationType && ( diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/filter_expanded.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/filter_expanded.tsx index 0f0cec0fbfcffd..6f9d8efdc0681e 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/filter_expanded.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/filter_expanded.tsx @@ -14,7 +14,7 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/api/types'; import { map } from 'lodash'; import { useAppIndexPatternContext } from '../../hooks/use_app_index_pattern'; import { useSeriesStorage } from '../../hooks/use_series_storage'; -import { DataSeries, UrlFilter } from '../../types'; +import { SeriesConfig, UrlFilter } from '../../types'; import { FilterValueButton } from './filter_value_btn'; import { useValuesList } from '../../../../../hooks/use_values_list'; import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; @@ -29,7 +29,7 @@ interface Props { isNegated?: boolean; goBack: () => void; nestedField?: string; - filters: DataSeries['filters']; + filters: SeriesConfig['baseFilters']; } export function FilterExpanded({ diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/series_filter.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/series_filter.tsx index b7e20b341b5720..02144c6929b38e 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/series_filter.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/columns/series_filter.tsx @@ -16,16 +16,16 @@ import { EuiFlexGroup, } from '@elastic/eui'; import { FilterExpanded } from './filter_expanded'; -import { DataSeries } from '../../types'; +import { SeriesConfig } from '../../types'; import { FieldLabels } from '../../configurations/constants/constants'; import { SelectedFilters } from '../selected_filters'; import { useSeriesStorage } from '../../hooks/use_series_storage'; interface Props { seriesId: string; - defaultFilters: DataSeries['defaultFilters']; - filters: DataSeries['filters']; - series: DataSeries; + filterFields: SeriesConfig['filterFields']; + baseFilters: SeriesConfig['baseFilters']; + seriesConfig: SeriesConfig; isNew?: boolean; labels?: Record; } @@ -38,18 +38,18 @@ export interface Field { } export function SeriesFilter({ - series, + seriesConfig, isNew, seriesId, - defaultFilters = [], - filters, + filterFields = [], + baseFilters, labels, }: Props) { const [isPopoverVisible, setIsPopoverVisible] = useState(false); const [selectedField, setSelectedField] = useState(); - const options: Field[] = defaultFilters.map((field) => { + const options: Field[] = filterFields.map((field) => { if (typeof field === 'string') { return { label: labels?.[field] ?? FieldLabels[field], field }; } @@ -111,7 +111,7 @@ export function SeriesFilter({ goBack={() => { setSelectedField(undefined); }} - filters={filters} + filters={baseFilters} /> ) : null; @@ -122,7 +122,7 @@ export function SeriesFilter({ return ( - + , { initSeries }); + render(, { + initSeries, + }); await waitFor(() => { screen.getByText('Chrome'); diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/selected_filters.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/selected_filters.tsx index 33496e617a3a67..5d2ce6ba849516 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/selected_filters.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/selected_filters.tsx @@ -9,28 +9,28 @@ import React, { Fragment } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { useSeriesStorage } from '../hooks/use_series_storage'; import { FilterLabel } from '../components/filter_label'; -import { DataSeries, UrlFilter } from '../types'; +import { SeriesConfig, UrlFilter } from '../types'; import { useAppIndexPatternContext } from '../hooks/use_app_index_pattern'; import { useSeriesFilters } from '../hooks/use_series_filters'; import { getFiltersFromDefs } from '../hooks/use_lens_attributes'; interface Props { seriesId: string; - series: DataSeries; + seriesConfig: SeriesConfig; isNew?: boolean; } -export function SelectedFilters({ seriesId, isNew, series: dataSeries }: Props) { +export function SelectedFilters({ seriesId, isNew, seriesConfig }: Props) { const { getSeries } = useSeriesStorage(); const series = getSeries(seriesId); const { reportDefinitions = {} } = series; - const { labels } = dataSeries; + const { labels } = seriesConfig; const filters: UrlFilter[] = series.filters ?? []; - let definitionFilters: UrlFilter[] = getFiltersFromDefs(reportDefinitions, dataSeries); + let definitionFilters: UrlFilter[] = getFiltersFromDefs(reportDefinitions); // we don't want to display report definition filters in new series view if (isNew) { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/series_editor.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/series_editor.tsx index bcceeb204a31e7..c3cc8484d17513 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/series_editor.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_editor/series_editor.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { EuiBasicTable, EuiIcon, EuiSpacer, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { SeriesFilter } from './columns/series_filter'; -import { DataSeries } from '../types'; +import { SeriesConfig } from '../types'; import { NEW_SERIES_KEY, useSeriesStorage } from '../hooks/use_series_storage'; import { getDefaultConfigs } from '../configurations/default_configs'; import { DatePickerCol } from './columns/date_picker_col'; @@ -19,7 +19,7 @@ import { SeriesActions } from './columns/series_actions'; import { ChartEditOptions } from './chart_edit_options'; interface EditItem { - seriesConfig: DataSeries; + seriesConfig: SeriesConfig; id: string; } @@ -48,10 +48,10 @@ export function SeriesEditor() { width: '15%', render: (seriesId: string, { seriesConfig, id }: EditItem) => ( ), }, @@ -64,8 +64,8 @@ export function SeriesEditor() { render: (seriesId: string, { seriesConfig, id }: EditItem) => ( ), }, @@ -123,7 +123,7 @@ export function SeriesEditor() { rowHeader="firstName" columns={columns} noItemsMessage={i18n.translate('xpack.observability.expView.seriesEditor.seriesNotFound', { - defaultMessage: 'No series found, please add a series.', + defaultMessage: 'No series found. Please add a series.', })} cellProps={{ style: { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts index e8fccc5baab341..ad7c654c9a168d 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts @@ -37,31 +37,27 @@ export interface ColumnFilter { query: string; } -export interface ReportDefinition { - field: string; - required?: boolean; - custom?: boolean; - options?: Array<{ - id: string; - field?: string; - label: string; - description?: string; - columnType?: 'range' | 'operation' | 'FILTER_RECORDS' | 'TERMS_COLUMN'; - columnFilters?: ColumnFilter[]; - timeScale?: string; - }>; +export interface MetricOption { + id: string; + field?: string; + label: string; + description?: string; + columnType?: 'range' | 'operation' | 'FILTER_RECORDS' | 'TERMS_COLUMN'; + columnFilters?: ColumnFilter[]; + timeScale?: string; } -export interface DataSeries { +export interface SeriesConfig { reportType: ReportViewType; xAxisColumn: Partial | Partial; yAxisColumns: Array>; - breakdowns: string[]; + breakdownFields: string[]; defaultSeriesType: SeriesType; - defaultFilters: Array; + filterFields: Array; seriesTypes: SeriesType[]; - filters?: PersistableFilter[] | ExistsFilter[]; - reportDefinitions: ReportDefinition[]; + baseFilters?: PersistableFilter[] | ExistsFilter[]; + definitionFields: string[]; + metricOptions?: MetricOption[]; labels: Record; hasOperationType: boolean; palette?: PaletteOutput; @@ -83,6 +79,7 @@ export interface SeriesUrl { operationType?: OperationType; dataType: AppDataType; reportDefinitions?: URLReportDefinition; + selectedMetricField?: string; isNew?: boolean; } From 6ba26db8d32c28750695632b8b2e275e566cfbeb Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 28 Jun 2021 16:24:13 +0200 Subject: [PATCH 007/227] Add warning toast when server.publicBaseUrl not configured correctly (#85344) --- ...-plugin-core-public.doclinksstart.links.md | 1 + ...kibana-plugin-core-public.doclinksstart.md | 2 +- src/core/public/core_app/core_app.ts | 14 ++- src/core/public/core_app/errors/index.ts | 1 + .../core_app/errors/public_base_url.test.tsx | 114 ++++++++++++++++++ .../core_app/errors/public_base_url.tsx | 88 ++++++++++++++ src/core/public/core_system.ts | 2 +- .../public/doc_links/doc_links_service.ts | 2 + src/core/public/http/http_service.mock.ts | 7 +- src/core/public/public.api.md | 1 + 10 files changed, 225 insertions(+), 7 deletions(-) create mode 100644 src/core/public/core_app/errors/public_base_url.test.tsx create mode 100644 src/core/public/core_app/errors/public_base_url.tsx diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md index b10ad949c49443..63d791db452d04 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md @@ -8,6 +8,7 @@ ```typescript readonly links: { + readonly settings: string; readonly canvas: { readonly guide: string; }; diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md index c020f57faa8825..947eece498130e 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md @@ -17,5 +17,5 @@ export interface DocLinksStart | --- | --- | --- | | [DOC\_LINK\_VERSION](./kibana-plugin-core-public.doclinksstart.doc_link_version.md) | string | | | [ELASTIC\_WEBSITE\_URL](./kibana-plugin-core-public.doclinksstart.elastic_website_url.md) | string | | -| [links](./kibana-plugin-core-public.doclinksstart.links.md) | {
readonly canvas: {
readonly guide: string;
};
readonly dashboard: {
readonly guide: string;
readonly drilldowns: string;
readonly drilldownsTriggerPicker: string;
readonly urlDrilldownTemplateSyntax: string;
readonly urlDrilldownVariables: string;
};
readonly discover: Record<string, string>;
readonly filebeat: {
readonly base: string;
readonly installation: string;
readonly configuration: string;
readonly elasticsearchOutput: string;
readonly elasticsearchModule: string;
readonly startup: string;
readonly exportedFields: string;
};
readonly auditbeat: {
readonly base: string;
};
readonly metricbeat: {
readonly base: string;
readonly configure: string;
readonly httpEndpoint: string;
readonly install: string;
readonly start: string;
};
readonly enterpriseSearch: {
readonly base: string;
readonly appSearchBase: string;
readonly workplaceSearchBase: string;
};
readonly heartbeat: {
readonly base: string;
};
readonly logstash: {
readonly base: string;
};
readonly functionbeat: {
readonly base: string;
};
readonly winlogbeat: {
readonly base: string;
};
readonly aggs: {
readonly composite: string;
readonly composite_missing_bucket: string;
readonly date_histogram: string;
readonly date_range: string;
readonly date_format_pattern: string;
readonly filter: string;
readonly filters: string;
readonly geohash_grid: string;
readonly histogram: string;
readonly ip_range: string;
readonly range: string;
readonly significant_terms: string;
readonly terms: string;
readonly avg: string;
readonly avg_bucket: string;
readonly max_bucket: string;
readonly min_bucket: string;
readonly sum_bucket: string;
readonly cardinality: string;
readonly count: string;
readonly cumulative_sum: string;
readonly derivative: string;
readonly geo_bounds: string;
readonly geo_centroid: string;
readonly max: string;
readonly median: string;
readonly min: string;
readonly moving_avg: string;
readonly percentile_ranks: string;
readonly serial_diff: string;
readonly std_dev: string;
readonly sum: string;
readonly top_hits: string;
};
readonly runtimeFields: {
readonly overview: string;
readonly mapping: string;
};
readonly scriptedFields: {
readonly scriptFields: string;
readonly scriptAggs: string;
readonly painless: string;
readonly painlessApi: string;
readonly painlessLangSpec: string;
readonly painlessSyntax: string;
readonly painlessWalkthrough: string;
readonly luceneExpressions: string;
};
readonly search: {
readonly sessions: string;
readonly sessionLimits: string;
};
readonly indexPatterns: {
readonly introduction: string;
readonly fieldFormattersNumber: string;
readonly fieldFormattersString: string;
readonly runtimeFields: string;
};
readonly addData: string;
readonly kibana: string;
readonly upgradeAssistant: string;
readonly elasticsearch: Record<string, string>;
readonly siem: {
readonly guide: string;
readonly gettingStarted: string;
};
readonly query: {
readonly eql: string;
readonly kueryQuerySyntax: string;
readonly luceneQuerySyntax: string;
readonly percolate: string;
readonly queryDsl: string;
};
readonly date: {
readonly dateMath: string;
readonly dateMathIndexNames: string;
};
readonly management: Record<string, string>;
readonly ml: Record<string, string>;
readonly transforms: Record<string, string>;
readonly visualize: Record<string, string>;
readonly apis: Readonly<{
bulkIndexAlias: string;
byteSizeUnits: string;
createAutoFollowPattern: string;
createFollower: string;
createIndex: string;
createSnapshotLifecyclePolicy: string;
createRoleMapping: string;
createRoleMappingTemplates: string;
createRollupJobsRequest: string;
createApiKey: string;
createPipeline: string;
createTransformRequest: string;
cronExpressions: string;
executeWatchActionModes: string;
indexExists: string;
openIndex: string;
putComponentTemplate: string;
painlessExecute: string;
painlessExecuteAPIContexts: string;
putComponentTemplateMetadata: string;
putSnapshotLifecyclePolicy: string;
putIndexTemplateV1: string;
putWatch: string;
simulatePipeline: string;
timeUnits: string;
updateTransform: string;
}>;
readonly observability: Record<string, string>;
readonly alerting: Record<string, string>;
readonly maps: Record<string, string>;
readonly monitoring: Record<string, string>;
readonly security: Readonly<{
apiKeyServiceSettings: string;
clusterPrivileges: string;
elasticsearchSettings: string;
elasticsearchEnableSecurity: string;
indicesPrivileges: string;
kibanaTLS: string;
kibanaPrivileges: string;
mappingRoles: string;
mappingRolesFieldRules: string;
runAsPrivilege: string;
}>;
readonly watcher: Record<string, string>;
readonly ccs: Record<string, string>;
readonly plugins: Record<string, string>;
readonly snapshotRestore: Record<string, string>;
readonly ingest: Record<string, string>;
} | | +| [links](./kibana-plugin-core-public.doclinksstart.links.md) | {
readonly settings: string;
readonly canvas: {
readonly guide: string;
};
readonly dashboard: {
readonly guide: string;
readonly drilldowns: string;
readonly drilldownsTriggerPicker: string;
readonly urlDrilldownTemplateSyntax: string;
readonly urlDrilldownVariables: string;
};
readonly discover: Record<string, string>;
readonly filebeat: {
readonly base: string;
readonly installation: string;
readonly configuration: string;
readonly elasticsearchOutput: string;
readonly elasticsearchModule: string;
readonly startup: string;
readonly exportedFields: string;
};
readonly auditbeat: {
readonly base: string;
};
readonly metricbeat: {
readonly base: string;
readonly configure: string;
readonly httpEndpoint: string;
readonly install: string;
readonly start: string;
};
readonly enterpriseSearch: {
readonly base: string;
readonly appSearchBase: string;
readonly workplaceSearchBase: string;
};
readonly heartbeat: {
readonly base: string;
};
readonly logstash: {
readonly base: string;
};
readonly functionbeat: {
readonly base: string;
};
readonly winlogbeat: {
readonly base: string;
};
readonly aggs: {
readonly composite: string;
readonly composite_missing_bucket: string;
readonly date_histogram: string;
readonly date_range: string;
readonly date_format_pattern: string;
readonly filter: string;
readonly filters: string;
readonly geohash_grid: string;
readonly histogram: string;
readonly ip_range: string;
readonly range: string;
readonly significant_terms: string;
readonly terms: string;
readonly avg: string;
readonly avg_bucket: string;
readonly max_bucket: string;
readonly min_bucket: string;
readonly sum_bucket: string;
readonly cardinality: string;
readonly count: string;
readonly cumulative_sum: string;
readonly derivative: string;
readonly geo_bounds: string;
readonly geo_centroid: string;
readonly max: string;
readonly median: string;
readonly min: string;
readonly moving_avg: string;
readonly percentile_ranks: string;
readonly serial_diff: string;
readonly std_dev: string;
readonly sum: string;
readonly top_hits: string;
};
readonly runtimeFields: {
readonly overview: string;
readonly mapping: string;
};
readonly scriptedFields: {
readonly scriptFields: string;
readonly scriptAggs: string;
readonly painless: string;
readonly painlessApi: string;
readonly painlessLangSpec: string;
readonly painlessSyntax: string;
readonly painlessWalkthrough: string;
readonly luceneExpressions: string;
};
readonly search: {
readonly sessions: string;
readonly sessionLimits: string;
};
readonly indexPatterns: {
readonly introduction: string;
readonly fieldFormattersNumber: string;
readonly fieldFormattersString: string;
readonly runtimeFields: string;
};
readonly addData: string;
readonly kibana: string;
readonly upgradeAssistant: string;
readonly rollupJobs: string;
readonly elasticsearch: Record<string, string>;
readonly siem: {
readonly guide: string;
readonly gettingStarted: string;
};
readonly query: {
readonly eql: string;
readonly kueryQuerySyntax: string;
readonly luceneQuerySyntax: string;
readonly percolate: string;
readonly queryDsl: string;
};
readonly date: {
readonly dateMath: string;
readonly dateMathIndexNames: string;
};
readonly management: Record<string, string>;
readonly ml: Record<string, string>;
readonly transforms: Record<string, string>;
readonly visualize: Record<string, string>;
readonly apis: Readonly<{
bulkIndexAlias: string;
byteSizeUnits: string;
createAutoFollowPattern: string;
createFollower: string;
createIndex: string;
createSnapshotLifecyclePolicy: string;
createRoleMapping: string;
createRoleMappingTemplates: string;
createRollupJobsRequest: string;
createApiKey: string;
createPipeline: string;
createTransformRequest: string;
cronExpressions: string;
executeWatchActionModes: string;
indexExists: string;
openIndex: string;
putComponentTemplate: string;
painlessExecute: string;
painlessExecuteAPIContexts: string;
putComponentTemplateMetadata: string;
putSnapshotLifecyclePolicy: string;
putIndexTemplateV1: string;
putWatch: string;
simulatePipeline: string;
timeUnits: string;
updateTransform: string;
}>;
readonly observability: Record<string, string>;
readonly alerting: Record<string, string>;
readonly maps: Record<string, string>;
readonly monitoring: Record<string, string>;
readonly security: Readonly<{
apiKeyServiceSettings: string;
clusterPrivileges: string;
elasticsearchSettings: string;
elasticsearchEnableSecurity: string;
indicesPrivileges: string;
kibanaTLS: string;
kibanaPrivileges: string;
mappingRoles: string;
mappingRolesFieldRules: string;
runAsPrivilege: string;
}>;
readonly watcher: Record<string, string>;
readonly ccs: Record<string, string>;
readonly plugins: Record<string, string>;
readonly snapshotRestore: Record<string, string>;
readonly ingest: Record<string, string>;
readonly fleet: Readonly<{
guide: string;
fleetServer: string;
fleetServerAddFleetServer: string;
settings: string;
settingsFleetServerHostSettings: string;
troubleshooting: string;
elasticAgent: string;
datastreams: string;
datastreamsNamingScheme: string;
upgradeElasticAgent: string;
upgradeElasticAgent712lower: string;
}>;
} | | diff --git a/src/core/public/core_app/core_app.ts b/src/core/public/core_app/core_app.ts index aa0223dbe08a73..00532b9150aefd 100644 --- a/src/core/public/core_app/core_app.ts +++ b/src/core/public/core_app/core_app.ts @@ -18,8 +18,13 @@ import type { CoreContext } from '../core_system'; import type { NotificationsSetup, NotificationsStart } from '../notifications'; import type { IUiSettingsClient } from '../ui_settings'; import type { InjectedMetadataSetup } from '../injected_metadata'; -import { renderApp as renderErrorApp, setupUrlOverflowDetection } from './errors'; +import { + renderApp as renderErrorApp, + setupPublicBaseUrlConfigWarning, + setupUrlOverflowDetection, +} from './errors'; import { renderApp as renderStatusApp } from './status'; +import { DocLinksStart } from '../doc_links'; interface SetupDeps { application: InternalApplicationSetup; @@ -30,6 +35,7 @@ interface SetupDeps { interface StartDeps { application: InternalApplicationStart; + docLinks: DocLinksStart; http: HttpStart; notifications: NotificationsStart; uiSettings: IUiSettingsClient; @@ -40,7 +46,7 @@ export class CoreApp { constructor(private readonly coreContext: CoreContext) {} - public setup({ http, application, injectedMetadata, notifications }: SetupDeps) { + public setup({ application, http, injectedMetadata, notifications }: SetupDeps) { application.register(this.coreContext.coreId, { id: 'error', title: 'App Error', @@ -68,7 +74,7 @@ export class CoreApp { }); } - public start({ application, http, notifications, uiSettings }: StartDeps) { + public start({ application, docLinks, http, notifications, uiSettings }: StartDeps) { if (!application.history) { return; } @@ -79,6 +85,8 @@ export class CoreApp { toasts: notifications.toasts, uiSettings, }); + + setupPublicBaseUrlConfigWarning({ docLinks, http, notifications }); } public stop() { diff --git a/src/core/public/core_app/errors/index.ts b/src/core/public/core_app/errors/index.ts index 02666103de3494..e991fa455ab313 100644 --- a/src/core/public/core_app/errors/index.ts +++ b/src/core/public/core_app/errors/index.ts @@ -8,3 +8,4 @@ export { renderApp } from './error_application'; export { setupUrlOverflowDetection, URL_MAX_LENGTH } from './url_overflow'; +export { setupPublicBaseUrlConfigWarning } from './public_base_url'; diff --git a/src/core/public/core_app/errors/public_base_url.test.tsx b/src/core/public/core_app/errors/public_base_url.test.tsx new file mode 100644 index 00000000000000..d1fb5a5093f150 --- /dev/null +++ b/src/core/public/core_app/errors/public_base_url.test.tsx @@ -0,0 +1,114 @@ +/* + * 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 { docLinksServiceMock } from '../../doc_links/doc_links_service.mock'; +import { httpServiceMock } from '../../http/http_service.mock'; +import { notificationServiceMock } from '../../notifications/notifications_service.mock'; + +import { setupPublicBaseUrlConfigWarning } from './public_base_url'; + +describe('publicBaseUrl warning', () => { + const docLinks = docLinksServiceMock.createStartContract(); + const notifications = notificationServiceMock.createStartContract(); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('does not show any toast on localhost', () => { + const http = httpServiceMock.createStartContract(); + + setupPublicBaseUrlConfigWarning({ + docLinks, + notifications, + http, + location: { + hostname: 'localhost', + } as Location, + }); + + expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + }); + + it('does not show any toast on 127.0.0.1', () => { + const http = httpServiceMock.createStartContract(); + + setupPublicBaseUrlConfigWarning({ + docLinks, + notifications, + http, + location: { + hostname: '127.0.0.1', + } as Location, + }); + + expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + }); + + it('does not show toast if configured correctly', () => { + const http = httpServiceMock.createStartContract({ publicBaseUrl: 'http://myhost.com' }); + + setupPublicBaseUrlConfigWarning({ + docLinks, + notifications, + http, + location: { + hostname: 'myhost.com', + toString() { + return 'http://myhost.com/'; + }, + } as Location, + }); + + expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + }); + + describe('config missing toast', () => { + it('adds toast if publicBaseUrl is missing', () => { + const http = httpServiceMock.createStartContract({ publicBaseUrl: undefined }); + + setupPublicBaseUrlConfigWarning({ + docLinks, + notifications, + http, + location: { + hostname: 'myhost.com', + toString() { + return 'http://myhost.com/'; + }, + } as Location, + }); + + expect(notifications.toasts.addWarning).toHaveBeenCalledWith({ + title: 'Configuration missing', + text: expect.any(Function), + }); + }); + + it('does not add toast if storage key set', () => { + const http = httpServiceMock.createStartContract({ publicBaseUrl: undefined }); + + setupPublicBaseUrlConfigWarning({ + docLinks, + notifications, + http, + location: { + hostname: 'myhost.com', + toString() { + return 'http://myhost.com/'; + }, + } as Location, + storage: { + getItem: (id: string) => 'true', + } as Storage, + }); + + expect(notifications.toasts.addWarning).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/src/core/public/core_app/errors/public_base_url.tsx b/src/core/public/core_app/errors/public_base_url.tsx new file mode 100644 index 00000000000000..263367a4cb09a0 --- /dev/null +++ b/src/core/public/core_app/errors/public_base_url.tsx @@ -0,0 +1,88 @@ +/* + * 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 { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import type { HttpStart, NotificationsStart } from '../..'; +import type { DocLinksStart } from '../../doc_links'; +import { mountReactNode } from '../../utils'; + +/** Only exported for tests */ +export const MISSING_CONFIG_STORAGE_KEY = `core.warnings.publicBaseUrlMissingDismissed`; + +interface Deps { + docLinks: DocLinksStart; + http: HttpStart; + notifications: NotificationsStart; + // Exposed for easier testing + storage?: Storage; + location?: Location; +} + +export const setupPublicBaseUrlConfigWarning = ({ + docLinks, + http, + notifications, + storage = window.localStorage, + location = window.location, +}: Deps) => { + if (location.hostname === 'localhost' || location.hostname === '127.0.0.1') { + return; + } + + const missingWarningSeen = storage.getItem(MISSING_CONFIG_STORAGE_KEY) === 'true'; + if (missingWarningSeen || http.basePath.publicBaseUrl) { + return; + } + + const toast = notifications.toasts.addWarning({ + title: i18n.translate('core.ui.publicBaseUrlWarning.configMissingTitle', { + defaultMessage: 'Configuration missing', + }), + text: mountReactNode( + <> +

+ server.publicBaseUrl, + }} + />{' '} + + + +

+ + + + { + notifications.toasts.remove(toast); + storage.setItem(MISSING_CONFIG_STORAGE_KEY, 'true'); + }} + id="mute" + > + + + + + + ), + }); +}; diff --git a/src/core/public/core_system.ts b/src/core/public/core_system.ts index 9a28bf45df9273..e5dcd8f817a0a9 100644 --- a/src/core/public/core_system.ts +++ b/src/core/public/core_system.ts @@ -202,7 +202,7 @@ export class CoreSystem { }); const deprecations = this.deprecations.start({ http }); - this.coreApp.start({ application, http, notifications, uiSettings }); + this.coreApp.start({ application, docLinks, http, notifications, uiSettings }); const core: InternalCoreStart = { application, diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 502b22a6f8e89c..43c21b37ee2980 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -29,6 +29,7 @@ export class DocLinksService { DOC_LINK_VERSION, ELASTIC_WEBSITE_URL, links: { + settings: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/settings.html`, canvas: { guide: `${KIBANA_DOCS}canvas.html`, }, @@ -426,6 +427,7 @@ export interface DocLinksStart { readonly DOC_LINK_VERSION: string; readonly ELASTIC_WEBSITE_URL: string; readonly links: { + readonly settings: string; readonly canvas: { readonly guide: string; }; diff --git a/src/core/public/http/http_service.mock.ts b/src/core/public/http/http_service.mock.ts index 61f501c844f300..fff99d84a76a68 100644 --- a/src/core/public/http/http_service.mock.ts +++ b/src/core/public/http/http_service.mock.ts @@ -18,7 +18,10 @@ export type HttpSetupMock = jest.Mocked & { anonymousPaths: jest.Mocked; }; -const createServiceMock = ({ basePath = '' } = {}): HttpSetupMock => ({ +const createServiceMock = ({ + basePath = '', + publicBaseUrl, +}: { basePath?: string; publicBaseUrl?: string } = {}): HttpSetupMock => ({ fetch: jest.fn(), get: jest.fn(), head: jest.fn(), @@ -27,7 +30,7 @@ const createServiceMock = ({ basePath = '' } = {}): HttpSetupMock => ({ patch: jest.fn(), delete: jest.fn(), options: jest.fn(), - basePath: new BasePath(basePath), + basePath: new BasePath(basePath, undefined, publicBaseUrl), anonymousPaths: { register: jest.fn(), isAnonymous: jest.fn(), diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index ca95b253f9cdbb..32897f10425d63 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -487,6 +487,7 @@ export interface DocLinksStart { readonly ELASTIC_WEBSITE_URL: string; // (undocumented) readonly links: { + readonly settings: string; readonly canvas: { readonly guide: string; }; From 648841429c716a78a7ca2e300fef2b11d7112648 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Mon, 28 Jun 2021 07:35:03 -0700 Subject: [PATCH 008/227] Update health.asciidoc --- docs/api/task-manager/health.asciidoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/api/task-manager/health.asciidoc b/docs/api/task-manager/health.asciidoc index 22006725da00c2..7418d44bbfd335 100644 --- a/docs/api/task-manager/health.asciidoc +++ b/docs/api/task-manager/health.asciidoc @@ -6,17 +6,20 @@ Retrieve the health status of the {kib} Task Manager. +[float] [[task-manager-api-health-request]] ==== Request `GET :/api/task_manager/_health` +[float] [[task-manager-api-health-codes]] ==== Response code `200`:: Indicates a successful call. +[float] [[task-manager-api-health-example]] ==== Example From 91fc3cc2b9a797e2ada23a89217214d18921b9f6 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Mon, 28 Jun 2021 10:39:23 -0400 Subject: [PATCH 009/227] [Security Solution][Endpoint] Refresh action and comments on the Case Details view when Isolation actions are created (#103160) * Expose new Prop from `CaseComponent` that exposes data refresh callbacks * Refresh case actions and comments if isolation was created successfully --- x-pack/plugins/cases/common/ui/types.ts | 17 +++++ .../public/components/case_view/index.tsx | 72 +++++++++++++++++-- .../public/containers/use_get_case.test.tsx | 13 ++++ .../cases/public/containers/use_get_case.tsx | 61 +++++++++------- .../containers/use_get_case_user_actions.tsx | 6 +- .../cases/components/case_view/index.tsx | 13 ++-- .../endpoint_host_isolation_cases_context.tsx | 36 ++++++++++ .../components/host_isolation/index.tsx | 4 ++ .../components/host_isolation/isolate.tsx | 8 ++- .../components/host_isolation/unisolate.tsx | 12 +++- .../alerts/use_host_isolation.tsx | 1 + .../side_panel/event_details/index.tsx | 11 +++ .../endpoint/routes/actions/isolation.ts | 32 +++++---- 13 files changed, 234 insertions(+), 52 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context.tsx diff --git a/x-pack/plugins/cases/common/ui/types.ts b/x-pack/plugins/cases/common/ui/types.ts index 1dbb633e32adf0..3edbd3443ffc12 100644 --- a/x-pack/plugins/cases/common/ui/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -23,6 +23,23 @@ export type StatusAllType = typeof StatusAll; export type CaseStatusWithAllStatus = CaseStatuses | StatusAllType; +/** + * The type for the `refreshRef` prop (a `React.Ref`) defined by the `CaseViewComponentProps`. + * + * @example + * const refreshRef = useRef(null); + * return + */ +export type CaseViewRefreshPropInterface = null | { + /** + * Refreshes the all of the user actions/comments in the view's timeline + * (note: this also triggers a silent `refreshCase()`) + */ + refreshUserActionsAndComments: () => Promise; + /** Refreshes the Case information only */ + refreshCase: () => Promise; +}; + export type Comment = CommentRequest & { associationType: AssociationType; id: string; diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index 9c6e9442c8f564..d5b535b8ddad12 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react'; +import React, { useCallback, useEffect, useMemo, useState, useRef, MutableRefObject } from 'react'; import styled from 'styled-components'; import { isEmpty } from 'lodash/fp'; import { @@ -16,11 +16,19 @@ import { EuiHorizontalRule, } from '@elastic/eui'; -import { CaseStatuses, CaseAttributes, CaseType, Case, CaseConnector, Ecs } from '../../../common'; +import { + CaseStatuses, + CaseAttributes, + CaseType, + Case, + CaseConnector, + Ecs, + CaseViewRefreshPropInterface, +} from '../../../common'; import { HeaderPage } from '../header_page'; import { EditableTitle } from '../header_page/editable_title'; import { TagList } from '../tag_list'; -import { useGetCase } from '../../containers/use_get_case'; +import { UseGetCase, useGetCase } from '../../containers/use_get_case'; import { UserActionTree } from '../user_action_tree'; import { UserList } from '../user_list'; import { useUpdateCase } from '../../containers/use_update_case'; @@ -42,6 +50,7 @@ import { getConnectorById } from '../utils'; import { DoesNotExist } from './does_not_exist'; const gutterTimeline = '70px'; // seems to be a timeline reference from the original file + export interface CaseViewComponentProps { allCasesNavigation: CasesNavigation; caseDetailsNavigation: CasesNavigation; @@ -54,12 +63,18 @@ export interface CaseViewComponentProps { subCaseId?: string; useFetchAlertData: (alertIds: string[]) => [boolean, Record]; userCanCrud: boolean; + /** + * A React `Ref` that Exposes data refresh callbacks. + * **NOTE**: Do not hold on to the `.current` object, as it could become stale + */ + refreshRef?: MutableRefObject; } export interface CaseViewProps extends CaseViewComponentProps { onCaseDataSuccess?: (data: Case) => void; timelineIntegration?: CasesTimelineIntegration; } + export interface OnUpdateFields { key: keyof Case; value: Case[keyof Case]; @@ -78,13 +93,14 @@ const MyEuiFlexGroup = styled(EuiFlexGroup)` const MyEuiHorizontalRule = styled(EuiHorizontalRule)` margin-left: 48px; + &.euiHorizontalRule--full { width: calc(100% - 48px); } `; export interface CaseComponentProps extends CaseViewComponentProps { - fetchCase: () => void; + fetchCase: UseGetCase['fetchCase']; caseData: Case; updateCase: (newCase: Case) => void; } @@ -105,6 +121,7 @@ export const CaseComponent = React.memo( updateCase, useFetchAlertData, userCanCrud, + refreshRef, }) => { const [initLoadingData, setInitLoadingData] = useState(true); const init = useRef(true); @@ -124,6 +141,51 @@ export const CaseComponent = React.memo( subCaseId, }); + // Set `refreshRef` if needed + useEffect(() => { + let isStale = false; + + if (refreshRef) { + refreshRef.current = { + refreshCase: async () => { + // Do nothing if component (or instance of this render cycle) is stale + if (isStale) { + return; + } + + await fetchCase(); + }, + refreshUserActionsAndComments: async () => { + // Do nothing if component (or instance of this render cycle) is stale + // -- OR -- + // it is already loading + if (isStale || isLoadingUserActions) { + return; + } + + await Promise.all([ + fetchCase(true), + fetchCaseUserActions(caseId, caseData.connector.id, subCaseId), + ]); + }, + }; + + return () => { + isStale = true; + refreshRef.current = null; + }; + } + }, [ + caseData.connector.id, + caseId, + fetchCase, + fetchCaseUserActions, + isLoadingUserActions, + refreshRef, + subCaseId, + updateCase, + ]); + // Update Fields const onUpdateField = useCallback( ({ key, value, onSuccess, onError }: OnUpdateFields) => { @@ -491,6 +553,7 @@ export const CaseView = React.memo( timelineIntegration, useFetchAlertData, userCanCrud, + refreshRef, }: CaseViewProps) => { const { data, isLoading, isError, fetchCase, updateCase } = useGetCase(caseId, subCaseId); if (isError) { @@ -528,6 +591,7 @@ export const CaseView = React.memo( updateCase={updateCase} useFetchAlertData={useFetchAlertData} userCanCrud={userCanCrud} + refreshRef={refreshRef} /> diff --git a/x-pack/plugins/cases/public/containers/use_get_case.test.tsx b/x-pack/plugins/cases/public/containers/use_get_case.test.tsx index 75d9ac74a8ccf2..c88f530709c8af 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case.test.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case.test.tsx @@ -89,6 +89,19 @@ describe('useGetCase', () => { }); }); + it('set isLoading to false when refetching case "silent"ly', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useGetCase(basicCase.id) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + result.current.fetchCase(true); + + expect(result.current.isLoading).toBe(false); + }); + }); + it('unhappy path', async () => { const spyOnGetCase = jest.spyOn(api, 'getCase'); spyOnGetCase.mockImplementation(() => { diff --git a/x-pack/plugins/cases/public/containers/use_get_case.tsx b/x-pack/plugins/cases/public/containers/use_get_case.tsx index 7b59f8e06b7afd..b9326ad057c9e6 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case.tsx @@ -19,7 +19,7 @@ interface CaseState { } type Action = - | { type: 'FETCH_INIT' } + | { type: 'FETCH_INIT'; payload: { silent: boolean } } | { type: 'FETCH_SUCCESS'; payload: Case } | { type: 'FETCH_FAILURE' } | { type: 'UPDATE_CASE'; payload: Case }; @@ -29,7 +29,10 @@ const dataFetchReducer = (state: CaseState, action: Action): CaseState => { case 'FETCH_INIT': return { ...state, - isLoading: true, + // If doing a silent fetch, then don't set `isLoading`. This helps + // with preventing screen flashing when wanting to refresh the actions + // and comments + isLoading: !action.payload?.silent, isError: false, }; case 'FETCH_SUCCESS': @@ -56,7 +59,11 @@ const dataFetchReducer = (state: CaseState, action: Action): CaseState => { }; export interface UseGetCase extends CaseState { - fetchCase: () => void; + /** + * @param [silent] When set to `true`, the `isLoading` property will not be set to `true` + * while doing the API call + */ + fetchCase: (silent?: boolean) => Promise; updateCase: (newCase: Case) => void; } @@ -74,33 +81,35 @@ export const useGetCase = (caseId: string, subCaseId?: string): UseGetCase => { dispatch({ type: 'UPDATE_CASE', payload: newCase }); }, []); - const callFetch = useCallback(async () => { - try { - isCancelledRef.current = false; - abortCtrlRef.current.abort(); - abortCtrlRef.current = new AbortController(); - dispatch({ type: 'FETCH_INIT' }); + const callFetch = useCallback( + async (silent: boolean = false) => { + try { + isCancelledRef.current = false; + abortCtrlRef.current.abort(); + abortCtrlRef.current = new AbortController(); + dispatch({ type: 'FETCH_INIT', payload: { silent } }); - const response = await (subCaseId - ? getSubCase(caseId, subCaseId, true, abortCtrlRef.current.signal) - : getCase(caseId, true, abortCtrlRef.current.signal)); + const response = await (subCaseId + ? getSubCase(caseId, subCaseId, true, abortCtrlRef.current.signal) + : getCase(caseId, true, abortCtrlRef.current.signal)); - if (!isCancelledRef.current) { - dispatch({ type: 'FETCH_SUCCESS', payload: response }); - } - } catch (error) { - if (!isCancelledRef.current) { - if (error.name !== 'AbortError') { - toasts.addError( - error.body && error.body.message ? new Error(error.body.message) : error, - { title: i18n.ERROR_TITLE } - ); + if (!isCancelledRef.current) { + dispatch({ type: 'FETCH_SUCCESS', payload: response }); + } + } catch (error) { + if (!isCancelledRef.current) { + if (error.name !== 'AbortError') { + toasts.addError( + error.body && error.body.message ? new Error(error.body.message) : error, + { title: i18n.ERROR_TITLE } + ); + } + dispatch({ type: 'FETCH_FAILURE' }); } - dispatch({ type: 'FETCH_FAILURE' }); } - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [caseId, subCaseId]); + }, + [caseId, subCaseId, toasts] + ); useEffect(() => { callFetch(); diff --git a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx index 66aa93154b318d..edafa1b9a10a9a 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx @@ -51,7 +51,11 @@ export const initialData: CaseUserActionsState = { }; export interface UseGetCaseUserActions extends CaseUserActionsState { - fetchCaseUserActions: (caseId: string, caseConnectorId: string, subCaseId?: string) => void; + fetchCaseUserActions: ( + caseId: string, + caseConnectorId: string, + subCaseId?: string + ) => Promise; } const getExternalService = (value: string): CaseExternalService | null => diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index 71bc241f65e101..dec2d409b020d7 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; import { SearchResponse } from 'elasticsearch'; import { isEmpty } from 'lodash'; @@ -19,7 +19,7 @@ import { useFormatUrl, } from '../../../common/components/link_to'; import { Ecs } from '../../../../common/ecs'; -import { Case } from '../../../../../cases/common'; +import { Case, CaseViewRefreshPropInterface } from '../../../../../cases/common'; import { TimelineId } from '../../../../common/types/timeline'; import { SecurityPageName } from '../../../app/types'; import { KibanaServices, useKibana } from '../../../common/lib/kibana'; @@ -38,6 +38,7 @@ import { SEND_ALERT_TO_TIMELINE } from './translations'; import { useInsertTimeline } from '../use_insert_timeline'; import { SpyRoute } from '../../../common/utils/route/spy_routes'; import * as timelineMarkdownPlugin from '../../../common/components/markdown_editor/plugins/timeline'; +import { CaseDetailsRefreshContext } from '../../../common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context'; interface Props { caseId: string; @@ -176,9 +177,13 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = }) ); }, [dispatch]); + + const refreshRef = useRef(null); + return ( - <> + {casesUi.getCaseView({ + refreshRef, allCasesNavigation: { href: formattedAllCasesLink, onClick: async (e) => { @@ -247,7 +252,7 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = userCanCrud, })} - + ); }); diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context.tsx new file mode 100644 index 00000000000000..8ae9d98a314298 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context.tsx @@ -0,0 +1,36 @@ +/* + * 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, { MutableRefObject, useContext } from 'react'; +import { CaseViewRefreshPropInterface } from '../../../../../../cases/common'; + +/** + * React Context that can hold the `Ref` that is created an passed to `CaseViewProps['refreshRef`]`, enabling + * child components to trigger a refresh of a case. + */ +export const CaseDetailsRefreshContext = React.createContext | null>( + null +); + +/** + * Returns the closes CaseDetails Refresh interface if any. Used in conjuction with `CaseDetailsRefreshContext` component + * + * @example + * // Higher-order component + * const refreshRef = useRef(null); + * return .... + * + * // Now, use the hook from a hild component that was rendered inside of `` + * const caseDetailsRefresh = useWithCaseDetailsRefresh(); + * ... + * if (caseDetailsRefresh) { + * caseDetailsRefresh.refreshUserActionsAndComments(); + * } + */ +export const useWithCaseDetailsRefresh = (): Readonly | undefined => { + return useContext(CaseDetailsRefreshContext)?.current; +}; diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx index ef311a7ca43b17..36443cc91f4e84 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/index.tsx @@ -20,10 +20,12 @@ export const HostIsolationPanel = React.memo( ({ details, cancelCallback, + successCallback, isolateAction, }: { details: Maybe; cancelCallback: () => void; + successCallback?: () => void; isolateAction: string; }) => { const endpointId = useMemo(() => { @@ -92,6 +94,7 @@ export const HostIsolationPanel = React.memo( cases={associatedCases} casesInfo={casesInfo} cancelCallback={cancelCallback} + successCallback={successCallback} /> ) : ( ); } diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx index b209c2f9c6e24e..75dd850c30f434 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/isolate.tsx @@ -24,12 +24,14 @@ export const IsolateHost = React.memo( cases, casesInfo, cancelCallback, + successCallback, }: { endpointId: string; hostName: string; cases: ReactNode; casesInfo: CasesFromAlertsResponse; cancelCallback: () => void; + successCallback?: () => void; }) => { const [comment, setComment] = useState(''); const [isIsolated, setIsIsolated] = useState(false); @@ -43,7 +45,11 @@ export const IsolateHost = React.memo( const confirmHostIsolation = useCallback(async () => { const hostIsolated = await isolateHost(); setIsIsolated(hostIsolated); - }, [isolateHost]); + + if (hostIsolated && successCallback) { + successCallback(); + } + }, [isolateHost, successCallback]); const backToAlertDetails = useCallback(() => cancelCallback(), [cancelCallback]); diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx index ad8e8eaddb39e3..2b810dc16eec80 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/unisolate.tsx @@ -24,12 +24,14 @@ export const UnisolateHost = React.memo( cases, casesInfo, cancelCallback, + successCallback, }: { endpointId: string; hostName: string; cases: ReactNode; casesInfo: CasesFromAlertsResponse; cancelCallback: () => void; + successCallback?: () => void; }) => { const [comment, setComment] = useState(''); const [isUnIsolated, setIsUnIsolated] = useState(false); @@ -41,9 +43,13 @@ export const UnisolateHost = React.memo( const { loading, unIsolateHost } = useHostUnisolation({ endpointId, comment, caseIds }); const confirmHostUnIsolation = useCallback(async () => { - const hostIsolated = await unIsolateHost(); - setIsUnIsolated(hostIsolated); - }, [unIsolateHost]); + const hostUnIsolated = await unIsolateHost(); + setIsUnIsolated(hostUnIsolated); + + if (hostUnIsolated && successCallback) { + successCallback(); + } + }, [successCallback, unIsolateHost]); const backToAlertDetails = useCallback(() => cancelCallback(), [cancelCallback]); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx index 12426e05ba5280..70d1d5ab5e1948 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation.tsx @@ -12,6 +12,7 @@ import { createHostIsolation } from './api'; interface HostIsolationStatus { loading: boolean; + /** Boolean return will indicate if isolation action was created successful */ isolateHost: () => Promise; } diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx index 395538610f567e..c4b19863ce7fcf 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx @@ -33,6 +33,7 @@ import { import { ALERT_DETAILS } from './translations'; import { useIsolationPrivileges } from '../../../../common/hooks/endpoint/use_isolate_privileges'; import { endpointAlertCheck } from '../../../../common/utils/endpoint_alert_check'; +import { useWithCaseDetailsRefresh } from '../../../../common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context'; const StyledEuiFlyoutBody = styled(EuiFlyoutBody)` .euiFlyoutBody__overflow { @@ -121,6 +122,15 @@ const EventDetailsPanelComponent: React.FC = ({ ); }, [showAlertDetails, isolateAction]); + const caseDetailsRefresh = useWithCaseDetailsRefresh(); + + const handleIsolationActionSuccess = useCallback(() => { + // If a case details refresh ref is defined, then refresh actions and comments + if (caseDetailsRefresh) { + caseDetailsRefresh.refreshUserActionsAndComments(); + } + }, [caseDetailsRefresh]); + if (!expandedEvent?.eventId) { return null; } @@ -139,6 +149,7 @@ const EventDetailsPanelComponent: React.FC = ({ ) : ( diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts index 50fe2ffe2cea99..785434aa17ec65 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts @@ -61,6 +61,7 @@ export const isolationRequestHandler = function ( TypeOf, SecuritySolutionRequestHandlerContext > { + // eslint-disable-next-line complexity return async (context, req, res) => { if ( (!req.body.agent_ids || req.body.agent_ids.length === 0) && @@ -100,14 +101,14 @@ export const isolationRequestHandler = function ( } agentIDs = [...new Set(agentIDs)]; // dedupe + const casesClient = await endpointContext.service.getCasesClient(req); + // convert any alert IDs into cases let caseIDs: string[] = req.body.case_ids?.slice() || []; if (req.body.alert_ids && req.body.alert_ids.length > 0) { const newIDs: string[][] = await Promise.all( req.body.alert_ids.map(async (a: string) => { - const cases: CasesByAlertId = await ( - await endpointContext.service.getCasesClient(req) - ).cases.getCasesByAlertID({ + const cases: CasesByAlertId = await casesClient.cases.getCasesByAlertID({ alertID: a, options: { owner: APP_ID }, }); @@ -167,16 +168,21 @@ export const isolationRequestHandler = function ( commentLines.push(`\n\nWith Comment:\n> ${req.body.comment}`); } - caseIDs.forEach(async (caseId) => { - (await endpointContext.service.getCasesClient(req)).attachments.add({ - caseId, - comment: { - comment: commentLines.join('\n'), - type: CommentType.user, - owner: APP_ID, - }, - }); - }); + // Update all cases with a comment + if (caseIDs.length > 0) { + await Promise.all( + caseIDs.map((caseId) => + casesClient.attachments.add({ + caseId, + comment: { + comment: commentLines.join('\n'), + type: CommentType.user, + owner: APP_ID, + }, + }) + ) + ); + } return res.ok({ body: { From 22d5c90855a9e4c23fec00b7d29ac13322eb353d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Jun 2021 15:58:41 +0100 Subject: [PATCH 010/227] chore(NA): moving @kbn/spec-to-console into bazel (#103470) * chore(NA): moving @kbn/spec-to-console into bazel * chore(NA): fix licenses --- .../monorepo-packages.asciidoc | 1 + package.json | 1 + packages/BUILD.bazel | 1 + packages/kbn-spec-to-console/BUILD.bazel | 55 +++++++++++++++++++ .../cluster_health_autocomplete.json | 0 .../__fixtures__}/cluster_health_spec.json | 0 .../kbn-spec-to-console/lib/convert.test.js | 4 +- packages/kbn-spec-to-console/package.json | 5 +- scripts/spec_to_console.js | 2 +- yarn.lock | 4 ++ 10 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 packages/kbn-spec-to-console/BUILD.bazel rename packages/kbn-spec-to-console/{test/fixtures => lib/__fixtures__}/cluster_health_autocomplete.json (100%) rename packages/kbn-spec-to-console/{test/fixtures => lib/__fixtures__}/cluster_health_spec.json (100%) diff --git a/docs/developer/getting-started/monorepo-packages.asciidoc b/docs/developer/getting-started/monorepo-packages.asciidoc index 217645b9038181..0ee4c09192896c 100644 --- a/docs/developer/getting-started/monorepo-packages.asciidoc +++ b/docs/developer/getting-started/monorepo-packages.asciidoc @@ -103,6 +103,7 @@ yarn kbn watch-bazel - @kbn/securitysolution-utils - @kbn/server-http-tools - @kbn/server-route-repository +- @kbn/spec-to-console - @kbn/std - @kbn/storybook - @kbn/telemetry-utils diff --git a/package.json b/package.json index ceb178d0685196..b589153d2af909 100644 --- a/package.json +++ b/package.json @@ -470,6 +470,7 @@ "@kbn/plugin-generator": "link:bazel-bin/packages/kbn-plugin-generator", "@kbn/plugin-helpers": "link:bazel-bin/packages/kbn-plugin-helpers", "@kbn/pm": "link:packages/kbn-pm", + "@kbn/spec-to-console": "link:bazel-bin/packages/kbn-spec-to-console", "@kbn/storybook": "link:bazel-bin/packages/kbn-storybook", "@kbn/telemetry-tools": "link:bazel-bin/packages/kbn-telemetry-tools", "@kbn/test": "link:packages/kbn-test", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 1094a2def3e70d..225a41a5fd8b69 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -48,6 +48,7 @@ filegroup( "//packages/kbn-securitysolution-hook-utils:build", "//packages/kbn-server-http-tools:build", "//packages/kbn-server-route-repository:build", + "//packages/kbn-spec-to-console:build", "//packages/kbn-std:build", "//packages/kbn-storybook:build", "//packages/kbn-telemetry-tools:build", diff --git a/packages/kbn-spec-to-console/BUILD.bazel b/packages/kbn-spec-to-console/BUILD.bazel new file mode 100644 index 00000000000000..8a083be9fce915 --- /dev/null +++ b/packages/kbn-spec-to-console/BUILD.bazel @@ -0,0 +1,55 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") + +PKG_BASE_NAME = "kbn-spec-to-console" +PKG_REQUIRE_NAME = "@kbn/spec-to-console" + +SOURCE_FILES = glob( + [ + "bin/**/*", + "lib/**/*", + "index.js" + ], + exclude = [ + "**/*.test.*", + "**/__fixtures__/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", + "README.md", +] + +DEPS = [] + +js_library( + name = PKG_BASE_NAME, + srcs = NPM_MODULE_EXTRA_FILES + [ + ":srcs", + ], + deps = DEPS, + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [ + ":%s" % PKG_BASE_NAME, + ] +) + +filegroup( + name = "build", + srcs = [ + ":npm_module", + ], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-spec-to-console/test/fixtures/cluster_health_autocomplete.json b/packages/kbn-spec-to-console/lib/__fixtures__/cluster_health_autocomplete.json similarity index 100% rename from packages/kbn-spec-to-console/test/fixtures/cluster_health_autocomplete.json rename to packages/kbn-spec-to-console/lib/__fixtures__/cluster_health_autocomplete.json diff --git a/packages/kbn-spec-to-console/test/fixtures/cluster_health_spec.json b/packages/kbn-spec-to-console/lib/__fixtures__/cluster_health_spec.json similarity index 100% rename from packages/kbn-spec-to-console/test/fixtures/cluster_health_spec.json rename to packages/kbn-spec-to-console/lib/__fixtures__/cluster_health_spec.json diff --git a/packages/kbn-spec-to-console/lib/convert.test.js b/packages/kbn-spec-to-console/lib/convert.test.js index 6d6b6ba364d386..14cb2dd7b6c04f 100644 --- a/packages/kbn-spec-to-console/lib/convert.test.js +++ b/packages/kbn-spec-to-console/lib/convert.test.js @@ -8,8 +8,8 @@ const convert = require('./convert'); -const clusterHealthSpec = require('../test/fixtures/cluster_health_spec'); -const clusterHealthAutocomplete = require('../test/fixtures/cluster_health_autocomplete'); +const clusterHealthSpec = require('./__fixtures__/cluster_health_spec'); +const clusterHealthAutocomplete = require('./__fixtures__/cluster_health_autocomplete'); test('convert', () => { expect(convert(clusterHealthSpec)).toEqual(clusterHealthAutocomplete); diff --git a/packages/kbn-spec-to-console/package.json b/packages/kbn-spec-to-console/package.json index c6cf8cf9ec46de..b4e488db7f4d95 100644 --- a/packages/kbn-spec-to-console/package.json +++ b/packages/kbn-spec-to-console/package.json @@ -1,11 +1,12 @@ { - "name": "spec-to-console", - "version": "0.0.0", + "name": "@kbn/spec-to-console", + "version": "1.0.0", "description": "ES REST spec -> Console autocomplete", "main": "index.js", "directories": { "lib": "lib" }, + "private": true, "scripts": { "format": "../../node_modules/.bin/prettier **/*.js --write" }, diff --git a/scripts/spec_to_console.js b/scripts/spec_to_console.js index cbb152f55f8fbb..37e246323a11ff 100644 --- a/scripts/spec_to_console.js +++ b/scripts/spec_to_console.js @@ -6,4 +6,4 @@ * Side Public License, v 1. */ -require('../packages/kbn-spec-to-console/bin/spec_to_console'); +require('@kbn/spec-to-console/bin/spec_to_console'); diff --git a/yarn.lock b/yarn.lock index 9d7569b6ab4f29..2ea799810e3a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2768,6 +2768,10 @@ version "0.0.0" uid "" +"@kbn/spec-to-console@link:bazel-bin/packages/kbn-spec-to-console": + version "0.0.0" + uid "" + "@kbn/std@link:bazel-bin/packages/kbn-std": version "0.0.0" uid "" From 8fa4421cac0e52302121fa57880bc2e6a2a4f791 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Mon, 28 Jun 2021 18:13:31 +0300 Subject: [PATCH 011/227] Update TSVB docs with guidelines on how to group by multiple fields (#103224) * Update TSVB FAQ section with guidelines on how to group by multiple fields * Apply text suggestion --- .../images/tsvb_group_by_multiple_fields.png | Bin 0 -> 146657 bytes docs/user/dashboard/tsvb.asciidoc | 12 ++++++++++++ 2 files changed, 12 insertions(+) create mode 100644 docs/user/dashboard/images/tsvb_group_by_multiple_fields.png diff --git a/docs/user/dashboard/images/tsvb_group_by_multiple_fields.png b/docs/user/dashboard/images/tsvb_group_by_multiple_fields.png new file mode 100644 index 0000000000000000000000000000000000000000..3f23189f7725424129a356848c170daec82d2957 GIT binary patch literal 146657 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 z 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 Q7Xd%V%`8lF4_^%bKZRKwg#Z8m literal 0 HcmV?d00001 diff --git a/docs/user/dashboard/tsvb.asciidoc b/docs/user/dashboard/tsvb.asciidoc index b69df7c7d26d68..93ee3627bd8a0c 100644 --- a/docs/user/dashboard/tsvb.asciidoc +++ b/docs/user/dashboard/tsvb.asciidoc @@ -166,3 +166,15 @@ For other types of month over month calculations, use <> o Calculating the duration between the start and end of an event is unsupported in *TSVB* because *TSVB* requires correlation between different time periods. *TSVB* requires that the duration is pre-calculated. + +[float] +===== How do I group on multiple fields? + +To group with multiple fields, create runtime fields in the index pattern you are visualizing. + +. Create a runtime field. Refer to <> for more information. ++ +[role="screenshot"] +image::images/tsvb_group_by_multiple_fields.png[Group by multiple fields] + +. Create a new TSVB visualization and group by this field. \ No newline at end of file From 43a897e640477b69c42b1fa551d855c4d2e6d5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= Date: Mon, 28 Jun 2021 17:24:26 +0200 Subject: [PATCH 012/227] [Security Solution][Endpoint] The refresh button triggers always a refresh action (#103118) * Triggers search even if the query hasn't changed * Add await on async function call * refactor, use forceSearch store flag instead of new actin type to force search * fix error when refreshing trusted apps * Fix ts-error by adding ts-ignore '{ type: "LoadingResourceState"; previousState: ImmutableObject | ImmutableObject> | ImmutableObject<...> | ImmutableObject<...>; }' is not assignable to type 'ImmutableObject<{ forceRefresh: boolean; }>'. Object literal may only specify known properties, and 'type' does not exist in type 'ImmutableObject<{ forceRefresh: boolean; }>' --- .../pages/event_filters/store/action.ts | 9 +++++- .../pages/event_filters/store/middleware.ts | 2 +- .../pages/event_filters/store/reducer.test.ts | 31 +++++++++++++++++++ .../pages/event_filters/store/reducer.ts | 13 ++++++++ .../pages/event_filters/store/selector.ts | 3 +- .../event_filters/store/selectors.test.ts | 5 --- .../view/event_filters_list_page.tsx | 10 ++++-- .../state/trusted_apps_list_page_state.ts | 1 + .../pages/trusted_apps/store/action.ts | 9 +++++- .../pages/trusted_apps/store/builders.ts | 1 + .../pages/trusted_apps/store/middleware.ts | 3 +- .../pages/trusted_apps/store/reducer.test.ts | 25 +++++++++++++++ .../pages/trusted_apps/store/reducer.ts | 11 +++++++ .../pages/trusted_apps/store/selectors.ts | 17 +++++----- .../trusted_apps/view/trusted_apps_page.tsx | 15 +++++++-- 15 files changed, 131 insertions(+), 24 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/action.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/action.ts index 016170686c7dd5..588eb9275ad218 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/action.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/action.ts @@ -66,6 +66,12 @@ export type EventFiltersFormStateChanged = Action<'eventFiltersFormStateChanged' payload: AsyncResourceState; }; +export type EventFiltersForceRefresh = Action<'eventFiltersForceRefresh'> & { + payload: { + forceRefresh: boolean; + }; +}; + export type EventFiltersPageAction = | EventFiltersListPageDataChanged | EventFiltersListPageDataExistsChanged @@ -81,4 +87,5 @@ export type EventFiltersPageAction = | EventFilterForDeletion | EventFilterDeletionReset | EventFilterDeleteSubmit - | EventFilterDeleteStatusChanged; + | EventFilterDeleteStatusChanged + | EventFiltersForceRefresh; diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.ts index c1ade4e2cadeca..ad9e3d32a3f4c5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.ts @@ -232,9 +232,9 @@ const refreshListDataIfNeeded: MiddlewareActionHandler = async (store, eventFilt dispatch({ type: 'eventFiltersListPageDataChanged', payload: { - type: 'LoadingResourceState', // Ignore will be fixed with when AsyncResourceState is refactored (#830) // @ts-ignore + type: 'LoadingResourceState', previousState: getCurrentListPageDataState(state), }, }); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts index 5366b6dcf155aa..2bfc6b43788390 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts @@ -168,4 +168,35 @@ describe('event filters reducer', () => { }); }); }); + + describe('ForceRefresh', () => { + it('sets the force refresh state to true', () => { + const result = eventFiltersPageReducer( + { + ...initialState, + listPage: { ...initialState.listPage, forceRefresh: false }, + }, + { type: 'eventFiltersForceRefresh', payload: { forceRefresh: true } } + ); + + expect(result).toStrictEqual({ + ...initialState, + listPage: { ...initialState.listPage, forceRefresh: true }, + }); + }); + it('sets the force refresh state to false', () => { + const result = eventFiltersPageReducer( + { + ...initialState, + listPage: { ...initialState.listPage, forceRefresh: true }, + }, + { type: 'eventFiltersForceRefresh', payload: { forceRefresh: false } } + ); + + expect(result).toStrictEqual({ + ...initialState, + listPage: { ...initialState.listPage, forceRefresh: false }, + }); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.ts index 28292bdb1ed1cd..b6e853ca4bf0fe 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.ts @@ -30,6 +30,7 @@ import { EventFilterForDeletion, EventFilterDeletionReset, EventFilterDeleteStatusChanged, + EventFiltersForceRefresh, } from './action'; import { initialEventFiltersPageState } from './builders'; @@ -220,6 +221,16 @@ const handleEventFilterDeleteStatusChanges: CaseReducer = (state, action) => { + return { + ...state, + listPage: { + ...state.listPage, + forceRefresh: action.payload.forceRefresh, + }, + }; +}; + export const eventFiltersPageReducer: StateReducer = ( state = initialEventFiltersPageState(), action @@ -237,6 +248,8 @@ export const eventFiltersPageReducer: StateReducer = ( return eventFiltersUpdateSuccess(state, action); case 'userChangedUrl': return userChangedUrl(state, action); + case 'eventFiltersForceRefresh': + return handleEventFilterForceRefresh(state, action); } // actions only handled if we're on the List Page diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selector.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selector.ts index fef6ccb99a17a2..2fa196a053f78d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selector.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selector.ts @@ -184,8 +184,7 @@ export const listDataNeedsRefresh: EventFiltersSelector = createSelecto return ( forceRefresh || location.page_index + 1 !== currentQuery.page || - location.page_size !== currentQuery.perPage || - location.filter !== currentQuery.filter + location.page_size !== currentQuery.perPage ); } ); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selectors.test.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selectors.test.ts index 9d2d3c394c4166..be3de3017d1f3f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selectors.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/selectors.test.ts @@ -250,11 +250,6 @@ describe('event filters selectors', () => { initialState.location.page_index = 10; expect(listDataNeedsRefresh(initialState)).toBe(true); }); - - it('should should return true if filter param differ from last api call', () => { - initialState.location.filter = 'query'; - expect(listDataNeedsRefresh(initialState)).toBe(true); - }); }); describe('getFormEntry()', () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx index 0975104f02297f..1f3b721fd51e3b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.tsx @@ -177,9 +177,13 @@ export const EventFiltersListPage = memo(() => { [navigateCallback] ); - const handleOnSearch = useCallback((query: string) => navigateCallback({ filter: query }), [ - navigateCallback, - ]); + const handleOnSearch = useCallback( + (query: string) => { + dispatch({ type: 'eventFiltersForceRefresh', payload: { forceRefresh: true } }); + navigateCallback({ filter: query }); + }, + [navigateCallback, dispatch] + ); return ( ; location: TrustedAppsListPageLocation; active: boolean; + forceRefresh: boolean; } diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/action.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/action.ts index 34f48142c70326..a3f804ed6cd770 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/action.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/action.ts @@ -68,6 +68,12 @@ export type TrustedAppsPoliciesStateChanged = Action<'trustedAppsPoliciesStateCh payload: AsyncResourceState; }; +export type TrustedAppForceRefresh = Action<'trustedAppForceRefresh'> & { + payload: { + forceRefresh: boolean; + }; +}; + export type TrustedAppsPageAction = | TrustedAppsListDataOutdated | TrustedAppsListResourceStateChanged @@ -82,4 +88,5 @@ export type TrustedAppsPageAction = | TrustedAppCreationDialogConfirmed | TrustedAppsExistResponse | TrustedAppsPoliciesStateChanged - | TrustedAppCreationDialogClosed; + | TrustedAppCreationDialogClosed + | TrustedAppForceRefresh; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts index 5a22badec9afbc..988d3d6e828cc5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/builders.ts @@ -59,4 +59,5 @@ export const initialTrustedAppsPageState = (): TrustedAppsListPageState => ({ filter: '', }, active: false, + forceRefresh: false, }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.ts index 878938aa20e1b3..da6394a9ab8969 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.ts @@ -80,6 +80,7 @@ const refreshListIfNeeded = async ( trustedAppsService: TrustedAppsService ) => { if (needsRefreshOfListData(store.getState())) { + store.dispatch({ type: 'trustedAppForceRefresh', payload: { forceRefresh: false } }); store.dispatch( createTrustedAppsListResourceStateChangedAction({ type: 'LoadingResourceState', @@ -395,11 +396,11 @@ const fetchEditTrustedAppIfNeeded = async ( dispatch({ type: 'trustedAppCreationEditItemStateChanged', payload: { - type: 'LoadingResourceState', // No easy way to get around this that I can see. `previousState` does not // seem to allow everything that `editItem` state can hold, so not even sure if using // type guards would work here // @ts-ignore + type: 'LoadingResourceState', previousState: editItemState(currentState)!, }, }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts index 58193eea3de52b..42659e5cc34988 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts @@ -191,4 +191,29 @@ describe('reducer', () => { expect(result).toStrictEqual(initialState); }); }); + + describe('TrustedAppsForceRefresh', () => { + it('sets the force refresh state to true', () => { + const result = trustedAppsPageReducer( + { + ...initialState, + forceRefresh: false, + }, + { type: 'trustedAppForceRefresh', payload: { forceRefresh: true } } + ); + + expect(result).toStrictEqual({ ...initialState, forceRefresh: true }); + }); + it('sets the force refresh state to false', () => { + const result = trustedAppsPageReducer( + { + ...initialState, + forceRefresh: true, + }, + { type: 'trustedAppForceRefresh', payload: { forceRefresh: false } } + ); + + expect(result).toStrictEqual({ ...initialState, forceRefresh: false }); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.ts index ea7bbb44c9bf2a..d0de5dc80ee79f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.ts @@ -31,6 +31,7 @@ import { TrustedAppsExistResponse, TrustedAppsPoliciesStateChanged, TrustedAppCreationEditItemStateChanged, + TrustedAppForceRefresh, } from './action'; import { TrustedAppsListPageState } from '../state'; @@ -177,6 +178,13 @@ const updatePolicies: CaseReducer = (state, { p return state; }; +const forceRefresh: CaseReducer = (state, { payload }) => { + return { + ...state, + forceRefresh: payload.forceRefresh, + }; +}; + export const trustedAppsPageReducer: StateReducer = ( state = initialTrustedAppsPageState(), action @@ -226,6 +234,9 @@ export const trustedAppsPageReducer: StateReducer = ( case 'trustedAppsPoliciesStateChanged': return updatePolicies(state, action); + + case 'trustedAppForceRefresh': + return forceRefresh(state, action); } return state; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/selectors.ts index 43506f98193a03..338f30b447a8a7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/selectors.ts @@ -30,16 +30,17 @@ export const needsRefreshOfListData = (state: Immutable { - return ( - data.pageIndex === location.page_index && - data.pageSize === location.page_size && - data.timestamp >= freshDataTimestamp && - data.filter === location.filter - ); - }) + (forceRefresh || + isOutdatedResourceState(currentPage, (data) => { + return ( + data.pageIndex === location.page_index && + data.pageSize === location.page_size && + data.timestamp >= freshDataTimestamp + ); + })) ); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx index 4cd6ad62f3a35f..ec80b4c5ae21b5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.tsx @@ -5,7 +5,9 @@ * 2.0. */ -import React, { memo, useMemo } from 'react'; +import React, { memo, useMemo, useCallback } from 'react'; +import { useDispatch } from 'react-redux'; +import { Dispatch } from 'redux'; import { useLocation } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n/react'; import { @@ -33,6 +35,7 @@ import { TrustedAppsGrid } from './components/trusted_apps_grid'; import { TrustedAppsList } from './components/trusted_apps_list'; import { TrustedAppDeletionDialog } from './trusted_app_deletion_dialog'; import { TrustedAppsNotifications } from './trusted_apps_notifications'; +import { AppAction } from '../../../../common/store/actions'; import { ABOUT_TRUSTED_APPS, SEARCH_TRUSTED_APP_PLACEHOLDER } from './translations'; import { EmptyState } from './components/empty_state'; import { SearchBar } from '../../../components/search_bar'; @@ -40,11 +43,13 @@ import { BackToExternalAppButton } from '../../../components/back_to_external_ap import { ListPageRouteState } from '../../../../../common/endpoint/types'; export const TrustedAppsPage = memo(() => { + const dispatch = useDispatch>(); const { state: routeState } = useLocation(); const location = useTrustedAppsSelector(getCurrentLocation); const totalItemsCount = useTrustedAppsSelector(getListTotalItemsCount); const isCheckingIfEntriesExists = useTrustedAppsSelector(checkingIfEntriesExist); const doEntriesExist = useTrustedAppsSelector(entriesExist) === true; + const navigationCallback = useTrustedAppsNavigateCallback((query: string) => ({ filter: query })); const handleAddButtonClick = useTrustedAppsNavigateCallback(() => ({ show: 'create', id: undefined, @@ -56,7 +61,13 @@ export const TrustedAppsPage = memo(() => { const handleViewTypeChange = useTrustedAppsNavigateCallback((viewType: ViewType) => ({ view_type: viewType, })); - const handleOnSearch = useTrustedAppsNavigateCallback((query: string) => ({ filter: query })); + const handleOnSearch = useCallback( + (query: string) => { + dispatch({ type: 'trustedAppForceRefresh', payload: { forceRefresh: true } }); + navigationCallback(query); + }, + [dispatch, navigationCallback] + ); const showCreateFlyout = !!location.show; From 84e1b01ceb2954a74c4ea67f8695fe41b736d85a Mon Sep 17 00:00:00 2001 From: Constance Date: Mon, 28 Jun 2021 08:39:27 -0700 Subject: [PATCH 013/227] Result settings: Fix restore defaults copy (#103413) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/result_settings/result_settings_logic.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_logic.ts index 13530c2c29ef0c..216c43e1d30728 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_logic.ts @@ -92,7 +92,7 @@ const RESET_CONFIRMATION_MESSAGE = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.resultSettings.confirmResetMessage', { defaultMessage: - 'This will revert your settings back to the default: all fields set to raw. The default will take over immediately and impact your search results.', + 'Are you sure you want to restore result settings defaults? This will set all fields back to raw with no limits.', } ); From 96fe9c23f878354df5b9122d48093e696f014c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= Date: Mon, 28 Jun 2021 17:48:54 +0200 Subject: [PATCH 014/227] [Security solution][Endpoint] Get os name from host.os.name when agent type endpoint (#103450) * When type endpoint gets os type from os name instead of os family * Allow users add event filters only for endpoint events * Fixes error with wrong map function Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../pages/event_filters/store/utils.ts | 16 +++++++++------- .../pages/event_filters/test_utils/index.ts | 1 + .../components/timeline/body/actions/index.tsx | 8 ++++---- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/utils.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/utils.ts index 6adc490b40e789..e0f9a6bcc965cc 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/utils.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/utils.ts @@ -10,6 +10,14 @@ import type { CreateExceptionListItemSchema } from '@kbn/securitysolution-io-ts- import { Ecs } from '../../../../../common/ecs'; import { ENDPOINT_EVENT_FILTERS_LIST_ID } from '../constants'; +const osTypeBasedOnAgentType = (data?: Ecs) => { + if (data?.agent?.type?.includes('endpoint')) { + return (data?.host?.os?.name || ['windows']).map((name) => name.toLowerCase()); + } else { + return data?.host?.os?.family ?? ['windows']; + } +}; + export const getInitialExceptionFromEvent = (data?: Ecs): CreateExceptionListItemSchema => ({ comments: [], description: '', @@ -46,11 +54,5 @@ export const getInitialExceptionFromEvent = (data?: Ecs): CreateExceptionListIte namespace_type: 'agnostic', tags: ['policy:all'], type: 'simple', - // TODO: Try to fix this type casting - os_types: [ - (data && data.host ? data.host.os?.family ?? ['windows'] : ['windows'])[0] as - | 'windows' - | 'linux' - | 'macos', - ], + os_types: osTypeBasedOnAgentType(data) as Array<'windows' | 'linux' | 'macos'>, }); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/test_utils/index.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/test_utils/index.ts index dc235cf511157a..c45d0f88927be5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/test_utils/index.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/test_utils/index.ts @@ -50,6 +50,7 @@ export const ecsEventMock = (): Ecs => ({ name: ['Host-tvs68wo3qc'], os: { family: ['windows'], + name: ['Windows'], }, id: ['a563b365-2bee-40df-adcd-ae84d889f523'], ip: ['10.242.233.187'], diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.tsx index 0a3a1cd88acccd..29e00d169b4e4b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/actions/index.tsx @@ -87,9 +87,9 @@ const ActionsComponent: React.FC = ({ ); const eventType = getEventType(ecsData); - const isEventContextMenuEnabled = useMemo( - () => !!ecsData.event?.kind && ecsData.event?.kind[0] === 'event', - [ecsData.event?.kind] + const isEventContextMenuEnabledForEndpoint = useMemo( + () => ecsData.event?.kind?.includes('event') && ecsData.agent?.type?.includes('endpoint'), + [ecsData.event?.kind, ecsData.agent?.type] ); return ( @@ -174,7 +174,7 @@ const ActionsComponent: React.FC = ({ key="alert-context-menu" ecsRowData={ecsData} timelineId={timelineId} - disabled={eventType !== 'signal' && !isEventContextMenuEnabled} + disabled={eventType !== 'signal' && !isEventContextMenuEnabledForEndpoint} refetch={refetch ?? noop} onRuleChange={onRuleChange} /> From 15b0dbff7bc27cee3bfbd938f698ac5053dc854e Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 28 Jun 2021 19:18:30 +0300 Subject: [PATCH 015/227] [TSVB] Fix references to the index pattern are not embedded when exporting a saved object (#103255) * [TSVB] Importing a dashboard with only TSVB viz on another space, breaks the dashboard Closes: #103059 * move index-pattern to constant Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...na-plugin-plugins-data-public.esfilters.md | 8 ++-- ...bana-plugin-plugins-data-public.eskuery.md | 2 +- ...bana-plugin-plugins-data-public.esquery.md | 2 +- ...lugin-plugins-data-public.iindexpattern.md | 2 +- ...-public.index_pattern_saved_object_type.md | 13 +++++++ .../kibana-plugin-plugins-data-public.md | 1 + ...na-plugin-plugins-data-server.esfilters.md | 8 ++-- ...bana-plugin-plugins-data-server.eskuery.md | 2 +- ...bana-plugin-plugins-data-server.esquery.md | 2 +- ...-server.index_pattern_saved_object_type.md | 13 +++++++ .../kibana-plugin-plugins-data-server.md | 1 + .../saved_objects/dashboard_migrations.ts | 29 ++++++++------ .../replace_index_pattern_reference.test.ts | 39 +++++++++++++++++++ .../replace_index_pattern_reference.ts | 22 +++++++++++ src/plugins/data/common/constants.ts | 3 ++ .../index_patterns/index_patterns.ts | 23 ++++++----- .../common/index_patterns/lib/get_title.ts | 6 ++- .../data/common/index_patterns/utils.ts | 4 +- .../search_source/extract_references.ts | 6 ++- src/plugins/data/public/index.ts | 1 + src/plugins/data/public/public.api.md | 31 ++++++++------- src/plugins/data/server/index.ts | 7 +++- .../data/server/index_patterns/utils.ts | 9 ++++- .../server/saved_objects/index_patterns.ts | 5 ++- src/plugins/data/server/server.api.md | 31 ++++++++------- .../controls_references.ts | 3 +- .../timeseries_references.ts | 6 +-- ...ualization_saved_object_migrations.test.ts | 30 ++++++++++++++ .../visualization_saved_object_migrations.ts | 29 +++++++++++--- 29 files changed, 257 insertions(+), 81 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.index_pattern_saved_object_type.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.index_pattern_saved_object_type.md create mode 100644 src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts create mode 100644 src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md index 2ca4847d6dc398..80c321ce6b3209 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md @@ -13,11 +13,11 @@ esFilters: { FILTERS: typeof FILTERS; FilterStateStore: typeof FilterStateStore; buildEmptyFilter: (isPinned: boolean, index?: string | undefined) => import("../common").Filter; - buildPhrasesFilter: (field: import("../common").IFieldType, params: any[], indexPattern: import("../common").MinimalIndexPattern) => import("../common").PhrasesFilter; - buildExistsFilter: (field: import("../common").IFieldType, indexPattern: import("../common").MinimalIndexPattern) => import("../common").ExistsFilter; - buildPhraseFilter: (field: import("../common").IFieldType, value: any, indexPattern: import("../common").MinimalIndexPattern) => import("../common").PhraseFilter; + buildPhrasesFilter: (field: import("../common").IFieldType, params: any[], indexPattern: import("../common").IndexPatternBase) => import("../common").PhrasesFilter; + buildExistsFilter: (field: import("../common").IFieldType, indexPattern: import("../common").IndexPatternBase) => import("../common").ExistsFilter; + buildPhraseFilter: (field: import("../common").IFieldType, value: any, indexPattern: import("../common").IndexPatternBase) => import("../common").PhraseFilter; buildQueryFilter: (query: any, index: string, alias: string) => import("../common").QueryStringFilter; - buildRangeFilter: (field: import("../common").IFieldType, params: import("../common").RangeFilterParams, indexPattern: import("../common").MinimalIndexPattern, formattedValue?: string | undefined) => import("../common").RangeFilter; + buildRangeFilter: (field: import("../common").IFieldType, params: import("../common").RangeFilterParams, indexPattern: import("../common").IndexPatternBase, formattedValue?: string | undefined) => import("../common").RangeFilter; isPhraseFilter: (filter: any) => filter is import("../common").PhraseFilter; isExistsFilter: (filter: any) => filter is import("../common").ExistsFilter; isPhrasesFilter: (filter: any) => filter is import("../common").PhrasesFilter; diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.eskuery.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.eskuery.md index 881a1fa803ca65..332114e6375863 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.eskuery.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.eskuery.md @@ -10,6 +10,6 @@ esKuery: { nodeTypes: import("../common/es_query/kuery/node_types").NodeTypes; fromKueryExpression: (expression: any, parseOptions?: Partial) => import("../common").KueryNode; - toElasticsearchQuery: (node: import("../common").KueryNode, indexPattern?: import("../common").MinimalIndexPattern | undefined, config?: Record | undefined, context?: Record | undefined) => import("@kbn/common-utils").JsonObject; + toElasticsearchQuery: (node: import("../common").KueryNode, indexPattern?: import("../common").IndexPatternBase | undefined, config?: Record | undefined, context?: Record | undefined) => import("@kbn/common-utils").JsonObject; } ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquery.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquery.md index 70805aaaaee8ca..0bc9c0c12fc3a4 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquery.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esquery.md @@ -10,7 +10,7 @@ esQuery: { buildEsQuery: typeof buildEsQuery; getEsQueryConfig: typeof getEsQueryConfig; - buildQueryFromFilters: (filters: import("../common").Filter[] | undefined, indexPattern: import("../common").MinimalIndexPattern | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { + buildQueryFromFilters: (filters: import("../common").Filter[] | undefined, indexPattern: import("../common").IndexPatternBase | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { must: never[]; filter: import("../common").Filter[]; should: never[]; diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpattern.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpattern.md index 88d8520a373c69..ec29ef81a6e69b 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpattern.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpattern.md @@ -12,7 +12,7 @@ Signature: ```typescript -export interface IIndexPattern extends MinimalIndexPattern +export interface IIndexPattern extends IndexPatternBase ``` ## Properties diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.index_pattern_saved_object_type.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.index_pattern_saved_object_type.md new file mode 100644 index 00000000000000..552d1319845174 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.index_pattern_saved_object_type.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [INDEX\_PATTERN\_SAVED\_OBJECT\_TYPE](./kibana-plugin-plugins-data-public.index_pattern_saved_object_type.md) + +## INDEX\_PATTERN\_SAVED\_OBJECT\_TYPE variable + +\* + +Signature: + +```typescript +INDEX_PATTERN_SAVED_OBJECT_TYPE = "index-pattern" +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index 7c023e756ebd5e..65c4601d5faec9 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -118,6 +118,7 @@ | [fieldFormats](./kibana-plugin-plugins-data-public.fieldformats.md) | | | [fieldList](./kibana-plugin-plugins-data-public.fieldlist.md) | | | [getKbnTypeNames](./kibana-plugin-plugins-data-public.getkbntypenames.md) | Get the esTypes known by all kbnFieldTypes {Array} | +| [INDEX\_PATTERN\_SAVED\_OBJECT\_TYPE](./kibana-plugin-plugins-data-public.index_pattern_saved_object_type.md) | \* | | [indexPatterns](./kibana-plugin-plugins-data-public.indexpatterns.md) | | | [injectSearchSourceReferences](./kibana-plugin-plugins-data-public.injectsearchsourcereferences.md) | | | [isCompleteResponse](./kibana-plugin-plugins-data-public.iscompleteresponse.md) | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esfilters.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esfilters.md index d951cb24269435..d009cad9ec601c 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esfilters.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esfilters.md @@ -11,11 +11,11 @@ esFilters: { buildQueryFilter: (query: any, index: string, alias: string) => import("../common").QueryStringFilter; buildCustomFilter: typeof buildCustomFilter; buildEmptyFilter: (isPinned: boolean, index?: string | undefined) => import("../common").Filter; - buildExistsFilter: (field: import("../common").IFieldType, indexPattern: import("../common").MinimalIndexPattern) => import("../common").ExistsFilter; + buildExistsFilter: (field: import("../common").IFieldType, indexPattern: import("../common").IndexPatternBase) => import("../common").ExistsFilter; buildFilter: typeof buildFilter; - buildPhraseFilter: (field: import("../common").IFieldType, value: any, indexPattern: import("../common").MinimalIndexPattern) => import("../common").PhraseFilter; - buildPhrasesFilter: (field: import("../common").IFieldType, params: any[], indexPattern: import("../common").MinimalIndexPattern) => import("../common").PhrasesFilter; - buildRangeFilter: (field: import("../common").IFieldType, params: import("../common").RangeFilterParams, indexPattern: import("../common").MinimalIndexPattern, formattedValue?: string | undefined) => import("../common").RangeFilter; + buildPhraseFilter: (field: import("../common").IFieldType, value: any, indexPattern: import("../common").IndexPatternBase) => import("../common").PhraseFilter; + buildPhrasesFilter: (field: import("../common").IFieldType, params: any[], indexPattern: import("../common").IndexPatternBase) => import("../common").PhrasesFilter; + buildRangeFilter: (field: import("../common").IFieldType, params: import("../common").RangeFilterParams, indexPattern: import("../common").IndexPatternBase, formattedValue?: string | undefined) => import("../common").RangeFilter; isFilterDisabled: (filter: import("../common").Filter) => boolean; } ``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.eskuery.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.eskuery.md index 6274eb5f4f4a5f..fce25a899de8e8 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.eskuery.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.eskuery.md @@ -10,6 +10,6 @@ esKuery: { nodeTypes: import("../common/es_query/kuery/node_types").NodeTypes; fromKueryExpression: (expression: any, parseOptions?: Partial) => import("../common").KueryNode; - toElasticsearchQuery: (node: import("../common").KueryNode, indexPattern?: import("../common").MinimalIndexPattern | undefined, config?: Record | undefined, context?: Record | undefined) => import("@kbn/common-utils").JsonObject; + toElasticsearchQuery: (node: import("../common").KueryNode, indexPattern?: import("../common").IndexPatternBase | undefined, config?: Record | undefined, context?: Record | undefined) => import("@kbn/common-utils").JsonObject; } ``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esquery.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esquery.md index 0d1baecb014f58..68507f3fb9b81d 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esquery.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.esquery.md @@ -8,7 +8,7 @@ ```typescript esQuery: { - buildQueryFromFilters: (filters: import("../common").Filter[] | undefined, indexPattern: import("../common").MinimalIndexPattern | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { + buildQueryFromFilters: (filters: import("../common").Filter[] | undefined, indexPattern: import("../common").IndexPatternBase | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { must: never[]; filter: import("../common").Filter[]; should: never[]; diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.index_pattern_saved_object_type.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.index_pattern_saved_object_type.md new file mode 100644 index 00000000000000..34f76d4ab13b14 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.index_pattern_saved_object_type.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [INDEX\_PATTERN\_SAVED\_OBJECT\_TYPE](./kibana-plugin-plugins-data-server.index_pattern_saved_object_type.md) + +## INDEX\_PATTERN\_SAVED\_OBJECT\_TYPE variable + +\* + +Signature: + +```typescript +INDEX_PATTERN_SAVED_OBJECT_TYPE = "index-pattern" +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md index 9816b884c46144..ab14abdd74e87d 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md @@ -83,6 +83,7 @@ | [esQuery](./kibana-plugin-plugins-data-server.esquery.md) | | | [exporters](./kibana-plugin-plugins-data-server.exporters.md) | | | [fieldFormats](./kibana-plugin-plugins-data-server.fieldformats.md) | | +| [INDEX\_PATTERN\_SAVED\_OBJECT\_TYPE](./kibana-plugin-plugins-data-server.index_pattern_saved_object_type.md) | \* | | [indexPatterns](./kibana-plugin-plugins-data-server.indexpatterns.md) | | | [mergeCapabilitiesWithFields](./kibana-plugin-plugins-data-server.mergecapabilitieswithfields.md) | | | [search](./kibana-plugin-plugins-data-server.search.md) | | diff --git a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts index 4ebca5ba8965ef..0bd100b3d58033 100644 --- a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts +++ b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts @@ -7,7 +7,7 @@ */ import semver from 'semver'; -import { get, flow } from 'lodash'; +import { get, flow, identity } from 'lodash'; import { SavedObjectAttributes, SavedObjectMigrationFn, @@ -25,7 +25,9 @@ import { convertSavedDashboardPanelToPanelState, } from '../../common/embeddable/embeddable_saved_object_converters'; import { SavedObjectEmbeddableInput } from '../../../embeddable/common'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../../data/common'; import { SerializableValue } from '../../../kibana_utils/common'; +import { replaceIndexPatternReference } from './replace_index_pattern_reference'; function migrateIndexPattern(doc: DashboardDoc700To720) { const searchSourceJSON = get(doc, 'attributes.kibanaSavedObjectMeta.searchSourceJSON'); @@ -43,7 +45,7 @@ function migrateIndexPattern(doc: DashboardDoc700To720) { searchSource.indexRefName = 'kibanaSavedObjectMeta.searchSourceJSON.index'; doc.references.push({ name: searchSource.indexRefName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: searchSource.index, }); delete searchSource.index; @@ -56,7 +58,7 @@ function migrateIndexPattern(doc: DashboardDoc700To720) { filterRow.meta.indexRefName = `kibanaSavedObjectMeta.searchSourceJSON.filter[${i}].meta.index`; doc.references.push({ name: filterRow.meta.indexRefName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: filterRow.meta.index, }); delete filterRow.meta.index; @@ -214,12 +216,14 @@ export interface DashboardSavedObjectTypeMigrationsDeps { export const createDashboardSavedObjectTypeMigrations = ( deps: DashboardSavedObjectTypeMigrationsDeps ): SavedObjectMigrationMap => { - const embeddableMigrations = deps.embeddable - .getMigrationVersions() - .filter((version) => semver.gt(version, '7.12.0')) - .map((version): [string, SavedObjectMigrationFn] => { - return [version, migrateByValuePanels(deps, version)]; - }); + const embeddableMigrations = Object.fromEntries( + deps.embeddable + .getMigrationVersions() + .filter((version) => semver.gt(version, '7.12.0')) + .map((version): [string, SavedObjectMigrationFn] => { + return [version, migrateByValuePanels(deps, version)]; + }) + ); return { /** @@ -237,12 +241,15 @@ export const createDashboardSavedObjectTypeMigrations = ( '7.3.0': flow(migrations730), '7.9.3': flow(migrateMatchAllQuery), '7.11.0': flow(createExtractPanelReferencesMigration(deps)), - ...Object.fromEntries(embeddableMigrations), + + ...embeddableMigrations, /** * Any dashboard saved object migrations that come after this point will have to be wary of * potentially overwriting embeddable migrations. An example of how to mitigate this follows: */ - // '7.x': flow(yourNewMigrationFunction, embeddableMigrations['7.x']) + // '7.x': flow(yourNewMigrationFunction, embeddableMigrations['7.x'] ?? identity), + + '7.14.0': flow(replaceIndexPatternReference, embeddableMigrations['7.14.0'] ?? identity), }; }; diff --git a/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts b/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts new file mode 100644 index 00000000000000..01207fb4e34046 --- /dev/null +++ b/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts @@ -0,0 +1,39 @@ +/* + * 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 type { SavedObjectMigrationContext, SavedObjectMigrationFn } from 'kibana/server'; + +import { replaceIndexPatternReference } from './replace_index_pattern_reference'; + +describe('replaceIndexPatternReference', () => { + const savedObjectMigrationContext = (null as unknown) as SavedObjectMigrationContext; + + test('should replace index_pattern to index-pattern', () => { + const migratedDoc = replaceIndexPatternReference( + { + references: [ + { + name: 'name', + type: 'index_pattern', + }, + ], + } as Parameters[0], + savedObjectMigrationContext + ); + + expect(migratedDoc).toMatchInlineSnapshot(` + Object { + "references": Array [ + Object { + "name": "name", + "type": "index-pattern", + }, + ], + } + `); + }); +}); diff --git a/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts b/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts new file mode 100644 index 00000000000000..ddd1c45841b9c5 --- /dev/null +++ b/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.ts @@ -0,0 +1,22 @@ +/* + * 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 type { SavedObjectMigrationFn } from 'kibana/server'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../../data/common'; + +export const replaceIndexPatternReference: SavedObjectMigrationFn = (doc) => ({ + ...doc, + references: Array.isArray(doc.references) + ? doc.references.map((reference) => { + if (reference.type === 'index_pattern') { + reference.type = INDEX_PATTERN_SAVED_OBJECT_TYPE; + } + return reference; + }) + : doc.references, +}); diff --git a/src/plugins/data/common/constants.ts b/src/plugins/data/common/constants.ts index 79a9e0ac5451bd..c6bfbfc75c290c 100644 --- a/src/plugins/data/common/constants.ts +++ b/src/plugins/data/common/constants.ts @@ -9,6 +9,9 @@ export const DEFAULT_QUERY_LANGUAGE = 'kuery'; export const KIBANA_USER_QUERY_LANGUAGE_KEY = 'kibana.userQueryLanguage'; +/** @public **/ +export const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; + export const UI_SETTINGS = { META_FIELDS: 'metaFields', DOC_HIGHLIGHT: 'doc_table:highlight', diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index e67e72f295b8ec..cecf3b8c07d1ac 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import { PublicMethodsOf } from '@kbn/utility-types'; -import { SavedObjectsClientCommon } from '../..'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE, SavedObjectsClientCommon } from '../..'; import { createIndexPatternCache } from '.'; import type { RuntimeField } from '../types'; @@ -38,7 +38,6 @@ import { DuplicateIndexPatternError } from '../errors'; import { castEsToKbnFieldTypeName } from '../../kbn_field_types'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; -const savedObjectType = 'index-pattern'; export interface IndexPatternSavedObjectAttrs { title: string; @@ -94,7 +93,7 @@ export class IndexPatternsService { */ private async refreshSavedObjectsCache() { const so = await this.savedObjectsClient.find({ - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, fields: ['title'], perPage: 10000, }); @@ -137,7 +136,7 @@ export class IndexPatternsService { */ find = async (search: string, size: number = 10): Promise => { const savedObjects = await this.savedObjectsClient.find({ - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, fields: ['title'], search, searchFields: ['title'], @@ -395,12 +394,16 @@ export class IndexPatternsService { private getSavedObjectAndInit = async (id: string): Promise => { const savedObject = await this.savedObjectsClient.get( - savedObjectType, + INDEX_PATTERN_SAVED_OBJECT_TYPE, id ); if (!savedObject.version) { - throw new SavedObjectNotFound(savedObjectType, id, 'management/kibana/indexPatterns'); + throw new SavedObjectNotFound( + INDEX_PATTERN_SAVED_OBJECT_TYPE, + id, + 'management/kibana/indexPatterns' + ); } return this.initFromSavedObject(savedObject); @@ -546,7 +549,7 @@ export class IndexPatternsService { const body = indexPattern.getAsSavedObjectBody(); const response: SavedObject = (await this.savedObjectsClient.create( - savedObjectType, + INDEX_PATTERN_SAVED_OBJECT_TYPE, body, { id: indexPattern.id, @@ -587,7 +590,9 @@ export class IndexPatternsService { }); return this.savedObjectsClient - .update(savedObjectType, indexPattern.id, body, { version: indexPattern.version }) + .update(INDEX_PATTERN_SAVED_OBJECT_TYPE, indexPattern.id, body, { + version: indexPattern.version, + }) .then((resp) => { indexPattern.id = resp.id; indexPattern.version = resp.version; @@ -655,7 +660,7 @@ export class IndexPatternsService { */ async delete(indexPatternId: string) { this.indexPatternCache.clear(indexPatternId); - return this.savedObjectsClient.delete('index-pattern', indexPatternId); + return this.savedObjectsClient.delete(INDEX_PATTERN_SAVED_OBJECT_TYPE, indexPatternId); } } diff --git a/src/plugins/data/common/index_patterns/lib/get_title.ts b/src/plugins/data/common/index_patterns/lib/get_title.ts index 2dd122092f6884..69afad486a7450 100644 --- a/src/plugins/data/common/index_patterns/lib/get_title.ts +++ b/src/plugins/data/common/index_patterns/lib/get_title.ts @@ -7,12 +7,16 @@ */ import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../constants'; export async function getTitle( client: SavedObjectsClientContract, indexPatternId: string ): Promise> { - const savedObject = (await client.get('index-pattern', indexPatternId)) as SimpleSavedObject; + const savedObject = (await client.get( + INDEX_PATTERN_SAVED_OBJECT_TYPE, + indexPatternId + )) as SimpleSavedObject; if (savedObject.error) { throw new Error(`Unable to get index-pattern title: ${savedObject.error.message}`); diff --git a/src/plugins/data/common/index_patterns/utils.ts b/src/plugins/data/common/index_patterns/utils.ts index 941ad3c47066b3..925f646b83bb70 100644 --- a/src/plugins/data/common/index_patterns/utils.ts +++ b/src/plugins/data/common/index_patterns/utils.ts @@ -9,6 +9,8 @@ import type { IndexPatternSavedObjectAttrs } from './index_patterns'; import type { SavedObjectsClientCommon } from '../types'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../constants'; + /** * Returns an object matching a given title * @@ -19,7 +21,7 @@ import type { SavedObjectsClientCommon } from '../types'; export async function findByTitle(client: SavedObjectsClientCommon, title: string) { if (title) { const savedObjects = await client.find({ - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, perPage: 10, search: `"${title}"`, searchFields: ['title'], diff --git a/src/plugins/data/common/search/search_source/extract_references.ts b/src/plugins/data/common/search/search_source/extract_references.ts index 1b4d1732a5e377..b63b8ed1cfee2f 100644 --- a/src/plugins/data/common/search/search_source/extract_references.ts +++ b/src/plugins/data/common/search/search_source/extract_references.ts @@ -10,6 +10,8 @@ import { SavedObjectReference } from 'src/core/types'; import { Filter } from '../../es_query/filters'; import { SearchSourceFields } from './types'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../constants'; + export const extractReferences = ( state: SearchSourceFields ): [SearchSourceFields & { indexRefName?: string }, SavedObjectReference[]] => { @@ -20,7 +22,7 @@ export const extractReferences = ( const refName = 'kibanaSavedObjectMeta.searchSourceJSON.index'; references.push({ name: refName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: indexId, }); searchSourceFields = { @@ -40,7 +42,7 @@ export const extractReferences = ( const refName = `kibanaSavedObjectMeta.searchSourceJSON.filter[${i}].meta.index`; references.push({ name: refName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: filterRow.meta.index, }); return { diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index d7667f20d517e3..e9e50ebfaf138c 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -268,6 +268,7 @@ export { IndexPatternSpec, IndexPatternLoadExpressionFunctionDefinition, fieldList, + INDEX_PATTERN_SAVED_OBJECT_TYPE, } from '../common'; export { DuplicateIndexPatternError } from '../common/index_patterns/errors'; diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 2849b93b144835..6a49fab0e33ff4 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1361,6 +1361,9 @@ export interface IKibanaSearchResponse { // @public (undocumented) export type IMetricAggType = MetricAggType; +// @public (undocumented) +export const INDEX_PATTERN_SAVED_OBJECT_TYPE = "index-pattern"; + // Warning: (ae-missing-release-tag) "IndexPattern" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -2772,20 +2775,20 @@ export interface WaitUntilNextSessionCompletesOptions { // src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:408:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:408:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:408:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:410:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:411:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:420:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:421:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:422:1 - (ae-forgotten-export) The symbol "IpAddress" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:423:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:427:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:428:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:431:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:432:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:435:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:409:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:409:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:409:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:411:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:412:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:421:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:422:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:423:1 - (ae-forgotten-export) The symbol "IpAddress" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:424:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:428:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:429:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:432:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:433:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:436:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:34:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/search/session/session_service.ts:56:5 - (ae-forgotten-export) The symbol "UrlGeneratorStateMapping" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index dd60951e6d2285..143400a2c09d34 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -117,7 +117,12 @@ export const fieldFormats = { HistogramFormat, }; -export { IFieldFormatsRegistry, FieldFormatsGetConfigFn, FieldFormatConfig } from '../common'; +export { + IFieldFormatsRegistry, + FieldFormatsGetConfigFn, + FieldFormatConfig, + INDEX_PATTERN_SAVED_OBJECT_TYPE, +} from '../common'; /* * Index patterns: diff --git a/src/plugins/data/server/index_patterns/utils.ts b/src/plugins/data/server/index_patterns/utils.ts index bb16be23edc7d6..7f1a953c482d09 100644 --- a/src/plugins/data/server/index_patterns/utils.ts +++ b/src/plugins/data/server/index_patterns/utils.ts @@ -7,7 +7,12 @@ */ import { SavedObjectsClientContract } from 'kibana/server'; -import { IFieldType, IndexPatternAttributes, SavedObject } from '../../common'; +import { + IFieldType, + INDEX_PATTERN_SAVED_OBJECT_TYPE, + IndexPatternAttributes, + SavedObject, +} from '../../common'; export const getFieldByName = ( fieldName: string, @@ -24,7 +29,7 @@ export const findIndexPatternById = async ( index: string ): Promise | undefined> => { const savedObjectsResponse = await savedObjectsClient.find({ - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, fields: ['fields'], search: `"${index}"`, searchFields: ['title'], diff --git a/src/plugins/data/server/saved_objects/index_patterns.ts b/src/plugins/data/server/saved_objects/index_patterns.ts index f570e239c3c64d..a809f2ce73e1ba 100644 --- a/src/plugins/data/server/saved_objects/index_patterns.ts +++ b/src/plugins/data/server/saved_objects/index_patterns.ts @@ -6,11 +6,12 @@ * Side Public License, v 1. */ -import { SavedObjectsType } from 'kibana/server'; +import type { SavedObjectsType } from 'kibana/server'; import { indexPatternSavedObjectTypeMigrations } from './index_pattern_migrations'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../common'; export const indexPatternSavedObjectType: SavedObjectsType = { - name: 'index-pattern', + name: INDEX_PATTERN_SAVED_OBJECT_TYPE, hidden: false, namespaceType: 'single', management: { diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 5ca19f9e1e5098..86aaf64dea8523 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -745,6 +745,9 @@ export interface IFieldType { // @public (undocumented) export type IMetricAggType = MetricAggType; +// @public (undocumented) +export const INDEX_PATTERN_SAVED_OBJECT_TYPE = "index-pattern"; + // Warning: (ae-missing-release-tag) "IndexPattern" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1543,20 +1546,20 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "HistogramFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:128:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:128:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:245:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:245:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:247:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:248:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:257:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:258:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:259:1 - (ae-forgotten-export) The symbol "IpAddress" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:263:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:264:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:268:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:271:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:272:1 - (ae-forgotten-export) The symbol "calcAutoIntervalLessThan" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:133:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:133:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:250:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:250:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:252:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:253:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:262:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:263:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:264:1 - (ae-forgotten-export) The symbol "IpAddress" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:268:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:269:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:273:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:276:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:277:1 - (ae-forgotten-export) The symbol "calcAutoIntervalLessThan" needs to be exported by the entry point index.d.ts // src/plugins/data/server/plugin.ts:81:74 - (ae-forgotten-export) The symbol "DataEnhancements" needs to be exported by the entry point index.d.ts // src/plugins/data/server/search/types.ts:115:5 - (ae-forgotten-export) The symbol "ISearchStartSearchSource" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/controls_references.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/controls_references.ts index d116fd2e2e9a7f..7a0bb4584e83a3 100644 --- a/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/controls_references.ts +++ b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/controls_references.ts @@ -8,6 +8,7 @@ import { SavedObjectReference } from '../../../../../core/types'; import { VisParams } from '../../../common'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../../../data/public'; const isControlsVis = (visType: string) => visType === 'input_control_vis'; @@ -25,7 +26,7 @@ export const extractControlsReferences = ( control.indexPatternRefName = `${prefix}_${i}_index_pattern`; references.push({ name: control.indexPatternRefName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: control.indexPattern, }); delete control.indexPattern; diff --git a/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/timeseries_references.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/timeseries_references.ts index 57706ee824e8d2..98970a0127c710 100644 --- a/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/timeseries_references.ts +++ b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/timeseries_references.ts @@ -8,13 +8,11 @@ import { SavedObjectReference } from '../../../../../core/types'; import { VisParams } from '../../../common'; +import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../../../data/public'; /** @internal **/ const REF_NAME_POSTFIX = '_ref_name'; -/** @internal **/ -const INDEX_PATTERN_REF_TYPE = 'index_pattern'; - /** @internal **/ type Action = (object: Record, key: string) => void; @@ -51,7 +49,7 @@ export const extractTimeSeriesReferences = ( object[key + REF_NAME_POSTFIX] = name; references.push({ name, - type: INDEX_PATTERN_REF_TYPE, + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: object[key].id, }); delete object[key]; diff --git a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts index 7debc9412925e4..869a9add890667 100644 --- a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts +++ b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts @@ -2163,6 +2163,36 @@ describe('migration visualization', () => { }); }); + describe('7.14.0 replaceIndexPatternReference', () => { + const migrate = (doc: any) => + visualizationSavedObjectTypeMigrations['7.14.0']( + doc as Parameters[0], + savedObjectMigrationContext + ); + + test('should replace index_pattern to index-pattern', () => { + expect( + migrate({ + references: [ + { + name: 'name', + type: 'index_pattern', + }, + ], + } as Parameters[0]) + ).toMatchInlineSnapshot(` + Object { + "references": Array [ + Object { + "name": "name", + "type": "index-pattern", + }, + ], + } + `); + }); + }); + describe('7.14.0 update tagcloud defaults', () => { const migrate = (doc: any) => visualizationSavedObjectTypeMigrations['7.14.0']( diff --git a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts index 7fb54b04259353..1f50e26ea9ec19 100644 --- a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts +++ b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.ts @@ -8,9 +8,9 @@ import { cloneDeep, get, omit, has, flow, forOwn } from 'lodash'; -import { SavedObjectMigrationFn } from 'kibana/server'; +import type { SavedObjectMigrationFn } from 'kibana/server'; -import { DEFAULT_QUERY_LANGUAGE } from '../../../data/common'; +import { DEFAULT_QUERY_LANGUAGE, INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../../data/common'; import { commonAddSupportOfDualIndexSelectionModeInTSVB, commonHideTSVBLastValueIndicator, @@ -37,7 +37,7 @@ const migrateIndexPattern: SavedObjectMigrationFn = (doc) => { searchSource.indexRefName = 'kibanaSavedObjectMeta.searchSourceJSON.index'; doc.references.push({ name: searchSource.indexRefName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: searchSource.index, }); delete searchSource.index; @@ -50,7 +50,7 @@ const migrateIndexPattern: SavedObjectMigrationFn = (doc) => { filterRow.meta.indexRefName = `kibanaSavedObjectMeta.searchSourceJSON.filter[${i}].meta.index`; doc.references.push({ name: filterRow.meta.indexRefName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: filterRow.meta.index, }); delete filterRow.meta.index; @@ -648,7 +648,7 @@ const migrateControls: SavedObjectMigrationFn = (doc) => { control.indexPatternRefName = `control_${i}_index_pattern`; doc.references.push({ name: control.indexPatternRefName, - type: 'index-pattern', + type: INDEX_PATTERN_SAVED_OBJECT_TYPE, id: control.indexPattern, }); delete control.indexPattern; @@ -1038,6 +1038,18 @@ const migrateTagCloud: SavedObjectMigrationFn = (doc) => { return doc; }; +export const replaceIndexPatternReference: SavedObjectMigrationFn = (doc) => ({ + ...doc, + references: Array.isArray(doc.references) + ? doc.references.map((reference) => { + if (reference.type === 'index_pattern') { + reference.type = INDEX_PATTERN_SAVED_OBJECT_TYPE; + } + return reference; + }) + : doc.references, +}); + export const visualizationSavedObjectTypeMigrations = { /** * We need to have this migration twice, once with a version prior to 7.0.0 once with a version @@ -1084,5 +1096,10 @@ export const visualizationSavedObjectTypeMigrations = { hideTSVBLastValueIndicator, removeDefaultIndexPatternAndTimeFieldFromTSVBModel ), - '7.14.0': flow(addEmptyValueColorRule, migrateVislibPie, migrateTagCloud), + '7.14.0': flow( + addEmptyValueColorRule, + migrateVislibPie, + migrateTagCloud, + replaceIndexPatternReference + ), }; From dfeecb902fd26d6e41bab81fc4a31c45663f8894 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 28 Jun 2021 12:31:10 -0400 Subject: [PATCH 016/227] [ML] Data Frame Analytics creation wizard: ensure included fields table updates correctly (#103191) * fix includes table rerender loop * remove unnecessary comment --- .../analysis_fields_table.tsx | 2 - .../configuration_step_form.tsx | 41 ++++++++----------- .../configuration_step/job_type.tsx | 1 - 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index 0b6843d49e95c3..9dd4c5c42cca76 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -84,7 +84,6 @@ const checkboxDisabledCheck = (item: FieldSelectionItem) => export const AnalysisFieldsTable: FC<{ dependentVariable?: string; includes: string[]; - loadingItems: boolean; setFormState: React.Dispatch>; minimumFieldsRequiredMessage?: string; setMinimumFieldsRequiredMessage: React.Dispatch>; @@ -94,7 +93,6 @@ export const AnalysisFieldsTable: FC<{ }> = ({ dependentVariable, includes, - loadingItems, setFormState, minimumFieldsRequiredMessage, setMinimumFieldsRequiredMessage, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 930c32ce7e4da1..9b68b038539909 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -105,7 +105,6 @@ export const ConfigurationStepForm: FC = ({ const { currentSavedSearch, currentIndexPattern } = mlContext; const { savedSearchQuery, savedSearchQueryStr } = useSavedSearch(); - const [loadingFieldOptions, setLoadingFieldOptions] = useState(false); const [fieldOptionsFetchFail, setFieldOptionsFetchFail] = useState(false); const [loadingDepVarOptions, setLoadingDepVarOptions] = useState(false); const [dependentVariableFetchFail, setDependentVariableFetchFail] = useState(false); @@ -247,21 +246,17 @@ export const ConfigurationStepForm: FC = ({ if (firstUpdate.current) { firstUpdate.current = false; } - // Reset if jobType changes (jobType requires dependent_variable to be set - - // which won't be the case if switching from outlier detection) - if (jobTypeChanged) { - setLoadingFieldOptions(true); - } + + const depVarNotIncluded = + isJobTypeWithDepVar && includes.length > 0 && includes.includes(dependentVariable) === false; // Ensure runtime field is in 'includes' table if it is set as dependent variable const depVarIsRuntimeField = - isJobTypeWithDepVar && + depVarNotIncluded && runtimeMappings && - Object.keys(runtimeMappings).includes(dependentVariable) && - includes.length > 0 && - includes.includes(dependentVariable) === false; + Object.keys(runtimeMappings).includes(dependentVariable); let formToUse = form; - if (depVarIsRuntimeField) { + if (depVarIsRuntimeField || depVarNotIncluded) { formToUse = cloneDeep(form); formToUse.includes = [...includes, dependentVariable]; } @@ -279,24 +274,22 @@ export const ConfigurationStepForm: FC = ({ (field) => field.is_included === true && field.is_required === false ); + const formStateUpdated = { + ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemory } : {}), + ...(depVarIsRuntimeField || jobTypeChanged || depVarNotIncluded + ? { includes: formToUse.includes } + : {}), + requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, + }; + if (jobTypeChanged) { - setLoadingFieldOptions(false); setFieldOptionsFetchFail(false); setMaxDistinctValuesError(undefined); setUnsupportedFieldsError(undefined); - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemory } : {}), - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - includes: formToUse.includes, - }); setIncludesTableItems(fieldSelection ? fieldSelection : []); - } else { - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemory } : {}), - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - includes: formToUse.includes, - }); } + + setFormState(formStateUpdated); setFetchingExplainData(false); } else { const { @@ -319,7 +312,6 @@ export const ConfigurationStepForm: FC = ({ : DEFAULT_MODEL_MEMORY_LIMIT.outlier_detection; setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); - setLoadingFieldOptions(false); setFieldOptionsFetchFail(true); setMaxDistinctValuesError(maxDistinctValuesErrorMessage); setUnsupportedFieldsError(unsupportedFieldsErrorMessage); @@ -650,7 +642,6 @@ export const ConfigurationStepForm: FC = ({ tableItems={includesTableItems} unsupportedFieldsError={unsupportedFieldsError} setUnsupportedFieldsError={setUnsupportedFieldsError} - loadingItems={loadingFieldOptions} setFormState={setFormState} /> {showScatterplotMatrix && ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/job_type.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/job_type.tsx index 443e2cfacbb5ee..5f54ba3c2bb7c1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/job_type.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/job_type.tsx @@ -82,7 +82,6 @@ export const JobType: FC = ({ type, setFormState }) => { setFormState({ previousJobType: type, jobType, - includes: [], requiredFieldsError: undefined, }); setSelectedCard({ [jobType]: !selectedCard[jobType] }); From bd32299c13036ac28e1a7dd1120dbe4f241a6c15 Mon Sep 17 00:00:00 2001 From: Greg Thompson Date: Mon, 28 Jun 2021 11:31:23 -0500 Subject: [PATCH 017/227] Upgrade EUI to v34.5.1 (#103297) * eui to 34.5.0 * snapshot updates * Fix some page layouts * eui to 34.5.1 Co-authored-by: cchaos --- package.json | 2 +- .../page_template/solution_nav/solution_nav.tsx | 2 +- .../public/components/home/home.component.tsx | 1 - .../settings/__snapshots__/settings.test.tsx.snap | 14 +++++++------- .../home_integration/tutorial_directory_notice.tsx | 2 +- .../entity_by_expression.test.tsx.snap | 2 +- yarn.lock | 11 ++++++----- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index b589153d2af909..b071b587a3620b 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "@elastic/datemath": "link:bazel-bin/packages/elastic-datemath", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@^8.0.0-canary.13", "@elastic/ems-client": "7.14.0", - "@elastic/eui": "34.3.0", + "@elastic/eui": "34.5.1", "@elastic/filesaver": "1.1.2", "@elastic/good": "^9.0.1-kibana3", "@elastic/maki": "6.3.0", diff --git a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx index bd9ee8eb4d0e8d..4aa456f716dbda 100644 --- a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx +++ b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx @@ -17,7 +17,7 @@ import { KibanaPageTemplateSolutionNavAvatarProps, } from './solution_nav_avatar'; -export type KibanaPageTemplateSolutionNavProps = Partial> & { +export type KibanaPageTemplateSolutionNavProps = EuiSideNavProps<{}> & { /** * Name of the solution, i.e. "Observability" */ diff --git a/x-pack/plugins/canvas/public/components/home/home.component.tsx b/x-pack/plugins/canvas/public/components/home/home.component.tsx index 96a773186da2b9..6e98439a0c5301 100644 --- a/x-pack/plugins/canvas/public/components/home/home.component.tsx +++ b/x-pack/plugins/canvas/public/components/home/home.component.tsx @@ -31,7 +31,6 @@ export const Home = ({ activeTab = 'workpads' }: Props) => { pageHeader={{ pageTitle: 'Canvas', rightSideItems: [], - bottomBorder: true, tabs: [ { label: strings.getMyWorkpadsTabLabel(), diff --git a/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/__snapshots__/settings.test.tsx.snap b/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/__snapshots__/settings.test.tsx.snap index 27f0d3610fb9f7..075c0cd386759b 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/__snapshots__/settings.test.tsx.snap +++ b/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/__snapshots__/settings.test.tsx.snap @@ -31,7 +31,7 @@ exports[` can navigate Autoplay Settings 1`] = ` >
can navigate Autoplay Settings 2`] = ` >
can navigate Autoplay Settings 2`] = `
`; -exports[` can navigate Toolbar Settings, closes when activated 3`] = `"

You are in a dialog. To close this dialog, hit escape.

Settings
Hide Toolbar
Hide the toolbar when the mouse is not within the Canvas?
"`; +exports[` can navigate Toolbar Settings, closes when activated 3`] = `"

You are in a dialog. To close this dialog, hit escape.

Settings
Hide Toolbar
Hide the toolbar when the mouse is not within the Canvas?
"`; diff --git a/x-pack/plugins/fleet/public/components/home_integration/tutorial_directory_notice.tsx b/x-pack/plugins/fleet/public/components/home_integration/tutorial_directory_notice.tsx index 5e4357d95235b8..23754571c5bc1e 100644 --- a/x-pack/plugins/fleet/public/components/home_integration/tutorial_directory_notice.tsx +++ b/x-pack/plugins/fleet/public/components/home_integration/tutorial_directory_notice.tsx @@ -66,7 +66,6 @@ const TutorialDirectoryNotice: TutorialDirectoryNoticeComponent = memo(() => { return hasIngestManager && !hasSeenNotice ? ( <> - { + ) : null; }); diff --git a/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap b/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap index d9dd6ec4a0be53..8f59fdd7df000c 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap +++ b/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/__snapshots__/entity_by_expression.test.tsx.snap @@ -141,7 +141,7 @@ exports[`should render entity by expression with aggregatable field options for value="FlightNum" >
{detailFields.length > 0 ? ( - detailFields.map(({ fieldName, label }, index) => ( -
- -

{label}

-
- -
{result[fieldName]}
-
-
- )) + detailFields.map(({ fieldName, label }, index) => { + const value = result[fieldName] as string; + const dateValue = getAsLocalDateTimeString(value); + + return ( +
+ +

{label}

+
+ +
{dateValue || value}
+
+
+ ); + }) ) : ( )} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx index cc890e0f104ac8..e9b8574032916b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx @@ -198,12 +198,16 @@ export const Overview: React.FC = () => { {!custom && ( - {status} {activityDetails && } + + {status} {activityDetails && } + )} - {time} + + {time} + ))} @@ -453,7 +457,7 @@ export const Overview: React.FC = () => { - + @@ -465,7 +469,7 @@ export const Overview: React.FC = () => { )} - + {groups.length > 0 && groupsSummary} {details.length > 0 && {detailsSummary}} From bc097856e61be2dc5285bd11eb22704a8c056647 Mon Sep 17 00:00:00 2001 From: Bhavya RM Date: Mon, 28 Jun 2021 19:33:35 -0400 Subject: [PATCH 053/227] Unskip the reporting screenshots.ts by fixing unable to update UI settings error. (#103184) --- .../functional/apps/dashboard/reporting/screenshots.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts index 7eb2ef74000e09..881b847f1180bd 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts @@ -29,9 +29,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const ecommerceSOPath = 'x-pack/test/functional/fixtures/kbn_archiver/reporting/ecommerce.json'; - // https://github.com/elastic/kibana/issues/102911 - describe.skip('Dashboard Reporting Screenshots', () => { + describe('Dashboard Reporting Screenshots', () => { before('initialize tests', async () => { + await kibanaServer.uiSettings.replace({ + defaultIndex: '5193f870-d861-11e9-a311-0fa548c5f953', + }); + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/reporting/ecommerce'); await kibanaServer.importExport.load(ecommerceSOPath); await browser.setWindowSize(1600, 850); @@ -215,7 +218,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('downloads a PDF file with saved search given EuiDataGrid enabled', async function () { - await kibanaServer.uiSettings.replace({ 'doc_table:legacy': false }); + await kibanaServer.uiSettings.update({ 'doc_table:legacy': false }); this.timeout(300000); await PageObjects.common.navigateToApp('dashboard'); await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); From 1b5cc2a7bc046f8f9870a6f9f74481df7a7b588b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ece=20=C3=96zalp?= Date: Mon, 28 Jun 2021 19:43:38 -0400 Subject: [PATCH 054/227] [Security Solution] Disables loadPrebuiltRulesAndTemplatesButton if loading is in progress (#103568) --- .../load_empty_prompt.test.tsx | 22 +++++++++++++++++++ .../pre_packaged_rules/load_empty_prompt.tsx | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx index 9e482b228018e7..cbdfe5b246affb 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx @@ -127,4 +127,26 @@ describe('LoadPrebuiltRulesAndTemplatesButton', () => { ); }); }); + + it('renders disabled button if loading is true', async () => { + (getPrePackagedRulesStatus as jest.Mock).mockResolvedValue({ + rules_not_installed: 0, + rules_installed: 0, + rules_not_updated: 0, + timelines_not_installed: 3, + timelines_installed: 0, + timelines_not_updated: 0, + }); + + const wrapper: ReactWrapper = mount( + + ); + await waitFor(() => { + wrapper.update(); + + expect( + wrapper.find('[data-test-subj="load-prebuilt-rules"] button').props().disabled + ).toEqual(true); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx index 9a011da9aff059..56875bcc4f88c8 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx @@ -64,12 +64,12 @@ const PrePackagedRulesPromptComponent: React.FC = ( const loadPrebuiltRulesAndTemplatesButton = useMemo( () => getLoadPrebuiltRulesAndTemplatesButton({ - isDisabled: !userHasPermissions, + isDisabled: !userHasPermissions || loading, onClick: handlePreBuiltCreation, fill: true, 'data-test-subj': 'load-prebuilt-rules', }), - [getLoadPrebuiltRulesAndTemplatesButton, handlePreBuiltCreation, userHasPermissions] + [getLoadPrebuiltRulesAndTemplatesButton, handlePreBuiltCreation, userHasPermissions, loading] ); return ( From 7442a99168b56a02514519e0ed3e143a60822811 Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 28 Jun 2021 16:44:29 -0700 Subject: [PATCH 055/227] [dev_docs] add tutorial for setting up a development env (#103566) Co-authored-by: Jonathan Budzenski Co-authored-by: spalger Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../setting_up_a_development_env.mdx | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 dev_docs/tutorials/setting_up_a_development_env.mdx diff --git a/dev_docs/tutorials/setting_up_a_development_env.mdx b/dev_docs/tutorials/setting_up_a_development_env.mdx new file mode 100644 index 00000000000000..449e8b886a44df --- /dev/null +++ b/dev_docs/tutorials/setting_up_a_development_env.mdx @@ -0,0 +1,89 @@ +--- +id: kibDevTutorialSetupDevEnv +slug: /kibana-dev-docs/tutorial/setup-dev-env +title: Setting up a Development Environment +summary: Learn how to setup a development environemnt for contributing to the Kibana repository +date: 2021-04-26 +tags: ['kibana', 'onboarding', 'dev', 'architecture', 'setup'] +--- + +Setting up a development environment is pretty easy. + + + In order to support Windows development we currently require you to use one of the following: + + - [Git Bash](https://git-scm.com/download/win) + - [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/about) + + + Before running the steps below, please make sure you have installed [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48145) and that you are running all commands in either Git Bash or WSL. + + +## Get the code + +Start by forking [the Kibana repository](https://github.com/elastic/kibana) on Github so that you have a place to stage pull requests and create branches for development. + +Then clone the repository to your machine: + +```sh +git clone https://github.com/[YOUR_USERNAME]/kibana.git kibana +cd kibana +``` + +## Install dependencies + +Install the version of Node.js listed in the `.node-version` file. This can be automated with tools such as [nvm](https://github.com/creationix/nvm) or [nvm-windows](https://github.com/coreybutler/nvm-windows). As we also include a `.nvmrc` file you can switch to the correct version when using nvm by running: + +```sh +nvm use +``` + +Then, install the latest version of yarn using: + +```sh +npm install -g yarn +``` + +Finally, boostrap Kibana and install all of the remaining dependencies: + +```sh +yarn kbn bootstrap +``` + +Node.js native modules could be in use and node-gyp is the tool used to build them. There are tools you need to install per platform and python versions you need to be using. Please follow the [node-gyp installation steps](https://github.com/nodejs/node-gyp#installation) for your platform. + +## Run Elasticsearch + +In order to start Kibana you need to run a local version of Elasticsearch. You can startup and initialize the latest Elasticsearch snapshot of the correct version for Kibana by running the following in a new terminal tab/window: + +```sh +yarn es snapshot +``` + +You can pass `--license trial` to start Elasticsearch with a trial license, or use the Kibana UI to switch the local version to a trial version which includes all features. + +Read about more options for [Running Elasticsearch during development](https://www.elastic.co/guide/en/kibana/current/running-elasticsearch.html), like connecting to a remote host, running from source, preserving data inbetween runs, running remote cluster, etc. + +## Run Kibana + +In another terminal tab/window you can start Kibana. + +```sh +yarn start +``` + +If you include the `--run-examples` flag then all of the [developer examples](https://github.com/elastic/kibana/tree/{branch}/examples). Read more about the advanced options for [Running Kibana](https://www.elastic.co/guide/en/kibana/current/running-kibana-advanced.html). + +## Code away! + +You are now ready to start developing. Changes to the source files should be picked up automatically and either cause the server to restart, or be served to the browser on the next page refresh. + +## Install pre-commit hook (optional) + +In case you want to run a couple of checks like linting or check the file casing of the files to commit, we provide a way to install a pre-commit hook. To configure it you just need to run the following: + +```sh +node scripts/register_git_hook +``` + +After the script completes the pre-commit hook will be created within the file `.git/hooks/pre-commit`. If you choose to not install it, don’t worry, we still run a quick CI check to provide feedback earliest as we can about the same checks. From d7d4a14c8d0d51a6085afd8a30b6e192650d2887 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Mon, 28 Jun 2021 18:11:10 -0600 Subject: [PATCH 056/227] [Security Solutions][Detection Engine] Implements best effort merging of constant_keyword, runtime fields, aliases, and copy_to fields (#102280) ## Summary This adds utilities and two strategies for merging using the [fields API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html) and the `_source` document during signal generation. This gives us the ability to support `constant_keyword`, field alias value support, some runtime fields support, and `copy_to` support. Previously we did not copy any of these values and only generated signals based on the `_source` record values. This changes the behavior to allow us to copy some of the mentioned values above. The folder of `source_fields_merging` contains a `strategy` folder and a `utils` folder which contains both the strategies and the utilities for this implementation. The two strategies are `merge_all_fields_with_source` and `merge_missing_fields_with_source`. The defaulted choice for this PR is we use `merge_missing_fields_with_source` and not the `merge_all_fields_with_source`. The reasoning is that this is much lower risk and lower behavior changes to the signals detection engine. The main driving force behind this PR is that ECS has introduced `constant_keyword` and that field has the possibility of only showing up in the fields section of a document and not `_source` when index authors do not push the `constant_keyword` into the `_source` section. The secondary driving forces behind this behavioral change is that some users have been expecting their runtime fields, `copy_to` fields, and field alias values of their indexes to be copied into the signals index. Both strategies of `merge_missing_fields_with_source` and `merge_all_fields_with_source` are considered Best Effort meaning that both strategies will not always merge as expected when they encounter ambiguous use cases as outlined in the `README.md` text at the top of `source_fields_merging` in detail. The default used strategy of `merge_missing_fields_with_source` which has the simplest behavior will work in most common use cases. This is simply if the `_source` document is missing a value that is present in the `fields`, and the `fields` value is a primitive concrete value such as a `string` or `number` or `boolean` and the `_source` document does not contain an existing object or ambiguous array, then the value will be merged into `_source` and a new reference is returned. If you call the strategy twice it should be idempotent meaning that the second call will detect a value is now present in `_source` and not re-merge a second time. * 301 unit tests were added * Extensive README.md docs are added * e2e tests are updated to test scenarios and ambiguity and conflicts from previously to support this effort. * Other e2e tests were updated * One bug with EQL and fields was found with a workaround implemented. See https://github.com/elastic/elasticsearch/issues/74582 * SearchTypes adjusted to use recursive TypeScript types * Changed deprecated for `@deprecated` in a few spots * Removed some `ts-expect-error` in favor of `??` in a few areas * Added a new handling of epoch strings and tests to `detection_engine/signals/utils.ts` since fields returns `epoch_millis` as a string instead of as a number. * Uses lodash safer set to reduce changes of prototype pollution ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### Risk Matrix | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Prototype pollution | Low | High | Used lodash safer set | | Users which have existing rules that work, upgrade and now we do not generate signals due to bad merging of fields and _source | Mid | High | We use the safer strategy method, `merge_missing_fields_with_source `, that is lighter weight to start with. We might add a follow up PR which enables a key in Kibana to turn off merging of fields with source. We added extensive unit tests and e2e tests. However, unexpected unknowns and behaviors from runtime fields and fields API such as geo-points looking like nested fields or `epoch_milliseconds` being a string value or runtime fields allowing invalid values were uncovered and tests and utilities around that have been added which makes this PR risky | | Found a bug with using fields and EQL which caused EQL rules to not run. | Low | High | Implemented workaround for tests to pass and created an Elastic ticket and communicated the bug to EQL developers. | --- .../detection_engine/get_query_filter.test.ts | 30 + .../detection_engine/get_query_filter.ts | 14 + .../common/detection_engine/types.ts | 18 +- .../__mocks__/empty_signal_source_hit.ts | 17 + .../signals/build_bulk_body.test.ts | 24 + .../signals/build_bulk_body.ts | 34 +- .../signals/source_fields_merging/README.md | 389 +++++ .../signals/source_fields_merging/index.ts | 9 + .../source_fields_merging/strategies/index.ts | 8 + .../merge_all_fields_with_source.test.ts | 1478 +++++++++++++++++ .../merge_all_fields_with_source.ts | 113 ++ .../merge_missing_fields_with_source.test.ts | 1379 +++++++++++++++ .../merge_missing_fields_with_source.ts | 88 + .../signals/source_fields_merging/types.ts | 11 + .../utils/array_in_path_exists.test.ts | 42 + .../utils/array_in_path_exists.ts | 23 + .../utils/filter_field_entries.test.ts | 83 + .../utils/filter_field_entries.ts | 32 + .../source_fields_merging/utils/index.ts | 16 + .../utils/is_array_of_primitives.test.ts | 51 + .../utils/is_array_of_primitives.ts | 21 + .../utils/is_invalid_key.test.ts | 51 + .../utils/is_invalid_key.ts | 16 + .../utils/is_multifield.test.ts | 40 + .../utils/is_multifield.ts | 34 + .../utils/is_nested_object.test.ts | 46 + .../utils/is_nested_object.ts | 22 + ...objectlike_or_array_of_objectlikes.test.ts | 71 + .../is_objectlike_or_array_of_objectlikes.ts | 25 + .../utils/is_primitive.test.ts | 42 + .../utils/is_primitive.ts | 16 + .../utils/is_type_object.test.ts | 34 + .../utils/is_type_object.ts | 25 + .../utils/recursive_unboxing_fields.test.ts | 292 ++++ .../utils/recursive_unboxing_fields.ts | 60 + .../lib/detection_engine/signals/types.ts | 27 +- .../detection_engine/signals/utils.test.ts | 39 + .../lib/detection_engine/signals/utils.ts | 9 + .../security_and_spaces/tests/aliases.ts | 7 +- .../security_and_spaces/tests/create_ml.ts | 7 + .../tests/keyword_family/const_keyword.ts | 6 +- .../keyword_mixed_with_const.ts | 6 +- .../security_and_spaces/tests/runtime.ts | 67 +- .../security_solution/alias/data.json | 8 +- .../runtime_conflicting_fields/mappings.json | 5 +- 45 files changed, 4773 insertions(+), 62 deletions(-) create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/empty_signal_source_hit.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/README.md create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/index.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/index.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/types.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/index.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.ts diff --git a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts index 63a38ad7d71c1d..7de082e778a07b 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.test.ts @@ -1143,6 +1143,16 @@ describe('get_filter', () => { ], }, }, + fields: [ + { + field: '*', + include_unmapped: true, + }, + { + field: '@timestamp', + format: 'epoch_millis', + }, + ], }, }); }); @@ -1180,6 +1190,16 @@ describe('get_filter', () => { ], }, }, + fields: [ + { + field: '*', + include_unmapped: true, + }, + { + field: '@timestamp', + format: 'epoch_millis', + }, + ], }, }); }); @@ -1262,6 +1282,16 @@ describe('get_filter', () => { ], }, }, + fields: [ + { + field: '*', + include_unmapped: true, + }, + { + field: '@timestamp', + format: 'epoch_millis', + }, + ], }, }); }); diff --git a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts index 6a61f892747b4a..86e66577abd456 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts @@ -121,6 +121,20 @@ export const buildEqlSearchRequest = ( }, }, event_category_field: eventCategoryOverride, + fields: [ + { + field: '*', + include_unmapped: true, + }, + { + field: '@timestamp', + // BUG: We have to format @timestamp until this bug is fixed with epoch_millis + // https://github.com/elastic/elasticsearch/issues/74582 + // TODO: Remove epoch and use the same techniques from x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_events_query.ts + // where we format both the timestamp and any overrides as ISO8601 + format: 'epoch_millis', + }, + ], }, }; }; diff --git a/x-pack/plugins/security_solution/common/detection_engine/types.ts b/x-pack/plugins/security_solution/common/detection_engine/types.ts index c0e502312b2ffc..e7b8cca8d5a97f 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/types.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/types.ts @@ -11,16 +11,14 @@ export type RuleAlertAction = Omit & { action_type_id: string; }; -export type SearchTypes = - | string - | string[] - | number - | number[] - | boolean - | boolean[] - | object - | object[] - | undefined; +/** + * Defines the search types you can have from Elasticsearch within a + * doc._source. It uses recursive types of "| SearchTypes[]" to designate + * anything can also be of a type array, and it uses the recursive type of + * "| { [property: string]: SearchTypes }" to designate you can can sub-objects + * or sub-sub-objects, etc... + */ +export type SearchTypes = string | number | boolean | object | SearchTypes[] | undefined; export interface Explanation { value: number; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/empty_signal_source_hit.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/empty_signal_source_hit.ts new file mode 100644 index 00000000000000..805a401f782fab --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/__mocks__/empty_signal_source_hit.ts @@ -0,0 +1,17 @@ +/* + * 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 { SignalSourceHit } from '../types'; + +/** + * Simple empty Elasticsearch result for testing + * @returns Empty Elasticsearch result for testing + */ +export const emptyEsResult = (): SignalSourceHit => ({ + _index: 'index', + _id: '123', +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts index 4d3ca26f5a71e2..4053d64539c498 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.test.ts @@ -77,6 +77,9 @@ describe('buildBulkBody', () => { rule: expectedRule(), depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -160,6 +163,9 @@ describe('buildBulkBody', () => { }, depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -222,6 +228,9 @@ describe('buildBulkBody', () => { rule: expectedRule(), depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -282,6 +291,9 @@ describe('buildBulkBody', () => { rule: expectedRule(), depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -335,6 +347,9 @@ describe('buildBulkBody', () => { rule: expectedRule(), depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -388,6 +403,9 @@ describe('buildBulkBody', () => { rule: expectedRule(), depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -441,6 +459,9 @@ describe('buildBulkBody', () => { rule: expectedRule(), depth: 1, }, + source: { + ip: '127.0.0.1', + }, }; expect(fakeSignalSourceHit).toEqual(expected); }); @@ -673,6 +694,9 @@ describe('buildSignalFromEvent', () => { rule: expectedRule(), depth: 2, }, + source: { + ip: '127.0.0.1', + }, }; expect(signal).toEqual(expected); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.ts index 10cc1687004470..819e1f3eb6df1e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_bulk_body.ts @@ -6,6 +6,7 @@ */ import { SavedObject } from 'src/core/types'; +import { mergeMissingFieldsWithSource } from './source_fields_merging/strategies/merge_missing_fields_with_source'; import { AlertAttributes, SignalSourceHit, @@ -21,18 +22,27 @@ import { buildEventTypeSignal } from './build_event_type_signal'; import { EqlSequence } from '../../../../common/detection_engine/types'; import { generateSignalId, wrapBuildingBlocks, wrapSignal } from './utils'; -// format search_after result for signals index. +/** + * Formats the search_after result for insertion into the signals index. We first create a + * "best effort" merged "fields" with the "_source" object, then build the signal object, + * then the event object, and finally we strip away any additional temporary data that was added + * such as the "threshold_result". + * @param ruleSO The rule saved object to build overrides + * @param doc The SignalSourceHit with "_source", "fields", and additional data such as "threshold_result" + * @returns The body that can be added to a bulk call for inserting the signal. + */ export const buildBulkBody = ( ruleSO: SavedObject, doc: SignalSourceHit ): SignalHit => { - const rule = buildRuleWithOverrides(ruleSO, doc._source!); + const mergedDoc = mergeMissingFieldsWithSource({ doc }); + const rule = buildRuleWithOverrides(ruleSO, mergedDoc._source ?? {}); const signal: Signal = { - ...buildSignal([doc], rule), - ...additionalSignalFields(doc), + ...buildSignal([mergedDoc], rule), + ...additionalSignalFields(mergedDoc), }; - const event = buildEventTypeSignal(doc); - const { threshold_result: thresholdResult, ...filteredSource } = doc._source || { + const event = buildEventTypeSignal(mergedDoc); + const { threshold_result: thresholdResult, ...filteredSource } = mergedDoc._source || { threshold_result: null, }; const signalHit: SignalHit = { @@ -122,18 +132,18 @@ export const buildSignalFromEvent = ( ruleSO: SavedObject, applyOverrides: boolean ): SignalHit => { + const mergedEvent = mergeMissingFieldsWithSource({ doc: event }); const rule = applyOverrides - ? // @ts-expect-error @elastic/elasticsearch _source is optional - buildRuleWithOverrides(ruleSO, event._source) + ? buildRuleWithOverrides(ruleSO, mergedEvent._source ?? {}) : buildRuleWithoutOverrides(ruleSO); const signal: Signal = { - ...buildSignal([event], rule), - ...additionalSignalFields(event), + ...buildSignal([mergedEvent], rule), + ...additionalSignalFields(mergedEvent), }; - const eventFields = buildEventTypeSignal(event); + const eventFields = buildEventTypeSignal(mergedEvent); // TODO: better naming for SignalHit - it's really a new signal to be inserted const signalHit: SignalHit = { - ...event._source, + ...mergedEvent._source, '@timestamp': new Date().toISOString(), event: eventFields, signal, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/README.md b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/README.md new file mode 100644 index 00000000000000..eb72fc2b32687c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/README.md @@ -0,0 +1,389 @@ +Set of utilities for merging between `_source` and `fields` are within this folder as well as strategies for merging between these two. + +See `strategies` for the strategies for merging between `_source` and `fields`. See the `utils` folder for the different utilities +which the strategies utilize for help in building their merged documents. + +If we run into problems such as ambiguities, uncertainties, or data type contradictions then we will prefer the value within +"doc.fields" when we can. If "doc.fields" contradicts its self or is too ambiguous, then we assume that +there a problem within "doc.fields" due to a malformed runtime field definition and omit the last seen +contradiction. In some cases we might have to omit the merging of the field altogether and instead utilize +the value from "doc._source" + +Hence, these are labeled as "best effort" since we could run into conditions where we should have taken the value +from "doc.fields" but instead did not and took the value from "doc._source". + +If "doc.fields" does not exist we return "doc._source" untouched as-is. If "doc._source" does not exist but +"doc.fields" does exist then we will do a "best effort" to merge "doc.fields" into a fully functional object as +if it was a "doc._source". But again, if we run into contradictions or ambiguities from the +"doc.fields" we will remove that field or omit one of the contradictions. + +If a "doc.field" is found that does not exist in "doc._source" then we merge that "doc.field" into our +return object. + +If we find that a "field" contradicts the "doc._source" object in which we cannot create a regular +JSON such as a keyword trying to override an object or an object trying to override a keyword: + +``` +"fields": { 'foo': 'value_1', foo.bar': 'value_2' } <-- Foo cannot be both an object and a value +``` +Then you will get an object such as + +``` +{ "foo": "value_1" } +``` + +We cannot merge both together as this is a contradiction and no longer capable of being a JSON object. +This happens when we have multiFields since multiFields are represented in fields as well as when runtime +fields tries to add multiple overrides or invalid multiFields. + +Invalid field names such as ".", "..", ".foo", "foo.", ".foo." will be skipped as those cause errors if +we tried to insert them into Elasticsearch as a new field. + +If we encounter an array within "doc._source" that contains an object with more than 1 value and a "field" +tries to add a new element we will not merge that in as we do not know which array to merge that value into. + +If we encounter a flattened array in the fields object which is not a nested fields such as: +``` +"fields": { "object_name.first" : [ "foo", "bar" ], "object_name.second" : [ "mars", "bar" ] } +``` + +and no "doc._source" with the name "object_name", the assumption is that we these are not related and we construct the object as this: + +``` +{ "object.name": { "first": ["foo", "bar" }, "second": ["mars", "bar"] } +``` + +If we detect a "doc._source with a single flattened array sub objects we will prefer the "fields" flattened +array elements and copy them over as-is, which means we could be subtracting elements, adding elements, or +completely changing the items from the array. + +If we detect an object within the "doc._source" inside of the array, we will not take anything from the +"fields" flattened array elements even if they exist as it is ambiguous where we would put those elements +within the ""doc._source" as an override. + +It is best to feed this both the "doc._source" and "doc.fields" values to get the best chances of merging the document correctly. + +Using these strategies will get you these value types merged that you would otherwise not get directly on your +``` +"doc._source": + - constant_keyword field + - runtime fields + - field aliases + - copy_to +``` + +References: +--- + * https://www.elastic.co/guide/en/elasticsearch/reference/7.13/keyword.html#constant-keyword-field-type + * https://www.elastic.co/guide/en/elasticsearch/reference/7.13/runtime.html + * https://www.elastic.co/guide/en/elasticsearch/reference/7.13/search-fields.html + +Ambiguities and issues +--- +* geo data points/types and nested fields look the same. +* multi-fields such as `host.name` and `host.name.keyword` can lead to misinterpreting valid values vs multi-fields +* All data is an array with at least 1 value we call "boxed", meaning that it is difficult to determine if the user wanted the fields as an array or not. + +Existing bugs and ambiguities +--- +* We currently filter out the geo data points by looking at "type" on the object and filter it out. We could transform it to be valid input at some point. + +Tests +--- +Some tests in this folder use a special table and nomenclature in the comments to show the enumerations and tests for each type. + +Key for the nomenclature is: +``` +undefined means non-existent +p_[] means primitive key and empty array +p_p1 or p_p2 means primitive key and primitive value +p_[p1] or p_[p2] means primitive key and primitive array with a single array value +p[p1, ...1] or p[p2, ...2] means primitive array with 2 or more values +p_{}1 or p_{}2 means a primitive key with a single object +p_[{}1] or p_[{}2] means a primitive key with an array of exactly 1 object +p_[{}1, ...1] or p_[{}2, ...2] means a primitive key with 2 or more array elements +f_[] means a flattened object key and empty array +f_p1 or f_p2 means a flattened object key and a primitive value +f_[p1] or f_[p2] means a flattened object key and a single primitive value in an array +f_[p1, ...1] or f_[p2, ...2] means a flattened object key and 2 or more primitive values in an array +f_{}1 or f_{}2 means a flattened object key with 1 object +f_[{}1] or f_[{}2] means a flattened object key with a single object in a single array +f_[{}1, ...1] or f_[{}2, ...2] means a flattened object key with 2 or more objects in an array +``` + +`_source` documents can contain the following values: +``` +undefined +p_[] +p_p1 +p_[p1] +p_[p1, ...1] +p_{}1 +p_[{}1] +p_[{}1, ...1] +f_[] +f_p1 +f_[p1] +f_[p1, ...1] +f_{}1 +f_[{}1] +f_[{}1, ...1] +``` + +fields arrays can contain the following values: +``` +undefined +f_[] +f_[p2] +f_[p2, ...2] +f_[{}2] +f_[{}2, ...2] +``` + +When fields is undefined or empty array f_[] you never overwrite +the source and source is always the same as before the merge for all the strategies +``` +source | fields | value after merge +----- | --------- | ----- +undefined | undefined | undefined +undefined | f_[] | undefined +p_[] | undefined | p_[] +p_[] | f_[] | p_[] +p_p1 | undefined | p_p1 +p_p1 | f_[] | p_p1 +p_[p1] | undefined | p_[p1] +p_[p1] | f_[] | p_[p1] +p_[p1, ...1] | undefined | p_[p1, ...1] +p_[p1, ...1] | f_[] | p_[p1, ...1] +p_{}1 | undefined | p_{}1 +p_{}1 | f_[] | p_{}1 +p_[{}1] | undefined | p_{}1 +p_[{}1] | f_[] | p_{}1 +p_[{}1, ...1] | undefined | p_[{}1, ...1] +p_[{}1, ...1] | f_[] | p_[{}1, ...1] +f_[] | undefined | f_[] +f_[] | f_[] | f_[] +f_p1 | undefined | f_p1 +f_p1 | f_[] | f_p1 +f_[p1] | undefined | f_[p1] +f_[p1] | f_[] | f_[p1] +f_[p1, ...1] | undefined | f_[p1, ...1] +f_[p1, ...1] | f_[] | f_[p1, ...1] +f_{}1 | undefined | f_{}1 +f_{}1 | f_[] | f_{}1 +f_[{}1] | undefined | f_{}1 +f_[{}1] | f_[] | f_{}1 +f_[{}1, ...1] | undefined | f_[{}1, ...1] +f_[{}1, ...1] | f_[] | f_[{}1, ...1] +``` + +When source key and source value does not exist but field keys and values do exist, then you +you will always get field keys and values replacing the source key and value. Caveat is that +fields will create a single item rather than an array item if field keys and value only has a single +array element. Also, we prefer to create an object structure in source (e.x. p_p2 instead of a flattened object f_p2) +for the `merge_all_fields_with_source` strategy +``` +source | fields | value after merge +----- | --------- | ----- +undefined | f_[p2] | p_p2 <-- Unboxed from array +undefined | f_[p2, ...2] | p_[p2, ...2] +undefined | f_[{}2] | p_{}2 <-- Unboxed from array +undefined | f_[{}2, ...2] | p_[{}2, ...2] +``` + +For the `merge_missing_fields_with_source` it will be that we completely skip the fields that contain nested +fields or type fields such as geo points. + +``` +source | fields | value after merge +----- | --------- | ----- +undefined | f_[p2] | p_p2 <-- Unboxed from array +undefined | f_[p2, ...2] | p_[p2, ...2] +undefined | f_[{}2] | {} <-- We have an empty object since we only merge primitives +undefined | f_[{}2, ...2] | {} <-- We have an empty object since we only merge primitives +``` + +When source key is either a primitive key or a flattened object key with a primitive value (p_p1 or f_p1), +then we overwrite source value with fields value as an unboxed value array if fields value is a +single array element (f_[p2] or f[{}2]), otherwise we overwrite source as an array. + +``` +source | fields | value after merge +----- | --------- | ----- +p_p1 | f_[p2] | p_p2 <-- Unboxed from array +p_p1 | f_[p2, ...2] | p_[p2, ...2] +p_p1 | f_[{}2] | p_{}2 <-- Unboxed from array +p_p1 | f_[{}2, ...2] | p_[{}2, ...2] + +f_p1 | f_[p2] | f_p2 <-- Unboxed from array +f_p1 | f_[p2, ...2] | f_[p2, ...2] +f_p1 | f_[{}2] | f_{}2 <-- Unboxed from array +f_p1 | f_[{}2, ...2] | f_[{}2, ...2] +``` + +For the `merge_missing_fields_with_source` none of these will be merged since the source has values such as + +``` +source | fields | value after merge +----- | --------- | ----- +p_p1 | f_[p2] | p_p1 +p_p1 | f_[p2, ...2] | p_p1 +p_p1 | f_[{}2] | p_p1 +p_p1 | f_[{}2, ...2] | p_p1 + +f_p1 | f_[p2] | f_p1 +f_p1 | f_[p2, ...2] | f_p1 +f_p1 | f_[{}2] | f_p1 +f_p1 | f_[{}2, ...2] | f_p1 +``` + +When source key is a primitive key or a flattened object key and the source value is any +type of array (p_[], p_p[p1], or p_p[p1, ...1]) of primitives then we always copy the +fields value as is and keep the source key as it was originally (primitive or flattened) + +``` +source | fields | value after merge +----- | --------- | ----- +p_[] | f_[p2] | p_[p2] +p_[] | f_[p2, ...2] | p_[p2, ...2] +p_[] | f_[{}2] | p_[{}2] +p_[] | f_[{}2, ...2] | p_[{}2, ...2] + +f_[] | f_[p2] | f_[p2] +f_[] | f_[p2, ...2] | f_[p2, ...2] +f_[] | f_[{}2] | f_[{}2] +f_[] | f_[{}2, ...2] | f_[{}2, ...2] + +p_[p1] | f_[p2] | p_[p2] +p_[p1] | f_[p2, ...2] | p_[p2, ...2] +p_[p1] | f_[{}2] | p_[{}2] +p_[p1] | f_[{}2, ...2] | p_[{}2, ...2] + +f_[p1] | f_[p2] | f_[p2] +f_[p1] | f_[p2, ...2] | f_[p2, ...2] +f_[p1] | f_[{}2] | f_{}2 +f_[p1] | f_[{}2, ...2] | f_[{}2, ...2] + +p_[p1, ...1] | f_[p2] | p_[p2] +p_[p1, ...1] | f_[p2, ...2] | p_[p2, ...2] +p_[p1, ...1] | f_[{}2] | p_[{}2] +p_[p1, ...1] | f_[{}2, ...2] | p_[{}2, ...2] + +f_[p1, ...1] | f_[p2] | f_[p2] +f_[p1, ...1] | f_[p2, ...2] | f_[p2, ...2] +f_[p1, ...1] | f_[{}2] | f_[{}2] +f_[p1, ...1] | f_[{}2, ...2] | f_[{}2, ...2] +``` + +For the `merge_missing_fields_with_source` none of these will be merged since the source has values such as + +``` +source | fields | value after merge +----- | --------- | ----- +p_[] | f_[p2] | p_[] +p_[] | f_[p2, ...2] | p_[] +p_[] | f_[{}2] | p_[] +p_[] | f_[{}2, ...2] | p_[] + +f_[] | f_[p2] | f_[] +f_[] | f_[p2, ...2] | f_[] +f_[] | f_[{}2] | f_[] +f_[] | f_[{}2, ...2] | f_[] + +p_[p1] | f_[p2] | p_[p1] +p_[p1] | f_[p2, ...2] | p_[p1] +p_[p1] | f_[{}2] | p_[p1] +p_[p1] | f_[{}2, ...2] | p_[p1] + +f_[p1] | f_[p2] | f_[p1] +f_[p1] | f_[p2, ...2] | f_[p1] +f_[p1] | f_[{}2] | f_[p1] +f_[p1] | f_[{}2, ...2] | f_[p1] + +p_[p1, ...1] | f_[p2] | p_[p1, ...1] +p_[p1, ...1] | f_[p2, ...2] | p_[p1, ...1] +p_[p1, ...1] | f_[{}2] | p_[p1, ...1] +p_[p1, ...1] | f_[{}2, ...2] | p_[p1, ...1] + +f_[p1, ...1] | f_[p2] | f_[p1, ...1] +f_[p1, ...1] | f_[p2, ...2] | f_[p1, ...1] +f_[p1, ...1] | f_[{}2] | f_[p1, ...1] +f_[p1, ...1] | f_[{}2, ...2] | f_[p1, ...1] +``` + +When source key is a primitive key or flattened key and the source value is an object (p_{}1, f_{}1) or +an array containing objects ([p_{1}], f_{}1, p_[{}1, ...1], f_[{}1, ...1]), we only copy the +field value if we detect that field value is also an object meaning that it is a nested field, +(f_[{}]2 or f[{}2, ...2]). We never allow a field to convert an object back into a value. +We never try to merge field values into the array either since they're flattened in the fields and we +will have too many ambiguities and issues between the flattened array values and the source objects. + +``` +source | fields | value after merge +----- | --------- | ----- +p_{}1 | f_[p2] | p_{}1 +p_{}1 | f_[p2, ...2] | p_{}1 +p_{}1 | f_[{}2] | p_{}2 <-- Copied and unboxed array since we detected a nested field +p_{}1 | f_[{}2, ...2] | p_[{}2, ...2] <-- Copied since we detected a nested field + +f_{}1 | f_[p2] | f_{}1 +f_{}1 | f_[p2, ...2] | f_{}1 +f_{}1 | f_[{}2] | f_{}2 <-- Copied and unboxed array since we detected a nested field +f_{}1 | f_[{}2, ...2] | f_[{}2, ...2] <-- Copied since we detected a nested field + +p_[{}1] | f_[p2] | p_[{}1] +p_[{}1] | f_[p2, ...2] | p_[{}1] +p_[{}1] | f_[{}2] | p_[{}2] <-- Copied since we detected a nested field +p_[{}1] | f_[{}2, ...2] | p_[{}2, ...2] <-- Copied since we detected a nested field + +f_[{}1] | f_[p2] | f_[{}1] +f_[{}1] | f_[p2, ...2] | f_[{}1] +f_[{}1] | f_[{}2] | f_[{}2] <-- Copied since we detected a nested field +f_[{}1] | f_[{}2, ...2] | f_[{}2, ...2] <-- Copied since we detected a nested field + +p_[{}1, ...1] | f_[p2] | p_[{}1, ...1] +p_[{}1, ...1] | f_[p2, ...2] | p_[{}1, ...1] +p_[{}1, ...1] | f_[{}2] | p_[{}2] <-- Copied since we detected a nested field +p_[{}1, ...1] | f_[{}2, ...2] | p_[{}2, ...2] <-- Copied since we detected a nested field + +f_[{}1, ...1] | f_[p2] | f_[{}1, ...1] +f_[{}1, ...1] | f_[p2, ...2] | f_[{}1, ...1] +f_[{}1, ...1] | f_[{}2] | f_[{}2] <-- Copied since we detected a nested field +f_[{}1, ...1] | f_[{}2, ...2] | f_[{}2, ...2] <-- Copied since we detected a nested field +``` + +For the `merge_missing_fields_with_source` none of these will be merged since the source has values such as + +``` +source | fields | value after merge +----- | --------- | ----- +p_{}1 | f_[p2] | p_{}1 +p_{}1 | f_[p2, ...2] | p_{}1 +p_{}1 | f_[{}2] | p_{}1 +p_{}1 | f_[{}2, ...2] | p_{}1 + +f_{}1 | f_[p2] | f_{}1 +f_{}1 | f_[p2, ...2] | f_{}1 +f_{}1 | f_[{}2] | f_{}1 +f_{}1 | f_[{}2, ...2] | f_{}1 + +p_[{}1] | f_[p2] | p_[{}1] +p_[{}1] | f_[p2, ...2] | p_[{}1] +p_[{}1] | f_[{}2] | p_[{}1] +p_[{}1] | f_[{}2, ...2] | p_[{}1] + +f_[{}1] | f_[p2] | f_[{}1] +f_[{}1] | f_[p2, ...2] | f_[{}1] +f_[{}1] | f_[{}2] | f_[{}1] +f_[{}1] | f_[{}2, ...2] | f_[{}1] + +p_[{}1, ...1] | f_[p2] | p_[{}1, ...1] +p_[{}1, ...1] | f_[p2, ...2] | p_[{}1, ...1] +p_[{}1, ...1] | f_[{}2] | p_[{}1, ...1] +p_[{}1, ...1] | f_[{}2, ...2] | p_[{}1, ...1] + +f_[{}1, ...1] | f_[p2] | f_[{}1, ...1] +f_[{}1, ...1] | f_[p2, ...2] | f_[{}1, ...1] +f_[{}1, ...1] | f_[{}2] | f_[{}1, ...1] +f_[{}1, ...1] | f_[{}2, ...2] | f_[{}1, ...1] +``` diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/index.ts new file mode 100644 index 00000000000000..ff07c898a3a243 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ +export * from './types'; +export * from './strategies'; +export * from './utils'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/index.ts new file mode 100644 index 00000000000000..212eba9c6c3be5 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ +export * from './merge_all_fields_with_source'; +export * from './merge_missing_fields_with_source'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.test.ts new file mode 100644 index 00000000000000..b900ea268fd6eb --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.test.ts @@ -0,0 +1,1478 @@ +/* + * 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 { mergeAllFieldsWithSource } from './merge_all_fields_with_source'; +import { SignalSourceHit } from '../../types'; +import { emptyEsResult } from '../../__mocks__/empty_signal_source_hit'; + +/** + * See ../README.md for the nomenclature of any notes within tests below + */ +describe('merge_all_fields_with_source', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + /** Get the return type of the mergeAllFieldsWithSource for TypeScript checks against expected */ + type ReturnTypeMergeFieldsWithSource = ReturnType['_source']; + + describe('fields is "undefined"', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | undefined | undefined + * p_[] | undefined | p_[] + * p_p1 | undefined | p_p1 + * p_[p1] | undefined | p_[p1] + * p_[p1, ...1] | undefined | p_[p1, ...1] + * p_{}1 | undefined | p_{}1 + * p_[{}1] | undefined | p_{}1 + * p_[{}1, ...1] | undefined | p_[{}1, ...1] + */ + describe('primitive keys in the _source document', () => { + /** fields is "undefined" for all tests below */ + const fields: SignalSourceHit['fields'] = {}; + + test('when source is "undefined", merged doc is "undefined"', () => { + const _source: SignalSourceHit['_source'] = {}; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an empty array (p_[]), merged doc is empty array (p_[])"', () => { + const _source: SignalSourceHit['_source'] = { + foo: [], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (p_p1), merged doc is primitive (p_p1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: 'value', + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (p_[p1]), merged doc is primitive (p_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: ['value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (p_[p1, ..1]), merged doc is primitive (p_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (p_{}), merged doc is single object (p_{})', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'some value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object (p_[{}1]), merged doc is single object (p_[{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (p_[{}, ...1]), merged doc is the same (p_[{}, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }, { foo: 'some other value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | undefined | undefined + * f_[] | undefined | f_[] + * f_p1 | undefined | f_p1 + * f_[p1] | undefined | f_[p1] + * f_[p1, ...1] | undefined | f_[p1, ...1] + * f_{}1 | undefined | f_{}1 + * f_[{}1] | undefined | f_{}1 + * f_[{}1, ...1] | undefined | f_[{}1, ...1] + */ + describe('flattened object keys in the _source document', () => { + /** fields is "undefined" for all tests below */ + const fields: SignalSourceHit['fields'] = {}; + + test('when source is an empty array (f_[]), merged doc is empty array (f_[])"', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (f_p1), merged doc is primitive (f_p1)', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': 'value', + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (f_[p1]), merged doc is primitive (f_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (f_[p1, ...1]), merged doc is primitive (f_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (f_{}1), merged doc is single object (f_{}1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'some value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object ([f_{}1]), merged doc is single object ([f_{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (f_[{}1, ...1]), merged doc is the same (f_[{}1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }, { foo: 'some other value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + describe('fields is "[]"', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | f_[] | undefined + * p_[] | f_[] | p_[] + * p_p1 | f_[] | p_p1 + * p_[p1] | f_[] | p_[p1] + * p_[p1, ...1] | f_[] | p_[p1, ...1] + * p_{}1 | f_[] | p_{}1 + * p_[{}1] | f_[] | p_{}1 + * p_[{}1, ...1] | f_[] | p_[{}1, ...1] + */ + describe('primitive keys in the _source document', () => { + /** fields is a flattened object key and an empty array value (p_[]) */ + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [], + }; + + test('when source is an empty array (p_[]), merged doc is empty array (p_[])"', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: [] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (p_p1), merged doc is primitive (p_p1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (p_[p1]), merged doc is primitive (p_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: ['value'] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (p_[p1, ..1]), merged doc is primitive (p_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: ['value_1', 'value_2'] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (p_{}), merged doc is single object (p_{})', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: { mars: 'some value' } }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object (p_[{}1]), merged doc is single object (p_[{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: 'some value' }] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (p_[{}, ...1]), merged doc is the same (p_[{}, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: 'some value' }, { mars: 'some other value' }] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | f_[] | undefined + * f_[] | f_[] | f_[] + * f_p1 | f_[] | f_p1 + * f_[p1] | f_[] | f_[p1] + * f_[p1, ...1] | f_[] | f_[p1, ...1] + * f_{}1 | f_[] | f_{}1 + * f_[{}1] | f_[] | f_{}1 + * f_[{}1, ...1] | f_[] | f_[{}1, ...1] + */ + describe('flattened object keys in the _source document', () => { + /** fields is flattened object key with an empty array for a value (f_[]) */ + const fields: SignalSourceHit['fields'] = { + 'bar.foo': [], + }; + + test('when source is an empty array (f_[]), merged doc is empty array (f_[])"', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': [], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (f_p1), merged doc is primitive (f_p1)', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': 'value', + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (f_[p1]), merged doc is primitive (f_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': ['value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (f_[p1, ...1]), merged doc is primitive (f_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (f_{}1), merged doc is single object (f_{}1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'some value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object ([f_{}1]), merged doc is single object ([f_{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (f_[{}1, ...1]), merged doc is the same (f_[{}1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }, { foo: 'some other value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | f_[p2] | p_p2 <-- Unboxed from array + * undefined | f_[p2, ...2] | p_[p2, ...2] + * undefined | f_[{}2] | p_{}2 <-- Unboxed from array + * undefined | f_[{}2, ...2] | p_[{}2, ...2] + */ + describe('source is "undefined"', () => { + /** _source is "undefined" for all tests below */ + const _source: SignalSourceHit['_source'] = {}; + + test('fields is a single primitive value (f_[p2]), merged doc is an unboxed array element p_p2"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: 'other_value_1', + }, + }); + }); + + test('fields is a multiple primitive values (f_[p2, ...2]), merged doc is the array (f_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: ['other_value_1', 'other_value_2'], + }, + }); + }); + + test('fields is a single nested field value (f_[{}2]), merged doc is the unboxed array element (p_{}2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: { zed: 'other_value_1' } }, + }); + }); + + test('fields is multiple nested field values (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }] }, + }); + }); + }); + + describe('source is either primitive or flattened keys, with primitive values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_p1 | f_[p2] | p_p2 <-- Unboxed from array + * p_p1 | f_[p2, ...2] | p_[p2, ...2] + * p_p1 | f_[{}2] | p_{}2 <-- Unboxed from array + * p_p1 | f_[{}2, ...2] | p_[{}2, ...2] + */ + describe('primitive keys in the _source document with the value of "value" (p_p1)', () => { + /** _source is a single primitive key with a primitive value for all tests below (p_p1) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'value' }, + }; + + test('fields is single array primitive value (f_[p2]), merged doc is unboxed primitive key and value (p_p2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: 'other_value_1', + }, + }); + }); + + test('fields has single primitive values (f_[p2, ...2]), merged doc is the array (p_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: ['other_value_1', 'other_value_2'] }, + }); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed array (p_{}2)"', () => { + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: 'other_value_1', + }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: 'other_value_1' }, { bar: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: [{ bar: 'other_value_1' }, { bar: 'other_value_2' }], + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_p1 | f_[p2] | f_p2 <-- Unboxed from array + * f_p1 | f_[p2, ...2] | f_[p2, ...2] + * f_p1 | f_[{}2] | f_{}2 <-- Unboxed from array + * f_p1 | f_[{}2, ...2] | f_[{}2, ...2] + */ + describe('flattened object keys in the _source document (f_p1)', () => { + /** _source is a flattened object key with a primitive value for all tests below (f_p1) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': 'value', + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is unboxed primitive key and value (f_p2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + 'foo.bar': 'other_value_1', + }); + }); + + test('fields has single primitive value (f_[p2, ...2]), merged doc is the array (f_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed array (f_{}2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + 'foo.bar': { zed: 'other_value_1' }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + }); + }); + + describe('source is either primitive or flattened keys, with primitive array values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[] | f_[p2] | p_[p2] + * p_[] | f_[p2, ...2] | p_[p2, ...2] + * p_[] | f_[{}2] | p_[{}2] + * p_[] | f_[{}2, ...2] | p_[{}2, ...2] + */ + describe('primitive keys in the _source document with empty array (p_[])', () => { + /** _source is a primitive key with an empty array for all tests below (p_[]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: [] }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is array value (p_[p2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: ['other_value_1'] }, + }); + }); + + test('fields has single primitive values (f_[p2, ...2]), merged doc is the array (p_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: ['other_value_1', 'other_value_2'] }, + }); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array value (p_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }] }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }] }, + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[] | f_[p2] | f_[p2] + * f_[] | f_[p2, ...2] | f_[p2, ...2] + * f_[] | f_[{}2] | f_[{}2] + * f_[] | f_[{}2, ...2] | f_[{}2, ...2] + */ + describe('flattened object keys in the _source document with empty array (f_[])', () => { + /** _source is a flattened object key with an empty array for all tests below (f_[]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is array (f_[p2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple primitive values (f_[p2, ...2]), merged doc is the array (f_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (f_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[p1] | f_[p2] | p_[p2] + * p_[p1] | f_[p2, ...2] | p_[p2, ...2] + * p_[p1] | f_[{}2] | p_[{}2] + * p_[p1] | f_[{}2, ...2] | p_[{}2, ...2] + */ + describe('primitive keys in the _source document with single primitive value in an array (p_[p1])', () => { + /** _source is a primitive key with a single primitive array value for all tests below (p_[p1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: ['value'] }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the array value (p_[p2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: ['other_value_1'] }, + }); + }); + + test('fields has single primitive value (f_[p2, ...2]), merged doc is the array (p_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: ['other_value_1', 'other_value_2'] }, + }); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (p_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }] }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }] }, + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[p1] | f_[p2] | f_[p2] + * f_[p1] | f_[p2, ...2] | f_[p2, ...2] + * f_[p1] | f_[{}2] | f_[{}2] + * f_[p1] | f_[{}2, ...2] | f_[{}2, ...2] + */ + describe('flattened keys in the _source document with single flattened value in an array (f_[p1])', () => { + /** _source is a flattened object key with a single primitive value for all tests below (f_p[p1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value'], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is array value (f_[p2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has single primitive value (f_[p2, ...2]), merged doc is the array (f_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (f_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[p1, ...1] | f_[p2] | p_[p2] + * p_[p1, ...1] | f_[p2, ...2] | p_[p2, ...2] + * p_[p1, ...1] | f_[{}2] | p_[{}2] + * p_[p1, ...1] | f_[{}2, ...2] | p_[{}2, ...2] + */ + describe('primitive keys in the _source document with multiple array values in an array (p_[p1, ...1])', () => { + /** _source is a primitive key with an array of 2 or more elements for all tests below (p_[p1, ...1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { + bar: ['value_1', 'value_2'], + }, + }; + + test('fields is single array value (f_[p2]), merged doc is array (p_[p2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: ['other_value_1'], + }, + }); + }); + + test('fields is multiple primitive values (f_[p2, ...2]), merged doc is the array (p_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: ['other_value_1', 'other_value_2'], + }, + }); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed value (p_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: [{ zed: 'other_value_1' }], + }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }, + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[p1, ...1] | f_[p2] | f_[p2] + * f_[p1, ...1] | f_[p2, ...2] | f_[p2, ...2] + * f_[p1, ...1] | f_[{}2] | f_[{}2] + * f_[p1, ...1] | f_[{}2, ...2] | f_[{}2, ...2] + */ + describe('flattened keys in the _source document with multiple array values in an array (f_[p1, ...1])', () => { + /** _source is a flattened object key with an array of 2 or more elements for all tests below (f_[p1, ...1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value_1', 'value_2'], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is unboxed primitive key and value (f_p2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple primitive values (f_[p2, ...2]), merged doc is the array (f_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (f_{}2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + }); + }); + + describe('source is either primitive or flattened keys, with object values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_{}1 | f_[p2] | p_{}1 + * p_{}1 | f_[p2, ...2] | p_{}1 + * p_{}1 | f_[{}2] | p_{}2 <-- Copied and unboxed array since we detected a nested field + * p_{}1 | f_[{}2, ...2] | p_[{}2, ...2] <-- Copied since we detected a nested field + */ + describe('primitive keys in the _source document with the value of "value" (p_{}1)', () => { + /** _source is a primitive key with an object value for all tests below (p_{}1) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: { mars: 'value_1' } }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same source (p_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive values (f_[p2, ...2]), merged doc is the same _source (p_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed array value (p_{}2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: { zed: 'other_value_1' } }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }] }, + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_{}1 | f_[p2] | f_{}1 + * f_{}1 | f_[p2, ...2] | f_{}1 + * f_{}1 | f_[{}2] | f_{}2 <-- Copied and unboxed array since we detected a nested field + * f_{}1 | f_[{}2, ...2] | f_[{}2, ...2] <-- Copied since we detected a nested field + */ + describe('flattened object keys in the _source document with the value of "value" (f_{}1)', () => { + /** _source is a flattened object key with an object value for all tests below (f_{}1) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': { mars: 'value_1' }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same source (f_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has primitive values (f_[p2, ...2]), merged doc is the same _source (f_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is unboxed array value (f_{}2)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + 'foo.bar': { mars: 'other_value_1' }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }); + }); + }); + }); + + describe('source is either primitive or flattened keys, with object array values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[{}1] | f_[p2] | p_[{}1] + * p_[{}1] | f_[p2, ...2] | p_[{}1] + * p_[{}1] | f_[{}2] | p_[{}2] <-- Copied since we detected a nested field + * p_[{}1] | f_[{}2, ...2] | p_[{}2, ...2] <-- Copied since we detected a nested field + */ + describe('primitive keys in the _source document with a single array value with an object (p_[{}1])', () => { + /** _source is a primitive key with a single array value with an object for all tests below (p_[{}1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: ['value_1'] }] }, + }; + + test('fields has a single primitive value (f_[p2]), merged doc is the same _source (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has 2 or more primitive values (f_[p2, ...2]), merged doc is the same _source (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array value (p_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }] }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }] }, + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[{}1, ...1] | f_[p2] | p_[{}1, ...1] + * p_[{}1, ...1] | f_[p2, ...2] | p_[{}1, ...1] + * p_[{}1, ...1] | f_[{}2] | p_[{}2] <-- Copied since we detected a nested field + * p_[{}1, ...1] | f_[{}2, ...2] | p_[{}2, ...2] <-- Copied since we detected a nested field + */ + describe('primitive keys in the _source document with multiple array objects (p_[{}1, ...1])', () => { + /** _source is a primitive key with a 2 or more array values with an object for all tests below (p_[{}1, ...1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: ['value_1'] }, { mars: ['value_1'] }] }, + }; + + test('fields has a single primitive value (f_[p2]), merged doc is the same _source (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has 2 or more primitive values (f_[p2, ...2]), merged doc is the same _source (p_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array value (p_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }] }, + }); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: [{ zed: 'other_value_1' }, { zed: 'other_value_2' }] }, + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[{}1] | f_[p2] | f_[{}1] + * f_[{}1] | f_[p2, ...2] | f_[{}1] + * f_[{}1] | f_[{}2] | f_[{}2] <-- Copied since we detected a nested field + * f_[{}1] | f_[{}2, ...2] | f_[{}2, ...2] <-- Copied since we detected a nested field + */ + describe('flattened object keys in the _source document with the single value of "value" (f_[{}1])', () => { + /** _source is a flattened object key with a single array object for all tests below (f_[{}1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [{ mars: 'value_1' }], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same _source (f_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has primitive values (f_[p2, ...2]), merged doc is the same _source (f_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is array value (f_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[{}1, ...1] | f_[p2] | f_[{}1, ...1] + * f_[{}1, ...1] | f_[p2, ...2] | f_[{}1, ...1] + * f_[{}1, ...1] | f_[{}2] | f_[{}2] <-- Copied since we detected a nested field + * f_[{}1, ...1] | f_[{}2, ...2] | f_[{}2, ...2] <-- Copied since we detected a nested field + */ + describe('flattened object keys in the _source document with multiple values of "value" (f_[{}1, ...1])', () => { + /** _source is a flattened object key with 2 or more array objects for all tests below (f_[{}1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [{ mars: 'value_1' }, { mars: 'value_2' }], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same _source (f_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has primitive values (f_[p2, ...2]), merged doc is the same _source (f_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is array value (f_[{}2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(fields); + }); + }); + }); + + /** + * It is possible to have a mixture of flattened keys and primitive keys within a _source document. + * These tests cover those cases and these test cases should be considered hopefully rare occurrences. + * If these become more common place, update the top table with all the permutations and combinations + * of tests for these. For now, expect the flattened object keys to get the values added to them vs. + * the other value. These tests show the behaviors of this but also the existing bugs of what happens + * when we merge. + */ + describe('miscellaneous tests of mixed flattened and source objects within _source', () => { + /** _source has a primitive key mixed with an object with the same path information which causes ambiguity */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'value_1' }, + 'foo.bar': 'value_2', + }; + + test('fields has a single primitive value f_[p2] which is to override one of the values above"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: 'value_1' }, + 'foo.bar': 'other_value_1', + }); + }); + + /** + * This is an ambiguous situation in which we produce incorrect results. + */ + test('fields has the same list of values as that of the original document and we actually do not understand if this is a new value or not"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: 'value_1' }, // <--- We have duplicated value_1 twice which is a bug + 'foo.bar': ['value_1', 'value_2'], // <-- We have merged the array value because we do not understand if we should or not + }); + }); + }); + + /** + * These tests show the behaviors around overriding fields with other fields such as objects overriding + * values and values overriding objects. This occurs with multi fields where you can have "foo" and "foo.keyword" + * in the fields + */ + describe('Fields overriding fields', () => { + describe('primitive keys for the _source', () => { + test('removes multi-field values such "foo.keyword" mixed with "foo" and prefers just "foo" for 1st level', () => { + const _source: SignalSourceHit['_source'] = { + foo: 'foo_value_1', + bar: 'bar_value_1', + }; + const fields: SignalSourceHit['fields'] = { + foo: ['foo_other_value_1'], + 'foo.keyword': ['foo_other_value_keyword_1'], + bar: ['bar_other_value_1'], + 'bar.keyword': ['bar_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: 'foo_other_value_1', + bar: 'bar_other_value_1', + }); + }); + + test('removes multi-field values such "host.name.keyword" mixed with "host.name" and prefers just "host.name" for 2nd level', () => { + const _source: SignalSourceHit['_source'] = { + host: { + name: 'host_value_1', + hostname: 'host_name_value_1', + }, + }; + const fields: SignalSourceHit['fields'] = { + 'host.name': ['host_name_other_value_1'], + 'host.name.keyword': ['host_name_other_value_keyword_1'], + 'host.hostname': ['hostname_other_value_1'], + 'host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + host: { + hostname: 'hostname_other_value_1', + name: 'host_name_other_value_1', + }, + }); + }); + + test('removes multi-field values such "foo.host.name.keyword" mixed with "foo.host.name" and prefers just "foo.host.name" for 3rd level', () => { + const _source: SignalSourceHit['_source'] = { + foo: { + host: { + name: 'host_value_1', + hostname: 'host_name_value_1', + }, + }, + }; + const fields: SignalSourceHit['fields'] = { + 'foo.host.name': ['host_name_other_value_1'], + 'foo.host.name.keyword': ['host_name_other_value_keyword_1'], + 'foo.host.hostname': ['hostname_other_value_1'], + 'foo.host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + host: { + hostname: 'hostname_other_value_1', + name: 'host_name_other_value_1', + }, + }, + }); + }); + + test('multi-field values mixed with regular values will not be merged accidentally"', () => { + const _source: SignalSourceHit['_source'] = {}; + const fields: SignalSourceHit['fields'] = { + foo: ['other_value_1'], + 'foo.bar': ['other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: 'other_value_1', + }); + }); + }); + + describe('flattened keys for the _source', () => { + test('removes multi-field values such "host.name.keyword" mixed with "host.name" and prefers just "host.name" for 2nd level', () => { + const _source: SignalSourceHit['_source'] = { + 'host.name': 'host_value_1', + 'host.hostname': 'host_name_value_1', + }; + const fields: SignalSourceHit['fields'] = { + 'host.name': ['host_name_other_value_1'], + 'host.name.keyword': ['host_name_other_value_keyword_1'], + 'host.hostname': ['hostname_other_value_1'], + 'host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + 'host.name': 'host_name_other_value_1', + 'host.hostname': 'hostname_other_value_1', + }); + }); + + test('removes multi-field values such "foo.host.name.keyword" mixed with "foo.host.name" and prefers just "foo.host.name" for 3rd level', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.host.name': 'host_value_1', + 'foo.host.hostname': 'host_name_value_1', + }; + const fields: SignalSourceHit['fields'] = { + 'foo.host.name': ['host_name_other_value_1'], + 'foo.host.name.keyword': ['host_name_other_value_keyword_1'], + 'foo.host.hostname': ['hostname_other_value_1'], + 'foo.host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + 'foo.host.name': 'host_name_other_value_1', + 'foo.host.hostname': 'hostname_other_value_1', + }); + }); + + test('invalid fields of several levels mixed with regular values will not be merged accidentally due to runtime fields being liberal"', () => { + const _source: SignalSourceHit['_source'] = {}; + const fields: SignalSourceHit['fields'] = { + foo: ['other_value_1'], + 'foo.bar': ['other_value_2'], + 'foo.bar.zed': ['zed_other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: 'other_value_1', + }); + }); + }); + }); + + /** + * These tests are around parent objects that are not nested but are array types. We do not try to merge + * into these as this causes ambiguities between array types and object types. + */ + describe('parent array objects', () => { + test('parent array objects will not be overridden since that is an ambiguous use case for a top level value', () => { + const _source: SignalSourceHit['_source'] = { + foo: [ + { + bar: 'value_1', + mars: ['value_1'], + }, + ], + }; + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + 'foo.mars': ['other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('parent array objects will not be overridden since that is an ambiguous use case for a deeply nested value', () => { + const _source: SignalSourceHit['_source'] = { + foo: { + zed: [ + { + bar: 'value_1', + mars: ['value_1'], + }, + ], + }, + }; + const fields: SignalSourceHit['fields'] = { + 'foo.zed.bar': ['other_value_1'], + 'foo.zed.mars': ['other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * Specific tests around nested field types such as ensuring we are unboxing when we can + */ + describe('nested fields', () => { + test('unboxes deeply nested fields from a single array items when source is non-existent', () => { + const _source: SignalSourceHit['_source'] = {}; + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: ['single_value'], zed: ['single_value'] }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { bar: 'single_value', zed: 'single_value' }, + }); + }); + + test('does not unbox when source is exists and has arrays for the same values with primitive keys', () => { + const _source: SignalSourceHit['_source'] = { + foo: [ + { + bar: [], + zed: [], + }, + ], + }; + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: ['single_value'], zed: ['single_value'] }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeAllFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: [{ bar: ['single_value'], zed: ['single_value'] }], + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.ts new file mode 100644 index 00000000000000..de8d3ba820e233 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_all_fields_with_source.ts @@ -0,0 +1,113 @@ +/* + * 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 { get } from 'lodash/fp'; +import { set } from '@elastic/safer-lodash-set/fp'; +import { SignalSource, SignalSourceHit } from '../../types'; +import { filterFieldEntries } from '../utils/filter_field_entries'; +import type { FieldsType } from '../types'; +import { isObjectLikeOrArrayOfObjectLikes } from '../utils/is_objectlike_or_array_of_objectlikes'; +import { isNestedObject } from '../utils/is_nested_object'; +import { recursiveUnboxingFields } from '../utils/recursive_unboxing_fields'; +import { isPrimitive } from '../utils/is_primitive'; +import { isArrayOfPrimitives } from '../utils/is_array_of_primitives'; +import { arrayInPathExists } from '../utils/array_in_path_exists'; +import { isTypeObject } from '../utils/is_type_object'; + +/** + * Merges all of "doc._source" with its "doc.fields" on a "best effort" basis. See ../README.md for more information + * on this function and the general strategies. + * + * @param doc The document with "_source" and "fields" + * @param throwOnFailSafe Defaults to false, but if set to true it will cause a throw if the fail safe is triggered to indicate we need to add a new explicit test condition + * @returns The two merged together in one object where we can + */ +export const mergeAllFieldsWithSource = ({ doc }: { doc: SignalSourceHit }): SignalSourceHit => { + const source = doc._source ?? {}; + const fields = doc.fields ?? {}; + const fieldEntries = Object.entries(fields); + const filteredEntries = filterFieldEntries(fieldEntries); + + const transformedSource = filteredEntries.reduce( + (merged, [fieldsKey, fieldsValue]: [string, FieldsType]) => { + if ( + hasEarlyReturnConditions({ + fieldsValue, + fieldsKey, + merged, + }) + ) { + return merged; + } + + const valueInMergedDocument = get(fieldsKey, merged); + if (valueInMergedDocument === undefined) { + const valueToMerge = recursiveUnboxingFields(fieldsValue, valueInMergedDocument); + return set(fieldsKey, valueToMerge, merged); + } else if (isPrimitive(valueInMergedDocument)) { + const valueToMerge = recursiveUnboxingFields(fieldsValue, valueInMergedDocument); + return set(fieldsKey, valueToMerge, merged); + } else if (isArrayOfPrimitives(valueInMergedDocument)) { + const valueToMerge = recursiveUnboxingFields(fieldsValue, valueInMergedDocument); + return set(fieldsKey, valueToMerge, merged); + } else if ( + isObjectLikeOrArrayOfObjectLikes(valueInMergedDocument) && + isNestedObject(fieldsValue) && + !Array.isArray(valueInMergedDocument) + ) { + const valueToMerge = recursiveUnboxingFields(fieldsValue, valueInMergedDocument); + return set(fieldsKey, valueToMerge, merged); + } else if ( + isObjectLikeOrArrayOfObjectLikes(valueInMergedDocument) && + isNestedObject(fieldsValue) && + Array.isArray(valueInMergedDocument) + ) { + const valueToMerge = recursiveUnboxingFields(fieldsValue, valueInMergedDocument); + return set(fieldsKey, valueToMerge, merged); + } else { + // fail safe catch all condition for production, but we shouldn't try to reach here and + // instead write tests if we encounter this situation. + return merged; + } + }, + { ...source } + ); + + return { + ...doc, + _source: transformedSource, + }; +}; + +/** + * Returns true if any early return conditions are met which are + * - If the fieldsValue is an empty array return + * - If we have an array within the path return and the value in our merged documented is non-existent + * - If the value is an object or is an array of object types and we don't have a nested field + * @param fieldsValue The field value to check + * @param fieldsKey The key of the field we are checking + * @param merged The merge document which is what we are testing conditions against + * @returns true if we should return early, otherwise false + */ +const hasEarlyReturnConditions = ({ + fieldsValue, + fieldsKey, + merged, +}: { + fieldsValue: FieldsType; + fieldsKey: string; + merged: SignalSource; +}) => { + const valueInMergedDocument = get(fieldsKey, merged); + return ( + fieldsValue.length === 0 || + (valueInMergedDocument === undefined && arrayInPathExists(fieldsKey, merged)) || + (isObjectLikeOrArrayOfObjectLikes(valueInMergedDocument) && + !isNestedObject(fieldsValue) && + !isTypeObject(fieldsValue)) + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.test.ts new file mode 100644 index 00000000000000..70d1e79580e844 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.test.ts @@ -0,0 +1,1379 @@ +/* + * 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 { mergeMissingFieldsWithSource } from './merge_missing_fields_with_source'; +import { SignalSourceHit } from '../../types'; +import { emptyEsResult } from '../../__mocks__/empty_signal_source_hit'; + +/** + * See ../README.md for the nomenclature of any notes within tests below + */ +describe('merge_missing_fields_with_source', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + /** Get the return type of the mergeMissingFieldsWithSource for TypeScript checks against expected */ + type ReturnTypeMergeFieldsWithSource = ReturnType['_source']; + + describe('fields is "undefined"', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | undefined | undefined + * p_[] | undefined | p_[] + * p_p1 | undefined | p_p1 + * p_[p1] | undefined | p_[p1] + * p_[p1, ...1] | undefined | p_[p1, ...1] + * p_{}1 | undefined | p_{}1 + * p_[{}1] | undefined | p_{}1 + * p_[{}1, ...1] | undefined | p_[{}1, ...1] + */ + describe('primitive keys in the _source document', () => { + /** fields is "undefined" for all tests below */ + const fields: SignalSourceHit['fields'] = {}; + + test('when source is "undefined", merged doc is "undefined"', () => { + const _source: SignalSourceHit['_source'] = {}; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an empty array (p_[]), merged doc is empty array (p_[])"', () => { + const _source: SignalSourceHit['_source'] = { + foo: [], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (p_p1), merged doc is primitive (p_p1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: 'value', + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (p_[p1]), merged doc is primitive (p_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: ['value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (p_[p1, ..1]), merged doc is primitive (p_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (p_{}), merged doc is single object (p_{})', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'some value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object (p_[{}1]), merged doc is single object (p_[{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (p_[{}, ...1]), merged doc is the same (p_[{}, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }, { foo: 'some other value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | undefined | undefined + * f_[] | undefined | f_[] + * f_p1 | undefined | f_p1 + * f_[p1] | undefined | f_[p1] + * f_[p1, ...1] | undefined | f_[p1, ...1] + * f_{}1 | undefined | f_{}1 + * f_[{}1] | undefined | f_{}1 + * f_[{}1, ...1] | undefined | f_[{}1, ...1] + */ + describe('flattened object keys in the _source document', () => { + /** fields is "undefined" for all tests below */ + const fields: SignalSourceHit['fields'] = {}; + + test('when source is an empty array (f_[]), merged doc is empty array (f_[])"', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (f_p1), merged doc is primitive (f_p1)', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': 'value', + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (f_[p1]), merged doc is primitive (f_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (f_[p1, ...1]), merged doc is primitive (f_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (f_{}1), merged doc is single object (f_{}1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'some value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object ([f_{}1]), merged doc is single object ([f_{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (f_[{}1, ...1]), merged doc is the same (f_[{}1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }, { foo: 'some other value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + describe('fields is "[]"', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | f_[] | undefined + * p_[] | f_[] | p_[] + * p_p1 | f_[] | p_p1 + * p_[p1] | f_[] | p_[p1] + * p_[p1, ...1] | f_[] | p_[p1, ...1] + * p_{}1 | f_[] | p_{}1 + * p_[{}1] | f_[] | p_{}1 + * p_[{}1, ...1] | f_[] | p_[{}1, ...1] + */ + describe('primitive keys in the _source document', () => { + /** fields is a flattened object key and an empty array value (p_[]) */ + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [], + }; + + test('when source is an empty array (p_[]), merged doc is empty array (p_[])"', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: [] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (p_p1), merged doc is primitive (p_p1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (p_[p1]), merged doc is primitive (p_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: ['value'] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (p_[p1, ..1]), merged doc is primitive (p_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: ['value_1', 'value_2'] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (p_{}), merged doc is single object (p_{})', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: { mars: 'some value' } }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object (p_[{}1]), merged doc is single object (p_[{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: 'some value' }] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (p_[{}, ...1]), merged doc is the same (p_[{}, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: 'some value' }, { mars: 'some other value' }] }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | f_[] | undefined + * f_[] | f_[] | f_[] + * f_p1 | f_[] | f_p1 + * f_[p1] | f_[] | f_[p1] + * f_[p1, ...1] | f_[] | f_[p1, ...1] + * f_{}1 | f_[] | f_{}1 + * f_[{}1] | f_[] | f_{}1 + * f_[{}1, ...1] | f_[] | f_[{}1, ...1] + */ + describe('flattened object keys in the _source document', () => { + /** fields is flattened object key with an empty array for a value (f_[]) */ + const fields: SignalSourceHit['fields'] = { + 'bar.foo': [], + }; + + test('when source is an empty array (f_[]), merged doc is empty array (f_[])"', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': [], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a primitive (f_p1), merged doc is primitive (f_p1)', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': 'value', + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with a single primitive (f_[p1]), merged doc is primitive (f_[p1])', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': ['value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with 2 or more primitives (f_[p1, ...1]), merged doc is primitive (f_[p1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + 'bar.foo': ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is a single object (f_{}1), merged doc is single object (f_{}1)', () => { + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'some value' }, + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array with single object ([f_{}1]), merged doc is single object ([f_{}1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('when source is an array of 1 or more objects (f_[{}1, ...1]), merged doc is the same (f_[{}1, ...1])', () => { + const _source: SignalSourceHit['_source'] = { + foo: [{ bar: 'some value' }, { foo: 'some other value' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * undefined | f_[p2] | p_p2 <-- Unboxed from array + * undefined | f_[p2, ...2] | p_[p2, ...2] + * undefined | f_[{}2] | {} <-- We have an empty object since we only merge primitives + * undefined | f_[{}2, ...2] | {} <-- We have an empty object since we only merge primitives + */ + describe('source is "undefined"', () => { + /** _source is "undefined" for all tests below */ + const _source: SignalSourceHit['_source'] = {}; + + test('fields is a single primitive value (f_[p2]), merged doc is an unboxed array element p_p2"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: 'other_value_1', + }, + }); + }); + + test('fields is a multiple primitive values (f_[p2, ...2]), merged doc is the array (p_[p2, ...2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: { + bar: ['other_value_1', 'other_value_2'], + }, + }); + }); + + test('fields is a single nested field value (f_[{}2]), merged doc is empty object ({})"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({}); + }); + + test('fields is multiple nested field values (f_[{}2, ...2]), merged doc is the empty object ({})"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({}); + }); + }); + + describe('source is either primitive or flattened keys, with primitive values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_p1 | f_[p2] | p_p1 + * p_p1 | f_[p2, ...2] | p_p1 + * p_p1 | f_[{}2] | p_p1 + * p_p1 | f_[{}2, ...2] | p_p1 + */ + describe('primitive keys in the _source document with the value of "value" (p_p1)', () => { + /** _source is a single primitive key with a primitive value for all tests below (p_p1) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'value' }, + }; + + test('fields is single array primitive value (f_[p2]), merged doc is unboxed primitive key and value (p_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive values (f_[p2, ...2]), merged doc is the array (p_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed array (p_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: 'other_value_1' }, { bar: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_p1 | f_[p2] | f_p1 + * f_p1 | f_[p2, ...2] | f_p1 + * f_p1 | f_[{}2] | f_p1 + * f_p1 | f_[{}2, ...2] | f_p1 + */ + describe('flattened object keys in the _source document (f_p1)', () => { + /** _source is a flattened object key with a primitive value for all tests below (f_p1) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': 'value', + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is unboxed primitive key and value (f_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive value (f_[p2, ...2]), merged doc is the array (f_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed array (f_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_p1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + describe('source is either primitive or flattened keys, with primitive array values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[] | f_[p2] | p_[] + * p_[] | f_[p2, ...2] | p_[] + * p_[] | f_[{}2] | p_[] + * p_[] | f_[{}2, ...2] | p_[] + */ + describe('primitive keys in the _source document with empty array (p_[])', () => { + /** _source is a primitive key with an empty array for all tests below (p_[]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: [] }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is array value (p_[]])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive values (f_[p2, ...2]), merged doc is the array (p_[])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array value (p_[])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[] | f_[p2] | f_[] + * f_[] | f_[p2, ...2] | f_[] + * f_[] | f_[{}2] | f_[] + * f_[] | f_[{}2, ...2] | f_[] + */ + describe('flattened object keys in the _source document with empty array (f_[])', () => { + /** _source is a flattened object key with an empty array for all tests below (f_[]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is array (f_[p2])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple primitive values (f_[p2, ...2]), merged doc is the array (f_[])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (f_[])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[p1] | f_[p2] | p_[p1] + * p_[p1] | f_[p2, ...2] | p_[p1] + * p_[p1] | f_[{}2] | p_[p1] + * p_[p1] | f_[{}2, ...2] | p_[p1] + */ + describe('primitive keys in the _source document with single primitive value in an array (p_[p1])', () => { + /** _source is a primitive key with a single primitive array value for all tests below (p_[p1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: ['value'] }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the array value (p_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive value (f_[p2, ...2]), merged doc is the array (p_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (p_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[p1] | f_[p2] | f_[p1] + * f_[p1] | f_[p2, ...2] | f_[p1] + * f_[p1] | f_[{}2] | f_[p1] + * f_[p1] | f_[{}2, ...2] | f_[p1] + */ + describe('flattened keys in the _source document with single flattened value in an array (f_[p1])', () => { + /** _source is a flattened object key with a single primitive value for all tests below (f_p[p1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value'], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is array value (f_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive value (f_[p2, ...2]), merged doc is the array (f_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (f_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[p1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[p1, ...1] | f_[p2] | p_[p1, ...1] + * p_[p1, ...1] | f_[p2, ...2] | p_[p1, ...1] + * p_[p1, ...1] | f_[{}2] | p_[p1, ...1] + * p_[p1, ...1] | f_[{}2, ...2] | p_[p1, ...1] + */ + describe('primitive keys in the _source document with multiple array values in an array (p_[p1, ...1])', () => { + /** _source is a primitive key with an array of 2 or more elements for all tests below (p_[p1, ...1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { + bar: ['value_1', 'value_2'], + }, + }; + + test('fields is single array value (f_[p2]), merged doc is array (p_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields is multiple primitive values (f_[p2, ...2]), merged doc is the array (p_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed value (p_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[p1, ...1] | f_[p2] | f_[p1, ...1] + * f_[p1, ...1] | f_[p2, ...2] | f_[p1, ...1] + * f_[p1, ...1] | f_[{}2] | f_[p1, ...1] + * f_[p1, ...1] | f_[{}2, ...2] | f_[p1, ...1] + */ + describe('flattened keys in the _source document with multiple array values in an array (f_[p1, ...1])', () => { + /** _source is a flattened object key with an array of 2 or more elements for all tests below (f_[p1, ...1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': ['value_1', 'value_2'], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is unboxed primitive key and value (f_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple primitive values (f_[p2, ...2]), merged doc is the array (f_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array (f_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[p1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + describe('source is either primitive or flattened keys, with object values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_{}1 | f_[p2] | p_{}1 + * p_{}1 | f_[p2, ...2] | p_{}1 + * p_{}1 | f_[{}2] | p_{}1 + * p_{}1 | f_[{}2, ...2] | p_{}1 + */ + describe('primitive keys in the _source document with the value of "value" (p_{}1)', () => { + /** _source is a primitive key with an object value for all tests below (p_{}1) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: { mars: 'value_1' } }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same source (p_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has single primitive values (f_[p2, ...2]), merged doc is the same _source (p_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the unboxed array value (p_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_{}1 | f_[p2] | f_{}1 + * f_{}1 | f_[p2, ...2] | f_{}1 + * f_{}1 | f_[{}2] | f_{}1 + * f_{}1 | f_[{}2, ...2] | f_{}1 + */ + describe('flattened object keys in the _source document with the value of "value" (f_{}1)', () => { + /** _source is a flattened object key with an object value for all tests below (f_{}1) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': { mars: 'value_1' }, + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same source (f_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has primitive values (f_[p2, ...2]), merged doc is the same _source (f_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is unboxed array value (f_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_{}1)"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + describe('source is either primitive or flattened keys, with object array values', () => { + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[{}1] | f_[p2] | p_[{}1] + * p_[{}1] | f_[p2, ...2] | p_[{}1] + * p_[{}1] | f_[{}2] | p_[{}1] + * p_[{}1] | f_[{}2, ...2] | p_[{}1] + */ + describe('primitive keys in the _source document with a single array value with an object (p_[{}1])', () => { + /** _source is a primitive key with a single array value with an object for all tests below (p_[{}1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: ['value_1'] }] }, + }; + + test('fields has a single primitive value (f_[p2]), merged doc is the same _source (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has 2 or more primitive values (f_[p2, ...2]), merged doc is the same _source (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array value (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * p_[{}1, ...1] | f_[p2] | p_[{}1, ...1] + * p_[{}1, ...1] | f_[p2, ...2] | p_[{}1, ...1] + * p_[{}1, ...1] | f_[{}2] | p_[{}1, ...1] + * p_[{}1, ...1] | f_[{}2, ...2] | p_[{}1, ...1] + */ + describe('primitive keys in the _source document with multiple array objects (p_[{}1, ...1])', () => { + /** _source is a primitive key with a 2 or more array values with an object for all tests below (p_[{}1, ...1]) */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: [{ mars: ['value_1'] }, { mars: ['value_1'] }] }, + }; + + test('fields has a single primitive value (f_[p2]), merged doc is the same _source (p_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has 2 or more primitive values (f_[p2, ...2]), merged doc is the same _source (p_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is the array value (p_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (p_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ zed: 'other_value_1' }, { zed: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[{}1] | f_[p2] | f_[{}1] + * f_[{}1] | f_[p2, ...2] | f_[{}1] + * f_[{}1] | f_[{}2] | f_[{}1] + * f_[{}1] | f_[{}2, ...2] | f_[{}1] + */ + describe('flattened object keys in the _source document with the single value of "value" (f_[{}1])', () => { + /** _source is a flattened object key with a single array object for all tests below (f_[{}1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [{ mars: 'value_1' }], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same _source (f_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has primitive values (f_[p2, ...2]), merged doc is the same _source (f_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is array value (f_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * source | fields | value after merge + * ----- | --------- | ----- + * f_[{}1, ...1] | f_[p2] | f_[{}1, ...1] + * f_[{}1, ...1] | f_[p2, ...2] | f_[{}1, ...1] + * f_[{}1, ...1] | f_[{}2] | f_[{}1, ...1] + * f_[{}1, ...1] | f_[{}2, ...2] | f_[{}1, ...1] + */ + describe('flattened object keys in the _source document with multiple values of "value" (f_[{}1, ...1])', () => { + /** _source is a flattened object key with 2 or more array objects for all tests below (f_[{}1]) */ + const _source: SignalSourceHit['_source'] = { + 'foo.bar': [{ mars: 'value_1' }, { mars: 'value_2' }], + }; + + test('fields is flattened object key with single array value (f_[p2]), merged doc is the same _source (f_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has primitive values (f_[p2, ...2]), merged doc is the same _source (f_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1', 'other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has a single nested object (f_[{}2]), merged doc is array value (f_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('fields has multiple nested objects (f_[{}2, ...2]), merged doc is the array (f_[{}1, ...1])"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': [{ mars: 'other_value_1' }, { mars: 'other_value_2' }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + }); + + /** + * It is possible to have a mixture of flattened keys and primitive keys within a _source document. + * These tests cover those cases and these test cases should be considered hopefully rare occurrences. + * If these become more common place, update the top table with all the permutations and combinations + * of tests for these. For now, expect the flattened object keys to get the values added to them vs. + * the other value. These tests show the behaviors of this but also the existing bugs of what happens + * when we merge. + */ + describe('miscellaneous tests of mixed flattened and source objects within _source', () => { + /** _source has a primitive key mixed with an object with the same path information which causes ambiguity */ + const _source: SignalSourceHit['_source'] = { + foo: { bar: 'value_1' }, + 'foo.bar': 'value_2', + }; + + test('fields has a single primitive value f_[p2] which is not overridden"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + /** + * This is an ambiguous situation in which we produce correct results since _source is defined. + */ + test('fields has the same list of values as that of the original document"', () => { + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['value_1', 'value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * These tests show the behaviors around overriding fields with other fields such as objects overriding + * values and values overriding objects. This occurs with multi fields where you can have "foo" and "foo.keyword" + * in the fields + */ + describe('Fields overriding fields', () => { + describe('primitive keys for the _source', () => { + test('DOES NOT remove multi-field values such "foo.keyword" mixed with "foo" and prefers just "foo" for 1st level', () => { + const _source: SignalSourceHit['_source'] = { + foo: 'foo_value_1', + bar: 'bar_value_1', + }; + const fields: SignalSourceHit['fields'] = { + foo: ['foo_other_value_1'], + 'foo.keyword': ['foo_other_value_keyword_1'], + bar: ['bar_other_value_1'], + 'bar.keyword': ['bar_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('DOES NOT remove multi-field values such "host.name.keyword" mixed with "host.name" and prefers just "host.name" for 2nd level', () => { + const _source: SignalSourceHit['_source'] = { + host: { + name: 'host_value_1', + hostname: 'host_name_value_1', + }, + }; + const fields: SignalSourceHit['fields'] = { + 'host.name': ['host_name_other_value_1'], + 'host.name.keyword': ['host_name_other_value_keyword_1'], + 'host.hostname': ['hostname_other_value_1'], + 'host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('DOES NOT remove multi-field values such "foo.host.name.keyword" mixed with "foo.host.name" and prefers just "foo.host.name" for 3rd level', () => { + const _source: SignalSourceHit['_source'] = { + foo: { + host: { + name: 'host_value_1', + hostname: 'host_name_value_1', + }, + }, + }; + const fields: SignalSourceHit['fields'] = { + 'foo.host.name': ['host_name_other_value_1'], + 'foo.host.name.keyword': ['host_name_other_value_keyword_1'], + 'foo.host.hostname': ['hostname_other_value_1'], + 'foo.host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('multi-field values mixed with regular values will not be merged accidentally"', () => { + const _source: SignalSourceHit['_source'] = {}; + const fields: SignalSourceHit['fields'] = { + foo: ['other_value_1'], + 'foo.bar': ['other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: 'other_value_1', + }); + }); + }); + + describe('flattened keys for the _source', () => { + test('DOES NOT remove multi-field values such "host.name.keyword" mixed with "host.name" and prefers just "host.name" for 2nd level', () => { + const _source: SignalSourceHit['_source'] = { + 'host.name': 'host_value_1', + 'host.hostname': 'host_name_value_1', + }; + const fields: SignalSourceHit['fields'] = { + 'host.name': ['host_name_other_value_1'], + 'host.name.keyword': ['host_name_other_value_keyword_1'], + 'host.hostname': ['hostname_other_value_1'], + 'host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('DOES NOT remove multi-field values such "foo.host.name.keyword" mixed with "foo.host.name" and prefers just "foo.host.name" for 3rd level', () => { + const _source: SignalSourceHit['_source'] = { + 'foo.host.name': 'host_value_1', + 'foo.host.hostname': 'host_name_value_1', + }; + const fields: SignalSourceHit['fields'] = { + 'foo.host.name': ['host_name_other_value_1'], + 'foo.host.name.keyword': ['host_name_other_value_keyword_1'], + 'foo.host.hostname': ['hostname_other_value_1'], + 'foo.host.hostname.keyword': ['hostname_other_value_keyword_1'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('invalid fields of several levels mixed with regular values will not be merged accidentally due to runtime fields being liberal"', () => { + const _source: SignalSourceHit['_source'] = {}; + const fields: SignalSourceHit['fields'] = { + foo: ['other_value_1'], + 'foo.bar': ['other_value_2'], + 'foo.bar.zed': ['zed_other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({ + foo: 'other_value_1', + }); + }); + }); + }); + + /** + * These tests are around parent objects that are not nested but are array types. We do not try to merge + * into these as this causes ambiguities between array types and object types. + */ + describe('parent array objects', () => { + test('parent array objects will not be overridden since that is an ambiguous use case for a top level value', () => { + const _source: SignalSourceHit['_source'] = { + foo: [ + { + bar: 'value_1', + mars: ['value_1'], + }, + ], + }; + const fields: SignalSourceHit['fields'] = { + 'foo.bar': ['other_value_1'], + 'foo.mars': ['other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + + test('parent array objects will not be overridden since that is an ambiguous use case for a deeply nested value', () => { + const _source: SignalSourceHit['_source'] = { + foo: { + zed: [ + { + bar: 'value_1', + mars: ['value_1'], + }, + ], + }, + }; + const fields: SignalSourceHit['fields'] = { + 'foo.zed.bar': ['other_value_1'], + 'foo.zed.mars': ['other_value_2'], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); + + /** + * Specific tests around nested field types such as ensuring we are unboxing when we can + */ + describe('nested fields', () => { + test('returns empty object since we only consider merging in primitive values and not nested fields', () => { + const _source: SignalSourceHit['_source'] = {}; + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: ['single_value'], zed: ['single_value'] }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual({}); + }); + + test('does not touch the source object when it is empty arrays', () => { + const _source: SignalSourceHit['_source'] = { + foo: [ + { + bar: [], + zed: [], + }, + ], + }; + const fields: SignalSourceHit['fields'] = { + foo: [{ bar: ['single_value'], zed: ['single_value'] }], + }; + const doc: SignalSourceHit = { ...emptyEsResult(), _source, fields }; + const merged = mergeMissingFieldsWithSource({ doc })._source; + expect(merged).toEqual(_source); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.ts new file mode 100644 index 00000000000000..bf541acbe7e330 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/merge_missing_fields_with_source.ts @@ -0,0 +1,88 @@ +/* + * 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 { get } from 'lodash/fp'; +import { set } from '@elastic/safer-lodash-set/fp'; +import { SignalSource, SignalSourceHit } from '../../types'; +import { filterFieldEntries } from '../utils/filter_field_entries'; +import type { FieldsType } from '../types'; +import { recursiveUnboxingFields } from '../utils/recursive_unboxing_fields'; +import { isTypeObject } from '../utils/is_type_object'; +import { arrayInPathExists } from '../utils/array_in_path_exists'; +import { isNestedObject } from '../utils/is_nested_object'; + +/** + * Merges only missing sections of "doc._source" with its "doc.fields" on a "best effort" basis. See ../README.md for more information + * on this function and the general strategies. + * @param doc The document with "_source" and "fields" + * @param throwOnFailSafe Defaults to false, but if set to true it will cause a throw if the fail safe is triggered to indicate we need to add a new explicit test condition + * @returns The two merged together in one object where we can + */ +export const mergeMissingFieldsWithSource = ({ + doc, +}: { + doc: SignalSourceHit; +}): SignalSourceHit => { + const source = doc._source ?? {}; + const fields = doc.fields ?? {}; + const fieldEntries = Object.entries(fields); + const filteredEntries = filterFieldEntries(fieldEntries); + + const transformedSource = filteredEntries.reduce( + (merged, [fieldsKey, fieldsValue]: [string, FieldsType]) => { + if ( + hasEarlyReturnConditions({ + fieldsValue, + fieldsKey, + merged, + }) + ) { + return merged; + } + + const valueInMergedDocument = get(fieldsKey, merged); + const valueToMerge = recursiveUnboxingFields(fieldsValue, valueInMergedDocument); + return set(fieldsKey, valueToMerge, merged); + }, + { ...source } + ); + + return { + ...doc, + _source: transformedSource, + }; +}; + +/** + * Returns true if any early return conditions are met which are + * - If the fieldsValue is an empty array return + * - If the value to merge in is not undefined, return early + * - If an array within the path exists, do an early return + * - If the value matches a type object, do an early return + * @param fieldsValue The field value to check + * @param fieldsKey The key of the field we are checking + * @param merged The merge document which is what we are testing conditions against + * @returns true if we should return early, otherwise false + */ +const hasEarlyReturnConditions = ({ + fieldsValue, + fieldsKey, + merged, +}: { + fieldsValue: FieldsType; + fieldsKey: string; + merged: SignalSource; +}) => { + const valueInMergedDocument = get(fieldsKey, merged); + return ( + fieldsValue.length === 0 || + valueInMergedDocument !== undefined || + arrayInPathExists(fieldsKey, merged) || + isNestedObject(fieldsValue) || + isTypeObject(fieldsValue) + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/types.ts new file mode 100644 index 00000000000000..e8142e41715e2c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/types.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +/** + * A bit stricter typing since the default fields type is an "any" + */ +export type FieldsType = string[] | number[] | boolean[] | object[]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.test.ts new file mode 100644 index 00000000000000..1b2accd0a16a12 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.test.ts @@ -0,0 +1,42 @@ +/* + * 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 { arrayInPathExists } from './array_in_path_exists'; + +describe('array_in_path_exists', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('returns false when empty string and empty object', () => { + expect(arrayInPathExists('', {})).toEqual(false); + }); + + test('returns false when a path and empty object', () => { + expect(arrayInPathExists('a.b.c', {})).toEqual(false); + }); + + test('returns true when a path and an array exists', () => { + expect(arrayInPathExists('a', { a: [] })).toEqual(true); + }); + + test('returns true when a path and an array exists within the parent path at level 1', () => { + expect(arrayInPathExists('a.b', { a: [] })).toEqual(true); + }); + + test('returns true when a path and an array exists within the parent path at level 3', () => { + expect(arrayInPathExists('a.b.c', { a: [] })).toEqual(true); + }); + + test('returns true when a path and an array exists within the parent path at level 2', () => { + expect(arrayInPathExists('a.b.c', { a: { b: [] } })).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.ts new file mode 100644 index 00000000000000..b8e742fbaba61b --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/array_in_path_exists.ts @@ -0,0 +1,23 @@ +/* + * 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 { get } from 'lodash/fp'; +import { SignalSource } from '../../types'; + +/** + * Returns true if an array within the path exists anywhere. + * @param fieldsKey The fields key to check if an array exists along the path + * @param source The source document to check for an array anywhere along the path + * @returns true if we detect an array along the path, otherwise false + */ +export const arrayInPathExists = (fieldsKey: string, source: SignalSource): boolean => { + const splitPath = fieldsKey.split('.'); + return splitPath.some((_, index, array) => { + const newPath = [...array].splice(0, index + 1).join('.'); + return Array.isArray(get(newPath, source)); + }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.test.ts new file mode 100644 index 00000000000000..9cc24782908855 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.test.ts @@ -0,0 +1,83 @@ +/* + * 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 { filterFieldEntries } from './filter_field_entries'; +import { FieldsType } from '../types'; + +describe('filter_field_entries', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + /** Dummy test value */ + const dummyValue = ['value']; + + /** + * Get the return type of the mergeFieldsWithSource for TypeScript checks against expected + */ + type ReturnTypeFilterFieldEntries = ReturnType; + + test('returns a single valid fieldEntries as expected', () => { + const fieldEntries: Array<[string, FieldsType]> = [['foo.bar', dummyValue]]; + expect(filterFieldEntries(fieldEntries)).toEqual(fieldEntries); + }); + + test('removes invalid dotted entries', () => { + const fieldEntries: Array<[string, FieldsType]> = [ + ['.', dummyValue], + ['foo.bar', dummyValue], + ['..', dummyValue], + ['foo..bar', dummyValue], + ]; + expect(filterFieldEntries(fieldEntries)).toEqual([ + ['foo.bar', dummyValue], + ]); + }); + + test('removes multi-field values such "foo.keyword" mixed with "foo" and prefers just "foo" for 1st level', () => { + const fieldEntries: Array<[string, FieldsType]> = [ + ['foo', dummyValue], + ['foo.keyword', dummyValue], // <-- "foo.keyword" multi-field should be removed + ['bar.keyword', dummyValue], // <-- "bar.keyword" multi-field should be removed + ['bar', dummyValue], + ]; + expect(filterFieldEntries(fieldEntries)).toEqual([ + ['foo', dummyValue], + ['bar', dummyValue], + ]); + }); + + test('removes multi-field values such "host.name.keyword" mixed with "host.name" and prefers just "host.name" for 2nd level', () => { + const fieldEntries: Array<[string, FieldsType]> = [ + ['host.name', dummyValue], + ['host.name.keyword', dummyValue], // <-- multi-field should be removed + ['host.hostname', dummyValue], + ['host.hostname.keyword', dummyValue], // <-- multi-field should be removed + ]; + expect(filterFieldEntries(fieldEntries)).toEqual([ + ['host.name', dummyValue], + ['host.hostname', dummyValue], + ]); + }); + + test('removes multi-field values such "foo.host.name.keyword" mixed with "foo.host.name" and prefers just "foo.host.name" for 3rd level', () => { + const fieldEntries: Array<[string, FieldsType]> = [ + ['foo.host.name', dummyValue], + ['foo.host.name.keyword', dummyValue], // <-- multi-field should be removed + ['foo.host.hostname', dummyValue], + ['foo.host.hostname.keyword', dummyValue], // <-- multi-field should be removed + ]; + expect(filterFieldEntries(fieldEntries)).toEqual([ + ['foo.host.name', dummyValue], + ['foo.host.hostname', dummyValue], + ]); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.ts new file mode 100644 index 00000000000000..221cdabc628478 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/filter_field_entries.ts @@ -0,0 +1,32 @@ +/* + * 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 { isMultiField } from './is_multifield'; +import { isInvalidKey } from './is_invalid_key'; +import { isTypeObject } from './is_type_object'; +import { FieldsType } from '../types'; + +/** + * Filters field entries by removing invalid field entries such as any invalid characters + * in the keys or if there are sub-objects that are trying to override regular objects and + * are invalid runtime field names. Also matches type objects such as geo-points and we ignore + * those and don't try to merge those. + * + * @param fieldEntries The field entries to filter + * @returns The field entries filtered + */ +export const filterFieldEntries = ( + fieldEntries: Array<[string, FieldsType]> +): Array<[string, FieldsType]> => { + return fieldEntries.filter(([fieldsKey, fieldsValue]: [string, FieldsType]) => { + return ( + !isInvalidKey(fieldsKey) && + !isMultiField(fieldsKey, fieldEntries) && + !isTypeObject(fieldsValue) // TODO: Look at not filtering this and instead transform it so it can be inserted correctly in the strategies which does an overwrite of everything from fields + ); + }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/index.ts new file mode 100644 index 00000000000000..baf9efca511e29 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export * from './array_in_path_exists'; +export * from './filter_field_entries'; +export * from './is_array_of_primitives'; +export * from './is_invalid_key'; +export * from './is_multifield'; +export * from './is_nested_object'; +export * from './is_objectlike_or_array_of_objectlikes'; +export * from './is_primitive'; +export * from './is_type_object'; +export * from './recursive_unboxing_fields'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.test.ts new file mode 100644 index 00000000000000..22b9903d30de69 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.test.ts @@ -0,0 +1,51 @@ +/* + * 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 { isArrayOfPrimitives } from './is_array_of_primitives'; + +describe('is_array_of_primitives', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('returns true when an empty array is passed in', () => { + expect(isArrayOfPrimitives([])).toEqual(true); + }); + + test('returns true when an array of primitives are passed in', () => { + expect(isArrayOfPrimitives([null, 2, 'string', 5, undefined])).toEqual(true); + }); + + /** + * Simple table test of values of primitive arrays which should all pass + */ + test.each([ + [[null]], + [[1]], + [['string']], + [['string', null, 5, false, String('hi'), Boolean(true), undefined]], + ])('returns true when a primitive array of %o is passed in', (arrayValue) => { + expect(isArrayOfPrimitives(arrayValue)).toEqual(true); + }); + + /** + * Simple table test of values of all objects which should not pass + */ + test.each([ + [[{}]], + [[{ a: 1 }]], + [[1, {}]], + [[[], 'string']], + [['string', null, 5, false, String('hi'), {}, Boolean(true), undefined]], + ])('returns false when the array of %o contains an object is passed in', (arrayValue) => { + expect(isArrayOfPrimitives(arrayValue)).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.ts new file mode 100644 index 00000000000000..c65c88c40b9bb7 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_array_of_primitives.ts @@ -0,0 +1,21 @@ +/* + * 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 { SearchTypes } from '../../../../../../common/detection_engine/types'; +import { isPrimitive } from './is_primitive'; + +/** + * Returns true if this is an array and all elements of the array are primitives and not objects + * @param valueInMergedDocument The search type to check if everything is primitive or not + * @returns true if is an array and everything in the array is a primitive type + */ +export const isArrayOfPrimitives = (valueInMergedDocument: SearchTypes | null): boolean => { + return ( + Array.isArray(valueInMergedDocument) && + valueInMergedDocument.every((value) => isPrimitive(value)) + ); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.test.ts new file mode 100644 index 00000000000000..7035732238775c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.test.ts @@ -0,0 +1,51 @@ +/* + * 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 { isInvalidKey } from './is_invalid_key'; + +describe('matches_invalid_key', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('it returns true if a value is a single dot', () => { + expect(isInvalidKey('.')).toEqual(true); + }); + + test('it returns true if a value starts with a dot', () => { + expect(isInvalidKey('.invalidName')).toEqual(true); + }); + + test('it returns true if a value is 2 dots', () => { + expect(isInvalidKey('..')).toEqual(true); + }); + + test('it returns true if a value is 3 dots', () => { + expect(isInvalidKey('...')).toEqual(true); + }); + + test('it returns true if a value has two dots in its name', () => { + expect(isInvalidKey('host..name')).toEqual(true); + }); + + test('it returns false if a value has a single dot', () => { + expect(isInvalidKey('host.name')).toEqual(false); + }); + + test('it returns false if a value is a regular path', () => { + expect(isInvalidKey('a.b.c.d')).toEqual(false); + }); + + /** Yes, this is a valid key in elastic */ + test('it returns false if a value ends with a dot', () => { + expect(isInvalidKey('validName.')).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.ts new file mode 100644 index 00000000000000..358dc3e148547f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_invalid_key.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ + +/** + * Matches any invalid keys from runtime fields such as runtime fields which can start with a + * "." or runtime fields which can have ".." two or more dots. + * @param fieldsKey The fields key to match against + * @returns true if it is invalid key, otherwise false + */ +export const isInvalidKey = (fieldsKey: string): boolean => { + return fieldsKey.startsWith('.') || fieldsKey.match(/[\.]{2,}/) != null; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.test.ts new file mode 100644 index 00000000000000..a8050b600b4642 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.test.ts @@ -0,0 +1,40 @@ +/* + * 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 { isMultiField } from './is_multifield'; + +describe('is_multifield', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + const dummyValue = ['value']; + + test('it returns true if the string "foo.bar" is a multiField', () => { + expect(isMultiField('foo.bar', [['foo', dummyValue]])).toEqual(true); + }); + + test('it returns false if the string "foo" is not a multiField', () => { + expect(isMultiField('foo', [['foo', dummyValue]])).toEqual(false); + }); + + test('it returns false if we have a sibling string and are not a multiField', () => { + expect(isMultiField('foo.bar', [['foo.mar', dummyValue]])).toEqual(false); + }); + + test('it returns true for a 3rd level match of being a sub-object. Runtime fields can have multiple layers of multiFields', () => { + expect(isMultiField('foo.mars.bar', [['foo', dummyValue]])).toEqual(true); + }); + + test('it returns true for a 3rd level match against a 2nd level sub-object. Runtime fields can have multiple layers of multiFields', () => { + expect(isMultiField('foo.mars.bar', [['foo.mars', dummyValue]])).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.ts new file mode 100644 index 00000000000000..feee6026c60b38 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_multifield.ts @@ -0,0 +1,34 @@ +/* + * 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 { FieldsType } from '../types'; + +/** + * Returns true if we are a multiField when passed in a fields entry and a fields key, + * otherwise false. Notice that runtime fields can have multiple levels of multiFields which is kind a problem + * but we compensate and test for that here as well. So technically this matches both multiFields and + * invalid multiple-multiFields. + * @param fieldsKey The key to check against the entries to see if it is a multiField + * @param fieldEntries The entries to check against. + * @returns True if we are a subObject, otherwise false. + */ +export const isMultiField = ( + fieldsKey: string, + fieldEntries: Array<[string, FieldsType]> +): boolean => { + const splitPath = fieldsKey.split('.'); + return splitPath.some((_, index, array) => { + if (index + 1 === array.length) { + return false; + } else { + const newPath = [...array].splice(0, index + 1).join('.'); + return fieldEntries.some(([fieldKeyToCheck]) => { + return fieldKeyToCheck === newPath; + }); + } + }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.test.ts new file mode 100644 index 00000000000000..d083fb8bdf8459 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.test.ts @@ -0,0 +1,46 @@ +/* + * 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 { isNestedObject } from './is_nested_object'; + +describe('is_nested_object', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('returns false when an empty array is passed in', () => { + expect(isNestedObject([])).toEqual(false); + }); + + /** + * Simple table test of values of primitive arrays which should all return false + */ + test.each([ + [[1]], + [['string']], + [[true]], + [[String('hi')]], + [[Number(5)]], + [[{ type: 'point' }]], + ])('returns false when a primitive array of %o is passed in', (arrayValues) => { + expect(isNestedObject(arrayValues)).toEqual(false); + }); + + /** + * Simple table test of values of primitive arrays which should all return true + */ + test.each([[[{}]], [[{ a: 'foo' }]]])( + 'returns false when a primitive array of %o is passed in', + (arrayValues) => { + expect(isNestedObject(arrayValues)).toEqual(true); + } + ); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.ts new file mode 100644 index 00000000000000..38a0f871279ebd --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_nested_object.ts @@ -0,0 +1,22 @@ +/* + * 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 { isObjectLike } from 'lodash/fp'; +import { isTypeObject } from './is_type_object'; +import { FieldsType } from '../types'; + +/** + * Returns true if the first value is object-like but does not contain the shape of + * a "type object" such as geo point, then it makes an assumption everything is objectlike + * and not "type object" for all the array values. This should be used only for checking + * for nested object types within fields. + * @param fieldsValue The value to check if the first element is object like or not + * @returns True if this is a nested object, otherwise false. + */ +export const isNestedObject = (fieldsValue: FieldsType): boolean => { + return isObjectLike(fieldsValue[0]) && !isTypeObject(fieldsValue); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.test.ts new file mode 100644 index 00000000000000..454b70e69d0a8a --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.test.ts @@ -0,0 +1,71 @@ +/* + * 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 { isObjectLikeOrArrayOfObjectLikes } from './is_objectlike_or_array_of_objectlikes'; + +describe('is_objectlike_or_array_of_objectlikes', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('returns false when an empty array is passed in', () => { + expect(isObjectLikeOrArrayOfObjectLikes([])).toEqual(false); + }); + + test('returns false when an array of primitives are passed in', () => { + expect(isObjectLikeOrArrayOfObjectLikes([null, 2, 'string', 5, undefined])).toEqual(false); + }); + + /** + * Simple table test of values of primitive arrays which should all fail + */ + test.each([ + [[null]], + [[1]], + [['string']], + [['string', null, 5, false, String('hi'), Boolean(true), undefined]], + ])('returns true when a primitive array of %o is passed in', (arrayValue) => { + expect(isObjectLikeOrArrayOfObjectLikes(arrayValue)).toEqual(false); + }); + + /** + * Simple table test of values of primitives which should all fail + */ + test.each([[null], [1], ['string'], [null], [String('hi')], [Boolean(true)], [undefined]])( + 'returns true when a primitive array of %o is passed in', + (arrayValue) => { + expect(isObjectLikeOrArrayOfObjectLikes(arrayValue)).toEqual(false); + } + ); + + /** + * Simple table test of values of all array of objects which should pass + */ + test.each([ + [[{}]], + [[{ a: 1 }]], + [[1, {}]], + [[[], 'string']], + [['string', null, 5, false, String('hi'), {}, Boolean(true), undefined]], + ])('returns false when the array of %o contains an object is passed in', (arrayValue) => { + expect(isObjectLikeOrArrayOfObjectLikes(arrayValue)).toEqual(true); + }); + + /** + * Simple table test of objects which should pass + */ + test.each([[{}], [{ a: 1 }]])( + 'returns false when the array of %o contains an object is passed in', + (arrayValue) => { + expect(isObjectLikeOrArrayOfObjectLikes(arrayValue)).toEqual(true); + } + ); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.ts new file mode 100644 index 00000000000000..3f57eda31ca3a2 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_objectlike_or_array_of_objectlikes.ts @@ -0,0 +1,25 @@ +/* + * 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 { isObjectLike } from 'lodash/fp'; +import { SearchTypes } from '../../../../../../common/detection_engine/types'; + +/** + * Returns true if at least one element is an object, otherwise false if they all are not objects + * if this is an array. If it is not an array, this will check that single type + * @param valueInMergedDocument The search type to check if it is object like or not + * @returns true if is object like and not an array, or true if it is an array and at least 1 element is object like + */ +export const isObjectLikeOrArrayOfObjectLikes = ( + valueInMergedDocument: SearchTypes | null +): boolean => { + if (Array.isArray(valueInMergedDocument)) { + return valueInMergedDocument.some((value) => isObjectLike(value)); + } else { + return isObjectLike(valueInMergedDocument); + } +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.test.ts new file mode 100644 index 00000000000000..6d1b273df4ad4f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.test.ts @@ -0,0 +1,42 @@ +/* + * 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 { isPrimitive } from './is_primitive'; + +describe('is_primitives', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('returns false when an empty array is passed in', () => { + expect(isPrimitive([])).toEqual(false); + }); + + /** + * Simple table test of values of primitive values which should all pass + */ + test.each([[null], [1], ['string'], [true], [Boolean('true')]])( + 'returns true when a primitive array of %o is passed in', + (arrayValue) => { + expect(isPrimitive(arrayValue)).toEqual(true); + } + ); + + /** + * Simple table test of values of objects which should not pass + */ + test.each([[{}], [{ a: 1 }]])( + 'returns false when the array of %o contains an object is passed in', + (arrayValue) => { + expect(isPrimitive(arrayValue)).toEqual(false); + } + ); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.ts new file mode 100644 index 00000000000000..c74b5f085989bd --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_primitive.ts @@ -0,0 +1,16 @@ +/* + * 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 { isObjectLike } from 'lodash/fp'; +import { SearchTypes } from '../../../../../../common/detection_engine/types'; + +/** + * Returns true if it is a primitive type, otherwise false + */ +export const isPrimitive = (valueInMergedDocument: SearchTypes | null): boolean => { + return !isObjectLike(valueInMergedDocument); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.test.ts new file mode 100644 index 00000000000000..ee5ba60e91e1a9 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.test.ts @@ -0,0 +1,34 @@ +/* + * 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 { isTypeObject } from './is_type_object'; + +describe('is_type_object', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + test('returns false when an empty array is passed in', () => { + expect(isTypeObject([])).toEqual(false); + }); + + test('returns true when a type object is in the array', () => { + expect(isTypeObject([{ type: 'Point' }])).toEqual(true); + }); + + test('returns false when a type object is not in the array', () => { + expect(isTypeObject([{ foo: 'a' }])).toEqual(false); + }); + + test('returns false when a primitive is passed in', () => { + expect(isTypeObject(['string'])).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.ts new file mode 100644 index 00000000000000..68afad9ff4fe3f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/is_type_object.ts @@ -0,0 +1,25 @@ +/* + * 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 { get } from 'lodash/fp'; +import { FieldsType } from '../types'; + +/** + * Returns true if we match a "type" object which could be a geo-point when we are parsing field + * values and we encounter a geo-point. + * @param fieldsValue The value to test the shape of the data and see if it is a geo-point or not + * @returns True if we match a geo-point or another type or not. + */ +export const isTypeObject = (fieldsValue: FieldsType): boolean => { + return (fieldsValue as Array).some((value) => { + if (typeof value === 'object' && value != null) { + return get('type', value); + } else { + return false; + } + }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.test.ts new file mode 100644 index 00000000000000..130990393b7433 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.test.ts @@ -0,0 +1,292 @@ +/* + * 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 { SearchTypes } from '../../../../../../common/detection_engine/types'; +import { recursiveUnboxingFields } from './recursive_unboxing_fields'; +import { FieldsType } from '../types'; + +describe('recursive_unboxing_fields', () => { + beforeAll(() => { + jest.resetAllMocks(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + describe('valueInMergedDocument is "undefined"', () => { + const valueInMergedDocument: SearchTypes = undefined; + test('it will return an empty array as is', () => { + const nested: FieldsType = []; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual([]); + }); + + test('it will return an empty object as is', () => { + const nested: FieldsType[0] = {}; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual({}); + }); + + test('it will unbox a single array field', () => { + const nested: FieldsType = ['foo_value_1']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual('foo_value_1'); + }); + + test('it will not unbox an array with two fields', () => { + const nested: FieldsType = ['foo_value_1', 'foo_value_2']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual([ + 'foo_value_1', + 'foo_value_2', + ]); + }); + + test('it will unbox a nested structure of 3 single arrays', () => { + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual({ bar: { zed: 'zed_value_1' }, foo: 'foo_value_1' }); + }); + + test('it will not unbox a nested structure of 2 array values at the top most level', () => { + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual([ + { bar: { zed: 'zed_value_1' }, foo: 'foo_value_1' }, + { bar: { zed: 'zed_value_1' }, foo: 'foo_value_1' }, + ]); + }); + + test('it will not unbox a nested structure of mixed values at different levels', () => { + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + fred: { + yolo: ['deep_1', 'deep_2'], + }, + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual({ + bar: { fred: { yolo: ['deep_1', 'deep_2'] }, zed: 'zed_value_1' }, + foo: 'foo_value_1', + }); + }); + }); + + describe('valueInMergedDocument is an empty object', () => { + const valueInMergedDocument: SearchTypes = {}; + test('it will return an empty array as is', () => { + const nested: FieldsType = []; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual([]); + }); + + test('it will return an empty object as is', () => { + const nested: FieldsType[0] = {}; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual({}); + }); + + test('it will unbox a single array field', () => { + const nested: FieldsType = ['foo_value_1']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual('foo_value_1'); + }); + + test('it will not unbox an array with two fields', () => { + const nested: FieldsType = ['foo_value_1', 'foo_value_2']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual([ + 'foo_value_1', + 'foo_value_2', + ]); + }); + + test('it will unbox a nested structure of 3 single arrays', () => { + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual({ bar: { zed: 'zed_value_1' }, foo: 'foo_value_1' }); + }); + + test('it will not unbox a nested structure of 2 array values at the top most level', () => { + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual([ + { bar: { zed: 'zed_value_1' }, foo: 'foo_value_1' }, + { bar: { zed: 'zed_value_1' }, foo: 'foo_value_1' }, + ]); + }); + + test('it will not unbox a nested structure of mixed values at different levels', () => { + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + fred: { + yolo: ['deep_1', 'deep_2'], + }, + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual({ + bar: { fred: { yolo: ['deep_1', 'deep_2'] }, zed: 'zed_value_1' }, + foo: 'foo_value_1', + }); + }); + }); + + describe('valueInMergedDocument mirrors the nested field in different ways', () => { + test('it will not unbox when the valueInMergedDocument is an array value', () => { + const valueInMergedDocument: SearchTypes = ['foo_value_1']; + const nested: FieldsType = ['foo_value_1']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual(['foo_value_1']); + }); + + test('it will not unbox when the valueInMergedDocument is an empty array value', () => { + const valueInMergedDocument: SearchTypes = []; + const nested: FieldsType = ['foo_value_1']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual(['foo_value_1']); + }); + + test('it will not unbox an array with two fields', () => { + const valueInMergedDocument: SearchTypes = ['foo_value_1', 'foo_value_2']; + const nested: FieldsType = ['foo_value_1', 'foo_value_2']; + expect(recursiveUnboxingFields(nested, valueInMergedDocument)).toEqual([ + 'foo_value_1', + 'foo_value_2', + ]); + }); + + test('it will not unbox a nested structure of 3 single arrays when valueInMergedDocument has empty array values', () => { + const valueInMergedDocument: SearchTypes = [ + { + foo: [], + bar: { + zed: [], + }, + }, + ]; + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual([{ bar: { zed: ['zed_value_1'] }, foo: ['foo_value_1'] }]); + }); + + test('it will not unbox a nested structure of 3 single arrays when valueInMergedDocument has array values', () => { + const valueInMergedDocument: SearchTypes = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual([{ bar: { zed: ['zed_value_1'] }, foo: ['foo_value_1'] }]); + }); + + test('it will not overwrite a nested structure of 3 single arrays when valueInMergedDocument has array values that are different', () => { + const valueInMergedDocument: SearchTypes = [ + { + foo: ['other_value_1'], + bar: { + zed: ['other_value_2'], + }, + }, + ]; + const nested: FieldsType = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual([{ bar: { zed: ['zed_value_1'] }, foo: ['foo_value_1'] }]); + }); + + test('it will work with mixed array values between "nested" and "valueInMergedDocument"', () => { + const valueInMergedDocument: SearchTypes = [ + { + foo: ['foo_value_1'], + bar: { + zed: ['zed_value_1'], + }, + }, + ]; + const nested: FieldsType = [ + { + foo: ['foo_value_1', 'foo_value_2', 'foo_value_3'], + bar: { + zed: ['zed_value_1', 'zed_value_1', 'zed_value_2'], + }, + }, + ]; + const recursed = recursiveUnboxingFields(nested, valueInMergedDocument); + expect(recursed).toEqual([ + { + bar: { zed: ['zed_value_1', 'zed_value_1', 'zed_value_2'] }, + foo: ['foo_value_1', 'foo_value_2', 'foo_value_3'], + }, + ]); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.ts new file mode 100644 index 00000000000000..9cd0ebcb5a4277 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/utils/recursive_unboxing_fields.ts @@ -0,0 +1,60 @@ +/* + * 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 { get } from 'lodash/fp'; +import { set } from '@elastic/safer-lodash-set/fp'; +import { SearchTypes } from '../../../../../../common/detection_engine/types'; +import { FieldsType } from '../types'; + +/** + * Recursively unboxes fields from an array when it is common sense to unbox them and safe to + * make an assumption to unbox them when we compare them to the "fieldsValue" and the "valueInMergedDocument" + * + * NOTE: We use "typeof fieldsValue === 'object' && fieldsValue != null" instead of lodash "objectLike" + * so that we can do type narrowing into an object to get the keys from it. + * + * @param fieldsValue The fields value that contains the nested field or not. + * @param valueInMergedDocument The document to compare against fields value to see if it is also an array or not + * @returns + */ +export const recursiveUnboxingFields = ( + fieldsValue: FieldsType | FieldsType[0], + valueInMergedDocument: SearchTypes +): FieldsType | FieldsType[0] => { + if (Array.isArray(fieldsValue)) { + const fieldsValueMapped = (fieldsValue as Array).map( + (value, index) => { + if (Array.isArray(valueInMergedDocument)) { + return recursiveUnboxingFields(value, valueInMergedDocument[index]); + } else { + return recursiveUnboxingFields(value, undefined); + } + } + ); + + if (fieldsValueMapped.length === 1) { + if (Array.isArray(valueInMergedDocument)) { + return fieldsValueMapped; + } else { + return fieldsValueMapped[0]; + } + } else { + return fieldsValueMapped; + } + } else if (typeof fieldsValue === 'object' && fieldsValue != null) { + const reducedFromKeys = Object.keys(fieldsValue).reduce((accum, key) => { + const recursed = recursiveUnboxingFields( + get(key, fieldsValue), + get(key, valueInMergedDocument) + ); + return set(key, recursed, accum); + }, {}); + return reducedFromKeys; + } else { + return fieldsValue; + } +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts index c399454b9888be..3fc36d5930a0aa 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts @@ -83,14 +83,25 @@ export interface RuleRangeTuple { maxSignals: number; } +/** + * SignalSource is being used as both a type for documents that match detection engine queries as well as + * for queries that could be on top of signals. In cases where it is matched against detection engine queries, + * '@timestamp' might not be there since it is not required and we have timestamp override capabilities. Also + * the signal addition object, "signal?: {" will not be there unless it's a conflicting field when we are running + * queries on events. + * + * For cases where we are running queries against signals (signals on signals) "@timestamp" should always be there + * and the "signal?: {" sub-object should always be there. + */ export interface SignalSource { [key: string]: SearchTypes; - // TODO: SignalSource is being used as the type for documents matching detection engine queries, but they may not - // actually have @timestamp if a timestamp override is used - '@timestamp': string; + '@timestamp'?: string; signal?: { - // parent is deprecated: new signals should populate parents instead - // both are optional until all signals with parent are gone and we can safely remove it + /** + * "parent" is deprecated: new signals should populate "parents" instead. Both are optional + * until all signals with parent are gone and we can safely remove it. + * @deprecated Use parents instead + */ parent?: Ancestor; parents?: Ancestor[]; ancestors: Ancestor[]; @@ -101,7 +112,7 @@ export interface SignalSource { rule: { id: string; }; - // signal.depth doesn't exist on pre-7.10 signals + /** signal.depth was introduced in 7.10 and pre-7.10 signals do not have it. */ depth?: number; original_time?: string; threshold_result?: ThresholdResult; @@ -202,7 +213,9 @@ export interface Signal { version: number; }; rule: RulesSchema; - // DEPRECATED: use parents instead of parent + /** + * @deprecated Use "parents" instead of "parent" + */ parent?: Ancestor; parents: Ancestor[]; ancestors: Ancestor[]; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts index 616cf714d6a8c2..4d5ac05957a4b9 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts @@ -1368,6 +1368,45 @@ describe('utils', () => { const date = getValidDateFromDoc({ doc, timestampOverride: 'different_timestamp' }); expect(date?.toISOString()).toEqual(override); }); + + test('It returns the timestamp if the timestamp happens to be a string of an epoch when it has it in _source and fields', () => { + const doc = sampleDocNoSortId(); + const testDateString = '2021-06-25T15:53:56.590Z'; + const testDate = `${new Date(testDateString).valueOf()}`; + doc._source['@timestamp'] = testDate; + if (doc.fields != null) { + doc.fields['@timestamp'] = [testDate]; + } + const date = getValidDateFromDoc({ doc, timestampOverride: undefined }); + expect(date?.toISOString()).toEqual(testDateString); + }); + + test('It returns the timestamp if the timestamp happens to be a string of an epoch when it has it in _source and fields is nonexistent', () => { + const doc = sampleDocNoSortId(); + const testDateString = '2021-06-25T15:53:56.590Z'; + const testDate = `${new Date(testDateString).valueOf()}`; + doc._source['@timestamp'] = testDate; + doc.fields = undefined; + const date = getValidDateFromDoc({ doc, timestampOverride: undefined }); + expect(date?.toISOString()).toEqual(testDateString); + }); + + test('It returns the timestamp if the timestamp happens to be a string of an epoch in an override field', () => { + const override = '2020-10-07T19:36:31.110Z'; + const testDate = `${new Date(override).valueOf()}`; + let doc = sampleDocNoSortId(); + if (doc == null) { + throw new TypeError('Test requires one element'); + } + doc = { + ...doc, + fields: { + different_timestamp: [testDate], + }, + }; + const date = getValidDateFromDoc({ doc, timestampOverride: 'different_timestamp' }); + expect(date?.toISOString()).toEqual(override); + }); }); describe('createSearchAfterReturnType', () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts index 6d67bab6eb2f76..4dd434156288fd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.ts @@ -625,6 +625,15 @@ export const getValidDateFromDoc = ({ const tempMoment = moment(lastTimestamp); if (tempMoment.isValid()) { return tempMoment.toDate(); + } else if (typeof timestampValue === 'string') { + // worse case we have a string from fields API or other areas of Elasticsearch that have given us a number as a string, + // so we try one last time to parse this best we can by converting from string to a number + const maybeDate = moment(+lastTimestamp); + if (maybeDate.isValid()) { + return maybeDate.toDate(); + } else { + return undefined; + } } else { return undefined; } diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/aliases.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/aliases.ts index ca1281e0d2da91..790dc2b725a728 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/aliases.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/aliases.ts @@ -40,7 +40,7 @@ export default ({ getService }: FtrProviderContext) => { }); it('should keep the original alias value such as "host_alias" from a source index when the value is indexed', async () => { - const rule = getRuleForSignalTesting(['alias']); + const rule = getRuleForSignalTesting(['host_alias']); const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); @@ -51,9 +51,8 @@ export default ({ getService }: FtrProviderContext) => { expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); - // TODO: Make aliases work to where we can have ECS fields such as host.name filled out - it.skip('should copy alias data from a source index into the signals index in the same position when the target is ECS compatible', async () => { - const rule = getRuleForSignalTesting(['alias']); + it('should copy alias data from a source index into the signals index in the same position when the target is ECS compatible', async () => { + const rule = getRuleForSignalTesting(['host_alias']); const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts index 2294d51537fb13..6a6822ba7eb2d7 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_ml.ts @@ -191,6 +191,13 @@ export default ({ getService }: FtrProviderContext) => { }, original_time: '2020-11-16T22:58:08.000Z', }, + all_field_values: [ + 'store', + 'linux_anomalous_network_activity_ecs', + 'root', + 'store', + 'mothra', + ], }); }); diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/const_keyword.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/const_keyword.ts index fccfe4d74e2412..b793fc635843e4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/const_keyword.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/const_keyword.ts @@ -60,8 +60,7 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).to.eql(4); }); - // TODO: Fix this bug and make this work. We currently do not write out the dataset name when it is not in _source - it.skip('should copy the dataset_name_1 from the index into the signal', async () => { + it('should copy the dataset_name_1 from the index into the signal', async () => { const rule = { ...getRuleForSignalTesting(['const_keyword']), query: 'event.dataset: "dataset_name_1"', @@ -99,8 +98,7 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).to.eql(4); }); - // TODO: Fix this bug and make this work. We currently do not write out the dataset name when it is not in _source - it.skip('should copy the "dataset_name_1" from "event.dataset"', async () => { + it('should copy the "dataset_name_1" from "event.dataset"', async () => { const rule: EqlCreateSchema = { ...getRuleForSignalTesting(['const_keyword']), rule_id: 'eql-rule', diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/keyword_mixed_with_const.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/keyword_mixed_with_const.ts index 3802d1f7a7beff..2ce88da13afab2 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/keyword_mixed_with_const.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/keyword_family/keyword_mixed_with_const.ts @@ -62,8 +62,7 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).to.eql(8); }); - // TODO: Fix this bug and make this work. We currently do not write out the dataset name when it is not in _source - it.skip('should copy the dataset_name_1 from the index into the signal', async () => { + it('should copy the dataset_name_1 from the index into the signal', async () => { const rule = { ...getRuleForSignalTesting(['keyword', 'const_keyword']), query: 'event.dataset: "dataset_name_1"', @@ -105,8 +104,7 @@ export default ({ getService }: FtrProviderContext) => { expect(signalsOpen.hits.hits.length).to.eql(8); }); - // TODO: Fix this bug and make this work. We currently do not write out the dataset name when it is not in _source - it.skip('should copy the "dataset_name_1" from "event.dataset"', async () => { + it('should copy the "dataset_name_1" from "event.dataset"', async () => { const rule: EqlCreateSchema = { ...getRuleForSignalTesting(['keyword', 'const_keyword']), rule_id: 'eql-rule', diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts index 94cc390e0e6ef6..0015a41f911d47 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/runtime.ts @@ -23,7 +23,7 @@ import { export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - interface HostAlias { + interface Runtime { name: string; hostname: string; } @@ -47,19 +47,18 @@ export default ({ getService }: FtrProviderContext) => { await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); - const hits = signalsOpen.hits.hits.map((signal) => (signal._source.host as HostAlias).name); + const hits = signalsOpen.hits.hits.map((signal) => (signal._source.host as Runtime).name); expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); - // TODO: Make runtime fields able to be copied to where we can have ECS fields such as host.name filled out by them within the mapping directly - it.skip('should copy "runtime mapping" data from a source index into the signals index in the same position when the target is ECS compatible', async () => { + it('should copy "runtime mapping" data from a source index into the signals index in the same position when the target is ECS compatible', async () => { const rule = getRuleForSignalTesting(['runtime']); const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); const hits = signalsOpen.hits.hits.map( - (signal) => (signal._source.host_alias as HostAlias).hostname + (signal) => (signal._source.host as Runtime).hostname ); expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); }); @@ -81,33 +80,69 @@ export default ({ getService }: FtrProviderContext) => { ); }); - // TODO: Make the overrides of runtime fields override the host.name in this use case. - it.skip('should copy normal non-runtime data set from the source index into the signals index in the same position when the target is ECS compatible', async () => { + /** + * Note, this test shows that we do not shadow or overwrite runtime fields on-top of regular fields as we reduced + * risk with overwriting fields in the strategy we are currently using in detection engine. If you swap, change the strategies + * because we decide to overwrite "_source" values with "fields", then expect to change this test. + */ + it('should NOT copy normal non-runtime data set from the source index into the signals index in the same position when the target is ECS compatible', async () => { const rule = getRuleForSignalTesting(['runtime_conflicting_fields']); const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); - const hits = signalsOpen.hits.hits.map((signal) => (signal._source.host as HostAlias).name); + const hits = signalsOpen.hits.hits.map((signal) => signal._source.host); expect(hits).to.eql([ - 'I am the [host.name] field value which shadows the original host.name value', - 'I am the [host.name] field value which shadows the original host.name value', - 'I am the [host.name] field value which shadows the original host.name value', - 'I am the [host.name] field value which shadows the original host.name value', + [ + { + name: 'host name 1_1', + }, + { + name: 'host name 1_2', + }, + ], + [ + { + name: 'host name 2_1', + }, + { + name: 'host name 2_2', + }, + ], + [ + { + name: 'host name 3_1', + }, + { + name: 'host name 3_2', + }, + ], + [ + { + name: 'host name 4_1', + }, + { + name: 'host name 4_2', + }, + ], ]); }); - // TODO: Make runtime fields able to be copied to where we can have ECS fields such as host.name filled out by them within the mapping directly - it.skip('should copy "runtime mapping" data from a source index into the signals index in the same position when the target is ECS compatible', async () => { + /** + * Note, this test shows that we do NOT shadow or overwrite runtime fields on-top of regular fields when we detect those + * fields as arrays of objects since the objects are flattened in "fields" and we detect something already there so we skip + * this shadowed runtime data as it is ambiguous of where we would put it in the array. + */ + it('should NOT copy "runtime mapping" data from a source index into the signals index in the same position when the target is ECS compatible', async () => { const rule = getRuleForSignalTesting(['runtime_conflicting_fields']); const { id } = await createRule(supertest, rule); await waitForRuleSuccessOrStatus(supertest, id); await waitForSignalsToBePresent(supertest, 4, [id]); const signalsOpen = await getSignalsById(supertest, id); const hits = signalsOpen.hits.hits.map( - (signal) => (signal._source.host_alias as HostAlias).hostname + (signal) => (signal._source.host as Runtime).hostname ); - expect(hits).to.eql(['host name 1', 'host name 2', 'host name 3', 'host name 4']); + expect(hits).to.eql([undefined, undefined, undefined, undefined]); }); }); }); diff --git a/x-pack/test/functional/es_archives/security_solution/alias/data.json b/x-pack/test/functional/es_archives/security_solution/alias/data.json index a8bd64cb044eb7..f0f74a9094df12 100644 --- a/x-pack/test/functional/es_archives/security_solution/alias/data.json +++ b/x-pack/test/functional/es_archives/security_solution/alias/data.json @@ -2,7 +2,7 @@ "type": "doc", "value": { "id": "1", - "index": "alias", + "index": "host_alias", "source": { "@timestamp": "2020-10-28T05:00:53.000Z", "host_alias": { @@ -17,7 +17,7 @@ "type": "doc", "value": { "id": "2", - "index": "alias", + "index": "host_alias", "source": { "@timestamp": "2020-10-28T05:01:53.000Z", "host_alias": { @@ -32,7 +32,7 @@ "type": "doc", "value": { "id": "3", - "index": "alias", + "index": "host_alias", "source": { "@timestamp": "2020-10-28T05:02:53.000Z", "host_alias": { @@ -47,7 +47,7 @@ "type": "doc", "value": { "id": "4", - "index": "alias", + "index": "host_alias", "source": { "@timestamp": "2020-10-28T05:03:53.000Z", "host_alias": { diff --git a/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json b/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json index 04a538a3329532..2e34eae159a7f7 100644 --- a/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json +++ b/x-pack/test/functional/es_archives/security_solution/runtime_conflicting_fields/mappings.json @@ -5,7 +5,7 @@ "mappings": { "dynamic": "strict", "runtime": { - "host_alias": { + "host.hostname": { "type": "keyword", "script": { "source": "emit(doc['host.name'].value)" @@ -98,6 +98,9 @@ "properties": { "name": { "type": "keyword" + }, + "hostname": { + "type": "keyword" } } } From f28bfa71ad1ef9803d9a5fa59fcbe70c50564373 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Mon, 28 Jun 2021 18:13:12 -0600 Subject: [PATCH 057/227] [Maps] Move edit tools to beta and remove experimental config flags (#103556) --- x-pack/plugins/maps/config.ts | 2 -- .../public/classes/layers/layer_wizard_registry.ts | 2 ++ .../public/classes/layers/load_layer_wizards.ts | 5 +---- .../layers/new_vector_layer_wizard/config.tsx | 4 +++- .../sources/es_search_source/es_search_source.tsx | 10 +--------- .../flyout_body/layer_wizard_select.tsx | 1 + x-pack/plugins/maps/server/index.ts | 1 - x-pack/plugins/maps/server/plugin.ts | 9 +-------- x-pack/plugins/maps/server/routes.js | 13 ++----------- x-pack/test/functional/config.js | 1 - 10 files changed, 11 insertions(+), 37 deletions(-) diff --git a/x-pack/plugins/maps/config.ts b/x-pack/plugins/maps/config.ts index 781967714be035..104ba002635450 100644 --- a/x-pack/plugins/maps/config.ts +++ b/x-pack/plugins/maps/config.ts @@ -10,7 +10,6 @@ import { schema, TypeOf } from '@kbn/config-schema'; export interface MapsConfigType { enabled: boolean; showMapVisualizationTypes: boolean; - enableDrawingFeature: boolean; showMapsInspectorAdapter: boolean; preserveDrawingBuffer: boolean; } @@ -18,7 +17,6 @@ export interface MapsConfigType { export const configSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), showMapVisualizationTypes: schema.boolean({ defaultValue: false }), - enableDrawingFeature: schema.boolean({ defaultValue: false }), // flag used in functional testing showMapsInspectorAdapter: schema.boolean({ defaultValue: false }), // flag used in functional testing diff --git a/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts b/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts index 824d9835380ec2..b14ba7cf693b04 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts +++ b/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts @@ -33,6 +33,7 @@ export type LayerWizard = { description: string; disabledReason?: string; getIsDisabled?: () => Promise | boolean; + isBeta?: boolean; icon: string | FunctionComponent; prerequisiteSteps?: Array<{ id: string; label: string }>; renderWizard(renderWizardArguments: RenderWizardArguments): ReactElement; @@ -54,6 +55,7 @@ export function registerLayerWizard(layerWizard: LayerWizard) { getIsDisabled: async () => { return false; }, + isBeta: false, ...layerWizard, }); } diff --git a/x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts b/x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts index 2c7f09ce9dfeb4..3c86c57343a067 100644 --- a/x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts +++ b/x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts @@ -29,7 +29,6 @@ import { ObservabilityLayerWizardConfig } from './solution_layers/observability' import { SecurityLayerWizardConfig } from './solution_layers/security'; import { choroplethLayerWizardConfig } from './choropleth_layer_wizard'; import { newVectorLayerWizardConfig } from './new_vector_layer_wizard'; -import { getMapAppConfig } from '../../kibana_services'; let registered = false; export function registerLayerWizards() { @@ -39,9 +38,7 @@ export function registerLayerWizards() { // Registration order determines display order registerLayerWizard(uploadLayerWizardConfig); - if (getMapAppConfig().enableDrawingFeature) { - registerLayerWizard(newVectorLayerWizardConfig); - } + registerLayerWizard(newVectorLayerWizardConfig); registerLayerWizard(esDocumentsLayerWizardConfig); // @ts-ignore registerLayerWizard(choroplethLayerWizardConfig); diff --git a/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx b/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx index 2a0400c3d6beea..c4464c8787c19e 100644 --- a/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx +++ b/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx @@ -18,7 +18,8 @@ const ADD_VECTOR_DRAWING_LAYER = 'ADD_VECTOR_DRAWING_LAYER'; export const newVectorLayerWizardConfig: LayerWizard = { categories: [LAYER_WIZARD_CATEGORY.ELASTICSEARCH], description: i18n.translate('xpack.maps.newVectorLayerWizard.description', { - defaultMessage: 'Creates a new empty layer. Use this to add shapes to the map', + defaultMessage: + 'Create an empty layer. Use this to create documents by drawing shapes on the map', }), disabledReason: i18n.translate('xpack.maps.newVectorLayerWizard.disabledDesc', { defaultMessage: @@ -31,6 +32,7 @@ export const newVectorLayerWizardConfig: LayerWizard = { }); return !hasImportPermission; }, + isBeta: true, icon: DrawLayerIcon, prerequisiteSteps: [ { diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx index 019c3c1b4943b0..343c366b548f6e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx @@ -12,12 +12,7 @@ import { i18n } from '@kbn/i18n'; import { IFieldType, IndexPattern } from 'src/plugins/data/public'; import { GeoJsonProperties, Geometry, Position } from 'geojson'; import { AbstractESSource } from '../es_source'; -import { - getHttp, - getMapAppConfig, - getSearchService, - getTimeFilter, -} from '../../../kibana_services'; +import { getHttp, getSearchService, getTimeFilter } from '../../../kibana_services'; import { addFieldToDSL, getField, @@ -424,9 +419,6 @@ export class ESSearchSource extends AbstractESSource implements ITiledSingleLaye } async supportsFeatureEditing(): Promise { - if (!getMapAppConfig().enableDrawingFeature) { - return false; - } await this.getIndexPattern(); if (!(this.indexPattern && this.indexPattern.title)) { return false; diff --git a/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.tsx b/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.tsx index 5350b0e2ccf38f..1e92dd16d9dac8 100644 --- a/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.tsx +++ b/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.tsx @@ -161,6 +161,7 @@ export class LayerWizardSelect extends Component { = { exposeToBrowser: { enabled: true, showMapVisualizationTypes: true, - enableDrawingFeature: true, showMapsInspectorAdapter: true, preserveDrawingBuffer: true, }, diff --git a/x-pack/plugins/maps/server/plugin.ts b/x-pack/plugins/maps/server/plugin.ts index b8676559a4e2b1..c5fc602864f965 100644 --- a/x-pack/plugins/maps/server/plugin.ts +++ b/x-pack/plugins/maps/server/plugin.ts @@ -170,14 +170,7 @@ export class MapsPlugin implements Plugin { lastLicenseId = license.uid; }); - initRoutes( - core, - () => lastLicenseId, - emsSettings, - this.kibanaVersion, - this._logger, - currentConfig.enableDrawingFeature - ); + initRoutes(core, () => lastLicenseId, emsSettings, this.kibanaVersion, this._logger); this._initHomeData(home, core.http.basePath.prepend, emsSettings); diff --git a/x-pack/plugins/maps/server/routes.js b/x-pack/plugins/maps/server/routes.js index 39ce9979870c5b..1b669a5bcdbee5 100644 --- a/x-pack/plugins/maps/server/routes.js +++ b/x-pack/plugins/maps/server/routes.js @@ -54,14 +54,7 @@ const EMPTY_EMS_CLIENT = { addQueryParams() {}, }; -export async function initRoutes( - core, - getLicenseId, - emsSettings, - kbnVersion, - logger, - drawingFeatureEnabled -) { +export async function initRoutes(core, getLicenseId, emsSettings, kbnVersion, logger) { let emsClient; let lastLicenseId; const router = core.http.createRouter(); @@ -624,7 +617,5 @@ export async function initRoutes( } initMVTRoutes({ router, logger }); - if (drawingFeatureEnabled) { - initIndexingRoutes({ router, logger, dataPlugin }); - } + initIndexingRoutes({ router, logger, dataPlugin }); } diff --git a/x-pack/test/functional/config.js b/x-pack/test/functional/config.js index 2c3a3c93e2a0ae..a79e51057c90e1 100644 --- a/x-pack/test/functional/config.js +++ b/x-pack/test/functional/config.js @@ -85,7 +85,6 @@ export default async function ({ readConfigFile }) { '--server.uuid=5b2de169-2785-441b-ae8c-186a1936b17d', '--xpack.maps.showMapsInspectorAdapter=true', '--xpack.maps.preserveDrawingBuffer=true', - '--xpack.maps.enableDrawingFeature=true', '--xpack.reporting.roles.enabled=false', // use the non-deprecated access control model for Reporting '--xpack.reporting.queue.pollInterval=3000', // make it explicitly the default '--xpack.reporting.csv.maxSizeBytes=2850', // small-ish limit for cutting off a 1999 byte report From ad3601c260b7e7e683c7976a6734604cec04b39f Mon Sep 17 00:00:00 2001 From: fgierlinger <2966031+fgierlinger@users.noreply.github.com> Date: Tue, 29 Jun 2021 02:17:26 +0200 Subject: [PATCH 058/227] fix: typo in time dropdown list (#103407) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/node_details/tabs/metrics/time_dropdown.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/time_dropdown.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/time_dropdown.tsx index c080cf279478ff..28e57992cfafbc 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/time_dropdown.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/time_dropdown.tsx @@ -20,7 +20,7 @@ export const TimeDropdown = (props: Props) => ( options={[ { text: i18n.translate('xpack.infra.nodeDetails.metrics.last15Minutes', { - defaultMessage: 'Last 15 mintues', + defaultMessage: 'Last 15 minutes', }), value: 15 * 60 * 1000, }, From 699c875b210c2451959c6b7d41116c83d51284b9 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Mon, 28 Jun 2021 19:18:14 -0500 Subject: [PATCH 059/227] [Workplace Search] Fix edge case API error (#103574) This PR fixes an edge case where a race condition mught cause the total_results from a federated content source to come back null from the server. This PR tells the server to expect null in those edge cases to prevent browser errors --- .../enterprise_search/server/routes/workplace_search/sources.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts b/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts index 7e9d7d92742ab9..044393f65dc59c 100644 --- a/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts +++ b/x-pack/plugins/enterprise_search/server/routes/workplace_search/sources.ts @@ -25,7 +25,7 @@ const pageSchema = schema.object({ current: schema.nullable(schema.number()), size: schema.nullable(schema.number()), total_pages: schema.nullable(schema.number()), - total_results: schema.number(), + total_results: schema.nullable(schema.number()), }); const oauthConfigSchema = schema.object({ From aafcc473f3a947cc406fb3024767351f9c740ed7 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 28 Jun 2021 17:23:10 -0700 Subject: [PATCH 060/227] [Reporting] Reorganize UI components (#103571) --- x-pack/plugins/reporting/public/index.ts | 2 +- .../job_queue_client.test.mocks.ts | 2 +- .../reporting/public/lib/reporting_api_client.ts | 2 +- .../plugins/reporting/public/lib/stream_handler.ts | 2 +- .../__snapshots__/report_info_button.test.tsx.snap | 0 .../__snapshots__/report_listing.test.tsx.snap | 0 .../buttons/index.tsx => management/index.ts} | 0 .../{ => management}/mount_management_section.tsx | 14 +++++++------- .../report_delete_button.tsx | 6 +++--- .../report_diagnostic.tsx | 0 .../report_download_button.tsx | 4 ++-- .../buttons => management}/report_error_button.tsx | 6 +++--- .../report_info_button.test.tsx | 4 ++-- .../buttons => management}/report_info_button.tsx | 6 +++--- .../report_listing.test.tsx | 0 .../{components => management}/report_listing.tsx | 7 +------ x-pack/plugins/reporting/public/mocks.ts | 2 +- .../{components => notifier}/general_error.tsx | 0 .../public/{components => notifier}/index.ts | 6 ++---- .../job_completion_notifications.ts | 0 .../job_download_button.tsx | 0 .../{components => notifier}/job_failure.tsx | 0 .../{components => notifier}/job_success.tsx | 0 .../job_warning_formulas.tsx | 0 .../job_warning_max_size.tsx | 0 .../{components => notifier}/report_link.tsx | 0 x-pack/plugins/reporting/public/plugin.ts | 5 +++-- .../screen_capture_panel_content.test.tsx.snap | 0 .../panel_spinner.tsx | 0 .../share_context_menu/register_csv_reporting.tsx | 2 +- .../register_pdf_png_reporting.tsx | 2 +- .../reporting_panel_content.test.tsx | 0 .../reporting_panel_content.tsx | 0 .../reporting_panel_content_lazy.tsx | 2 +- .../screen_capture_panel_content.test.tsx | 0 .../screen_capture_panel_content.tsx | 0 .../screen_capture_panel_content_lazy.tsx | 2 +- .../shared/get_shared_components.tsx | 8 ++++---- .../shared/index.tsx => shared/index.ts} | 0 39 files changed, 39 insertions(+), 45 deletions(-) rename x-pack/plugins/reporting/public/{components => lib}/job_queue_client.test.mocks.ts (87%) rename x-pack/plugins/reporting/public/{components/buttons => management}/__snapshots__/report_info_button.test.tsx.snap (100%) rename x-pack/plugins/reporting/public/{components => management}/__snapshots__/report_listing.test.tsx.snap (100%) rename x-pack/plugins/reporting/public/{components/buttons/index.tsx => management/index.ts} (100%) rename x-pack/plugins/reporting/public/{ => management}/mount_management_section.tsx (78%) rename x-pack/plugins/reporting/public/{components/buttons => management}/report_delete_button.tsx (94%) rename x-pack/plugins/reporting/public/{components => management}/report_diagnostic.tsx (100%) rename x-pack/plugins/reporting/public/{components/buttons => management}/report_download_button.tsx (93%) rename x-pack/plugins/reporting/public/{components/buttons => management}/report_error_button.tsx (93%) rename x-pack/plugins/reporting/public/{components/buttons => management}/report_info_button.test.tsx (94%) rename x-pack/plugins/reporting/public/{components/buttons => management}/report_info_button.tsx (97%) rename x-pack/plugins/reporting/public/{components => management}/report_listing.test.tsx (100%) rename x-pack/plugins/reporting/public/{components => management}/report_listing.tsx (99%) rename x-pack/plugins/reporting/public/{components => notifier}/general_error.tsx (100%) rename x-pack/plugins/reporting/public/{components => notifier}/index.ts (81%) rename x-pack/plugins/reporting/public/{lib => notifier}/job_completion_notifications.ts (100%) rename x-pack/plugins/reporting/public/{components => notifier}/job_download_button.tsx (100%) rename x-pack/plugins/reporting/public/{components => notifier}/job_failure.tsx (100%) rename x-pack/plugins/reporting/public/{components => notifier}/job_success.tsx (100%) rename x-pack/plugins/reporting/public/{components => notifier}/job_warning_formulas.tsx (100%) rename x-pack/plugins/reporting/public/{components => notifier}/job_warning_max_size.tsx (100%) rename x-pack/plugins/reporting/public/{components => notifier}/report_link.tsx (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/__snapshots__/screen_capture_panel_content.test.tsx.snap (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/panel_spinner.tsx (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/reporting_panel_content.test.tsx (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/reporting_panel_content.tsx (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/reporting_panel_content_lazy.tsx (94%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/screen_capture_panel_content.test.tsx (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/screen_capture_panel_content.tsx (100%) rename x-pack/plugins/reporting/public/{components => share_context_menu}/screen_capture_panel_content_lazy.tsx (94%) rename x-pack/plugins/reporting/public/{components => }/shared/get_shared_components.tsx (79%) rename x-pack/plugins/reporting/public/{components/shared/index.tsx => shared/index.ts} (100%) diff --git a/x-pack/plugins/reporting/public/index.ts b/x-pack/plugins/reporting/public/index.ts index 7179a81664b6f7..6acdd8fb048e8c 100644 --- a/x-pack/plugins/reporting/public/index.ts +++ b/x-pack/plugins/reporting/public/index.ts @@ -7,9 +7,9 @@ import { PluginInitializerContext } from 'src/core/public'; import { getDefaultLayoutSelectors } from '../common'; -import { getSharedComponents } from './components'; import { ReportingAPIClient } from './lib/reporting_api_client'; import { ReportingPublicPlugin } from './plugin'; +import { getSharedComponents } from './shared'; export interface ReportingSetup { getDefaultLayoutSelectors: typeof getDefaultLayoutSelectors; diff --git a/x-pack/plugins/reporting/public/components/job_queue_client.test.mocks.ts b/x-pack/plugins/reporting/public/lib/job_queue_client.test.mocks.ts similarity index 87% rename from x-pack/plugins/reporting/public/components/job_queue_client.test.mocks.ts rename to x-pack/plugins/reporting/public/lib/job_queue_client.test.mocks.ts index 9426ec8d8751d3..6c66eada6a8256 100644 --- a/x-pack/plugins/reporting/public/components/job_queue_client.test.mocks.ts +++ b/x-pack/plugins/reporting/public/lib/job_queue_client.test.mocks.ts @@ -15,4 +15,4 @@ export const mockAPIClient = { downloadReport: jest.fn(), }; -jest.mock('../lib/reporting_api_client', () => mockAPIClient); +jest.mock('./reporting_api_client', () => mockAPIClient); diff --git a/x-pack/plugins/reporting/public/lib/reporting_api_client.ts b/x-pack/plugins/reporting/public/lib/reporting_api_client.ts index 92604de0f47120..4ce9e8760f21fa 100644 --- a/x-pack/plugins/reporting/public/lib/reporting_api_client.ts +++ b/x-pack/plugins/reporting/public/lib/reporting_api_client.ts @@ -22,7 +22,7 @@ import { ReportDocument, ReportSource, } from '../../common/types'; -import { add } from './job_completion_notifications'; +import { add } from '../notifier/job_completion_notifications'; export interface JobQueueEntry { _id: string; diff --git a/x-pack/plugins/reporting/public/lib/stream_handler.ts b/x-pack/plugins/reporting/public/lib/stream_handler.ts index 961345aeb592cc..53191cacb5ba1a 100644 --- a/x-pack/plugins/reporting/public/lib/stream_handler.ts +++ b/x-pack/plugins/reporting/public/lib/stream_handler.ts @@ -17,7 +17,7 @@ import { getSuccessToast, getWarningFormulasToast, getWarningMaxSizeToast, -} from '../components'; +} from '../notifier'; import { ReportingAPIClient } from './reporting_api_client'; function updateStored(jobIds: JobId[]): void { diff --git a/x-pack/plugins/reporting/public/components/buttons/__snapshots__/report_info_button.test.tsx.snap b/x-pack/plugins/reporting/public/management/__snapshots__/report_info_button.test.tsx.snap similarity index 100% rename from x-pack/plugins/reporting/public/components/buttons/__snapshots__/report_info_button.test.tsx.snap rename to x-pack/plugins/reporting/public/management/__snapshots__/report_info_button.test.tsx.snap diff --git a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap b/x-pack/plugins/reporting/public/management/__snapshots__/report_listing.test.tsx.snap similarity index 100% rename from x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap rename to x-pack/plugins/reporting/public/management/__snapshots__/report_listing.test.tsx.snap diff --git a/x-pack/plugins/reporting/public/components/buttons/index.tsx b/x-pack/plugins/reporting/public/management/index.ts similarity index 100% rename from x-pack/plugins/reporting/public/components/buttons/index.tsx rename to x-pack/plugins/reporting/public/management/index.ts diff --git a/x-pack/plugins/reporting/public/mount_management_section.tsx b/x-pack/plugins/reporting/public/management/mount_management_section.tsx similarity index 78% rename from x-pack/plugins/reporting/public/mount_management_section.tsx rename to x-pack/plugins/reporting/public/management/mount_management_section.tsx index bc165badae7135..eb1057a9bdfc77 100644 --- a/x-pack/plugins/reporting/public/mount_management_section.tsx +++ b/x-pack/plugins/reporting/public/management/mount_management_section.tsx @@ -5,16 +5,16 @@ * 2.0. */ +import { I18nProvider } from '@kbn/i18n/react'; import * as React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { I18nProvider } from '@kbn/i18n/react'; -import { CoreSetup, CoreStart } from 'src/core/public'; import { Observable } from 'rxjs'; -import { ReportListing } from './components/report_listing'; -import { ManagementAppMountParams } from '../../../../src/plugins/management/public'; -import { ILicense } from '../../licensing/public'; -import { ClientConfigType } from './plugin'; -import { ReportingAPIClient } from './lib/reporting_api_client'; +import { CoreSetup, CoreStart } from 'src/core/public'; +import { ManagementAppMountParams } from '../../../../../src/plugins/management/public'; +import { ILicense } from '../../../licensing/public'; +import { ReportingAPIClient } from '../lib/reporting_api_client'; +import { ClientConfigType } from '../plugin'; +import { ReportListing } from './report_listing'; export async function mountManagementSection( coreSetup: CoreSetup, diff --git a/x-pack/plugins/reporting/public/components/buttons/report_delete_button.tsx b/x-pack/plugins/reporting/public/management/report_delete_button.tsx similarity index 94% rename from x-pack/plugins/reporting/public/components/buttons/report_delete_button.tsx rename to x-pack/plugins/reporting/public/management/report_delete_button.tsx index cd432758fa7675..dfb411fc195e8a 100644 --- a/x-pack/plugins/reporting/public/components/buttons/report_delete_button.tsx +++ b/x-pack/plugins/reporting/public/management/report_delete_button.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import { EuiConfirmModal, EuiButton } from '@elastic/eui'; -import React, { PureComponent, Fragment } from 'react'; -import { Job, Props as ListingProps } from '../report_listing'; +import { EuiButton, EuiConfirmModal } from '@elastic/eui'; +import React, { Fragment, PureComponent } from 'react'; +import { Job, Props as ListingProps } from './report_listing'; type DeleteFn = () => Promise; type Props = { jobsToDelete: Job[]; performDelete: DeleteFn } & ListingProps; diff --git a/x-pack/plugins/reporting/public/components/report_diagnostic.tsx b/x-pack/plugins/reporting/public/management/report_diagnostic.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/report_diagnostic.tsx rename to x-pack/plugins/reporting/public/management/report_diagnostic.tsx diff --git a/x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx b/x-pack/plugins/reporting/public/management/report_download_button.tsx similarity index 93% rename from x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx rename to x-pack/plugins/reporting/public/management/report_download_button.tsx index a5e57dafc28678..78022b85e2ff86 100644 --- a/x-pack/plugins/reporting/public/components/buttons/report_download_button.tsx +++ b/x-pack/plugins/reporting/public/management/report_download_button.tsx @@ -7,8 +7,8 @@ import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import React, { FunctionComponent } from 'react'; -import { JOB_STATUSES } from '../../../common/constants'; -import { Job as ListingJob, Props as ListingProps } from '../report_listing'; +import { JOB_STATUSES } from '../../common/constants'; +import { Job as ListingJob, Props as ListingProps } from './report_listing'; type Props = { record: ListingJob } & ListingProps; diff --git a/x-pack/plugins/reporting/public/components/buttons/report_error_button.tsx b/x-pack/plugins/reporting/public/management/report_error_button.tsx similarity index 93% rename from x-pack/plugins/reporting/public/components/buttons/report_error_button.tsx rename to x-pack/plugins/reporting/public/management/report_error_button.tsx index b34463b61253b4..0ebdf5ca60b5a0 100644 --- a/x-pack/plugins/reporting/public/components/buttons/report_error_button.tsx +++ b/x-pack/plugins/reporting/public/management/report_error_button.tsx @@ -8,9 +8,9 @@ import { EuiButtonIcon, EuiCallOut, EuiPopover } from '@elastic/eui'; import { InjectedIntl, injectI18n } from '@kbn/i18n/react'; import React, { Component } from 'react'; -import { JOB_STATUSES } from '../../../common/constants'; -import { JobContent, ReportingAPIClient } from '../../lib/reporting_api_client'; -import { Job as ListingJob } from '../report_listing'; +import { JOB_STATUSES } from '../../common/constants'; +import { JobContent, ReportingAPIClient } from '../lib/reporting_api_client'; +import { Job as ListingJob } from './report_listing'; interface Props { intl: InjectedIntl; diff --git a/x-pack/plugins/reporting/public/components/buttons/report_info_button.test.tsx b/x-pack/plugins/reporting/public/management/report_info_button.test.tsx similarity index 94% rename from x-pack/plugins/reporting/public/components/buttons/report_info_button.test.tsx rename to x-pack/plugins/reporting/public/management/report_info_button.test.tsx index 785f49646110a1..119856042a3266 100644 --- a/x-pack/plugins/reporting/public/components/buttons/report_info_button.test.tsx +++ b/x-pack/plugins/reporting/public/management/report_info_button.test.tsx @@ -9,9 +9,9 @@ import React from 'react'; import { mountWithIntl } from '@kbn/test/jest'; import { ReportInfoButton } from './report_info_button'; -jest.mock('../../lib/reporting_api_client'); +jest.mock('../lib/reporting_api_client'); -import { ReportingAPIClient } from '../../lib/reporting_api_client'; +import { ReportingAPIClient } from '../lib/reporting_api_client'; const httpSetup = {} as any; const apiClient = new ReportingAPIClient(httpSetup); diff --git a/x-pack/plugins/reporting/public/components/buttons/report_info_button.tsx b/x-pack/plugins/reporting/public/management/report_info_button.tsx similarity index 97% rename from x-pack/plugins/reporting/public/components/buttons/report_info_button.tsx rename to x-pack/plugins/reporting/public/management/report_info_button.tsx index 7f2d5b6adcc333..719f1ff341daf8 100644 --- a/x-pack/plugins/reporting/public/components/buttons/report_info_button.tsx +++ b/x-pack/plugins/reporting/public/management/report_info_button.tsx @@ -18,9 +18,9 @@ import { } from '@elastic/eui'; import { get } from 'lodash'; import React, { Component, Fragment } from 'react'; -import { USES_HEADLESS_JOB_TYPES } from '../../../common/constants'; -import { ReportApiJSON } from '../../../common/types'; -import { ReportingAPIClient } from '../../lib/reporting_api_client'; +import { USES_HEADLESS_JOB_TYPES } from '../../common/constants'; +import { ReportApiJSON } from '../../common/types'; +import { ReportingAPIClient } from '../lib/reporting_api_client'; interface Props { jobId: string; diff --git a/x-pack/plugins/reporting/public/components/report_listing.test.tsx b/x-pack/plugins/reporting/public/management/report_listing.test.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/report_listing.test.tsx rename to x-pack/plugins/reporting/public/management/report_listing.test.tsx diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/management/report_listing.tsx similarity index 99% rename from x-pack/plugins/reporting/public/components/report_listing.tsx rename to x-pack/plugins/reporting/public/management/report_listing.tsx index 618c91fba07157..fffa952be6cb43 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/management/report_listing.tsx @@ -28,12 +28,7 @@ import { durationToNumber } from '../../common/schema_utils'; import { checkLicense } from '../lib/license_check'; import { JobQueueEntry, ReportingAPIClient } from '../lib/reporting_api_client'; import { ClientConfigType } from '../plugin'; -import { - ReportDeleteButton, - ReportDownloadButton, - ReportErrorButton, - ReportInfoButton, -} from './buttons'; +import { ReportDeleteButton, ReportDownloadButton, ReportErrorButton, ReportInfoButton } from './'; import { ReportDiagnostic } from './report_diagnostic'; export interface Job { diff --git a/x-pack/plugins/reporting/public/mocks.ts b/x-pack/plugins/reporting/public/mocks.ts index 414d1b0ae70fe3..a6b6d835499c6a 100644 --- a/x-pack/plugins/reporting/public/mocks.ts +++ b/x-pack/plugins/reporting/public/mocks.ts @@ -8,7 +8,7 @@ import { coreMock } from 'src/core/public/mocks'; import { ReportingSetup } from '.'; import { getDefaultLayoutSelectors } from '../common'; -import { getSharedComponents } from './components/shared'; +import { getSharedComponents } from './shared'; type Setup = jest.Mocked; diff --git a/x-pack/plugins/reporting/public/components/general_error.tsx b/x-pack/plugins/reporting/public/notifier/general_error.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/general_error.tsx rename to x-pack/plugins/reporting/public/notifier/general_error.tsx diff --git a/x-pack/plugins/reporting/public/components/index.ts b/x-pack/plugins/reporting/public/notifier/index.ts similarity index 81% rename from x-pack/plugins/reporting/public/components/index.ts rename to x-pack/plugins/reporting/public/notifier/index.ts index b8cccda2a6613b..b44f1e91697472 100644 --- a/x-pack/plugins/reporting/public/components/index.ts +++ b/x-pack/plugins/reporting/public/notifier/index.ts @@ -5,10 +5,8 @@ * 2.0. */ -export { getSuccessToast } from './job_success'; export { getFailureToast } from './job_failure'; +export { getGeneralErrorToast } from './general_error'; +export { getSuccessToast } from './job_success'; export { getWarningFormulasToast } from './job_warning_formulas'; export { getWarningMaxSizeToast } from './job_warning_max_size'; -export { getGeneralErrorToast } from './general_error'; -export { ScreenCapturePanelContent } from './screen_capture_panel_content'; -export { getSharedComponents } from './shared'; diff --git a/x-pack/plugins/reporting/public/lib/job_completion_notifications.ts b/x-pack/plugins/reporting/public/notifier/job_completion_notifications.ts similarity index 100% rename from x-pack/plugins/reporting/public/lib/job_completion_notifications.ts rename to x-pack/plugins/reporting/public/notifier/job_completion_notifications.ts diff --git a/x-pack/plugins/reporting/public/components/job_download_button.tsx b/x-pack/plugins/reporting/public/notifier/job_download_button.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/job_download_button.tsx rename to x-pack/plugins/reporting/public/notifier/job_download_button.tsx diff --git a/x-pack/plugins/reporting/public/components/job_failure.tsx b/x-pack/plugins/reporting/public/notifier/job_failure.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/job_failure.tsx rename to x-pack/plugins/reporting/public/notifier/job_failure.tsx diff --git a/x-pack/plugins/reporting/public/components/job_success.tsx b/x-pack/plugins/reporting/public/notifier/job_success.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/job_success.tsx rename to x-pack/plugins/reporting/public/notifier/job_success.tsx diff --git a/x-pack/plugins/reporting/public/components/job_warning_formulas.tsx b/x-pack/plugins/reporting/public/notifier/job_warning_formulas.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/job_warning_formulas.tsx rename to x-pack/plugins/reporting/public/notifier/job_warning_formulas.tsx diff --git a/x-pack/plugins/reporting/public/components/job_warning_max_size.tsx b/x-pack/plugins/reporting/public/notifier/job_warning_max_size.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/job_warning_max_size.tsx rename to x-pack/plugins/reporting/public/notifier/job_warning_max_size.tsx diff --git a/x-pack/plugins/reporting/public/components/report_link.tsx b/x-pack/plugins/reporting/public/notifier/report_link.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/report_link.tsx rename to x-pack/plugins/reporting/public/notifier/report_link.tsx diff --git a/x-pack/plugins/reporting/public/plugin.ts b/x-pack/plugins/reporting/public/plugin.ts index 577732fdb13927..a2881af902072e 100644 --- a/x-pack/plugins/reporting/public/plugin.ts +++ b/x-pack/plugins/reporting/public/plugin.ts @@ -29,10 +29,11 @@ import { constants, getDefaultLayoutSelectors } from '../common'; import { durationToNumber } from '../common/schema_utils'; import { JobId, JobSummarySet } from '../common/types'; import { ReportingSetup, ReportingStart } from './'; -import { getGeneralErrorToast, getSharedComponents } from './components'; import { ReportingAPIClient } from './lib/reporting_api_client'; import { ReportingNotifierStreamHandler as StreamHandler } from './lib/stream_handler'; +import { getGeneralErrorToast } from './notifier'; import { ReportingCsvPanelAction } from './panel_actions/get_csv_panel_action'; +import { getSharedComponents } from './shared'; import { ReportingCsvShareProvider } from './share_context_menu/register_csv_reporting'; import { reportingScreenshotShareProvider } from './share_context_menu/register_pdf_png_reporting'; @@ -150,7 +151,7 @@ export class ReportingPublicPlugin params.setBreadcrumbs([{ text: this.breadcrumbText }]); const [[start], { mountManagementSection }] = await Promise.all([ getStartServices(), - import('./mount_management_section'), + import('./management/mount_management_section'), ]); return await mountManagementSection( core, diff --git a/x-pack/plugins/reporting/public/components/__snapshots__/screen_capture_panel_content.test.tsx.snap b/x-pack/plugins/reporting/public/share_context_menu/__snapshots__/screen_capture_panel_content.test.tsx.snap similarity index 100% rename from x-pack/plugins/reporting/public/components/__snapshots__/screen_capture_panel_content.test.tsx.snap rename to x-pack/plugins/reporting/public/share_context_menu/__snapshots__/screen_capture_panel_content.test.tsx.snap diff --git a/x-pack/plugins/reporting/public/components/panel_spinner.tsx b/x-pack/plugins/reporting/public/share_context_menu/panel_spinner.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/panel_spinner.tsx rename to x-pack/plugins/reporting/public/share_context_menu/panel_spinner.tsx diff --git a/x-pack/plugins/reporting/public/share_context_menu/register_csv_reporting.tsx b/x-pack/plugins/reporting/public/share_context_menu/register_csv_reporting.tsx index 7fe5268fc99102..7165fcf6f86814 100644 --- a/x-pack/plugins/reporting/public/share_context_menu/register_csv_reporting.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/register_csv_reporting.tsx @@ -16,9 +16,9 @@ import type { ShareContext } from '../../../../../src/plugins/share/public'; import type { LicensingPluginSetup } from '../../../licensing/public'; import { CSV_JOB_TYPE } from '../../common/constants'; import type { JobParamsCSV } from '../../server/export_types/csv_searchsource/types'; -import { ReportingPanelContent } from '../components/reporting_panel_content_lazy'; import { checkLicense } from '../lib/license_check'; import type { ReportingAPIClient } from '../lib/reporting_api_client'; +import { ReportingPanelContent } from './reporting_panel_content_lazy'; export const ReportingCsvShareProvider = ({ apiClient, diff --git a/x-pack/plugins/reporting/public/share_context_menu/register_pdf_png_reporting.tsx b/x-pack/plugins/reporting/public/share_context_menu/register_pdf_png_reporting.tsx index 42f6ee5fcb898b..eb80f64be55e14 100644 --- a/x-pack/plugins/reporting/public/share_context_menu/register_pdf_png_reporting.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/register_pdf_png_reporting.tsx @@ -16,9 +16,9 @@ import type { LicensingPluginSetup } from '../../../licensing/public'; import type { LayoutParams } from '../../common/types'; import type { JobParamsPNG } from '../../server/export_types/png/types'; import type { JobParamsPDF } from '../../server/export_types/printable_pdf/types'; -import { ScreenCapturePanelContent } from '../components/screen_capture_panel_content_lazy'; import { checkLicense } from '../lib/license_check'; import type { ReportingAPIClient } from '../lib/reporting_api_client'; +import { ScreenCapturePanelContent } from './screen_capture_panel_content_lazy'; interface JobParamsProviderOptions { shareableUrl: string; diff --git a/x-pack/plugins/reporting/public/components/reporting_panel_content.test.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.test.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/reporting_panel_content.test.tsx rename to x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.test.tsx diff --git a/x-pack/plugins/reporting/public/components/reporting_panel_content.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/reporting_panel_content.tsx rename to x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content.tsx diff --git a/x-pack/plugins/reporting/public/components/reporting_panel_content_lazy.tsx b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content_lazy.tsx similarity index 94% rename from x-pack/plugins/reporting/public/components/reporting_panel_content_lazy.tsx rename to x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content_lazy.tsx index 8a937f6d2eb36a..a231d7aa881de2 100644 --- a/x-pack/plugins/reporting/public/components/reporting_panel_content_lazy.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/reporting_panel_content_lazy.tsx @@ -6,7 +6,7 @@ */ import * as React from 'react'; -import { lazy, Suspense, FC } from 'react'; +import { FC, lazy, Suspense } from 'react'; import { PanelSpinner } from './panel_spinner'; import type { Props } from './reporting_panel_content'; diff --git a/x-pack/plugins/reporting/public/components/screen_capture_panel_content.test.tsx b/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.test.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/screen_capture_panel_content.test.tsx rename to x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.test.tsx diff --git a/x-pack/plugins/reporting/public/components/screen_capture_panel_content.tsx b/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.tsx similarity index 100% rename from x-pack/plugins/reporting/public/components/screen_capture_panel_content.tsx rename to x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content.tsx diff --git a/x-pack/plugins/reporting/public/components/screen_capture_panel_content_lazy.tsx b/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content_lazy.tsx similarity index 94% rename from x-pack/plugins/reporting/public/components/screen_capture_panel_content_lazy.tsx rename to x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content_lazy.tsx index 253b4fb88dcd4b..a162dd749ff02b 100644 --- a/x-pack/plugins/reporting/public/components/screen_capture_panel_content_lazy.tsx +++ b/x-pack/plugins/reporting/public/share_context_menu/screen_capture_panel_content_lazy.tsx @@ -6,7 +6,7 @@ */ import * as React from 'react'; -import { lazy, Suspense, FC } from 'react'; +import { FC, lazy, Suspense } from 'react'; import { PanelSpinner } from './panel_spinner'; import type { Props } from './screen_capture_panel_content'; diff --git a/x-pack/plugins/reporting/public/components/shared/get_shared_components.tsx b/x-pack/plugins/reporting/public/shared/get_shared_components.tsx similarity index 79% rename from x-pack/plugins/reporting/public/components/shared/get_shared_components.tsx rename to x-pack/plugins/reporting/public/shared/get_shared_components.tsx index 12d70c87019754..87ddf0cfdb389b 100644 --- a/x-pack/plugins/reporting/public/components/shared/get_shared_components.tsx +++ b/x-pack/plugins/reporting/public/shared/get_shared_components.tsx @@ -7,10 +7,10 @@ import { CoreSetup } from 'kibana/public'; import React from 'react'; -import { ReportingAPIClient } from '../..'; -import { PDF_REPORT_TYPE } from '../../../common/constants'; -import type { Props as PanelPropsScreenCapture } from '../screen_capture_panel_content'; -import { ScreenCapturePanelContent } from '../screen_capture_panel_content_lazy'; +import { ReportingAPIClient } from '../'; +import { PDF_REPORT_TYPE } from '../../common/constants'; +import type { Props as PanelPropsScreenCapture } from '../share_context_menu/screen_capture_panel_content'; +import { ScreenCapturePanelContent } from '../share_context_menu/screen_capture_panel_content_lazy'; interface IncludeOnCloseFn { onClose: () => void; diff --git a/x-pack/plugins/reporting/public/components/shared/index.tsx b/x-pack/plugins/reporting/public/shared/index.ts similarity index 100% rename from x-pack/plugins/reporting/public/components/shared/index.tsx rename to x-pack/plugins/reporting/public/shared/index.ts From 633649460a59931eeb3f459da5e3eb334afdc83d Mon Sep 17 00:00:00 2001 From: Constance Date: Mon, 28 Jun 2021 17:25:24 -0700 Subject: [PATCH 061/227] [Enterprise Search] Improve flash messages screen reader UX (#103412) * Remove role region on flash messages - just `aria-live` is enough for screen readers to read it out, and `role` was causing "Flash messages" to get read out loud repeatedly between page navigation even when empty which was annoying and not good * Further a11y attribute recommendations from @myasonik --- .../shared/flash_messages/flash_messages.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx index ba42b89d6ab56c..a96a179bd58c00 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/flash_messages.tsx @@ -10,7 +10,6 @@ import React, { Fragment } from 'react'; import { useValues, useActions } from 'kea'; import { EuiCallOut, EuiSpacer, EuiGlobalToastList } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { FLASH_MESSAGE_TYPES, DEFAULT_TOAST_TIMEOUT } from './constants'; import { FlashMessagesLogic } from './flash_messages_logic'; @@ -19,14 +18,7 @@ export const FlashMessages: React.FC = ({ children }) => { const { messages } = useValues(FlashMessagesLogic); return ( -
+
{messages.map(({ type, message, description }, index) => ( Date: Mon, 28 Jun 2021 20:35:27 -0400 Subject: [PATCH 062/227] [Alerting] Enable rule import/export and allow rule types to exclude themselves from export (#102999) * Removing feature flag changes * Adding isExportable flag to rule type definition * Adding isExportable flag to rule type definition * Adding isExportable flag to rule type definition * Filtering rule on export by rule type isExportable flag * Fixing types * Adding docs * Fix condition when exportCount is 0 * Unit test for fix condition when exportCount is 0 Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/api/alerting/legacy/list.asciidoc | 4 + docs/api/alerting/list_rule_types.asciidoc | 4 + .../alerting/create-and-manage-rules.asciidoc | 19 ++ .../server/saved_objects/routes/utils.test.ts | 16 ++ src/core/server/saved_objects/routes/utils.ts | 2 +- .../server/alert_types/always_firing.ts | 1 + .../server/alert_types/astros.ts | 1 + x-pack/plugins/alerting/README.md | 2 + x-pack/plugins/alerting/common/alert_type.ts | 1 + .../plugins/alerting/public/alert_api.test.ts | 3 + .../alert_navigation_registry.test.ts | 1 + .../server/alert_type_registry.test.ts | 16 ++ .../alerting/server/alert_type_registry.ts | 3 + .../alerts_client/tests/aggregate.test.ts | 2 + .../server/alerts_client/tests/create.test.ts | 1 + .../server/alerts_client/tests/find.test.ts | 2 + .../server/alerts_client/tests/lib.ts | 1 + .../tests/list_alert_types.test.ts | 5 + .../server/alerts_client/tests/update.test.ts | 3 + .../alerts_client_conflict_retries.test.ts | 2 + .../alerting_authorization.test.ts | 18 ++ .../alerting_authorization_kuery.test.ts | 10 + x-pack/plugins/alerting/server/config.test.ts | 1 - x-pack/plugins/alerting/server/config.ts | 1 - .../alerting/server/health/get_state.test.ts | 8 - .../alerting/server/lib/license_state.test.ts | 2 + x-pack/plugins/alerting/server/plugin.test.ts | 72 +----- x-pack/plugins/alerting/server/plugin.ts | 9 +- .../routes/legacy/list_alert_types.test.ts | 4 + .../alerting/server/routes/rule_types.test.ts | 5 + .../alerting/server/routes/rule_types.ts | 2 + .../alerting/server/saved_objects/index.ts | 111 +++++----- .../saved_objects/is_rule_exportable.test.ts | 208 ++++++++++++++++++ .../saved_objects/is_rule_exportable.ts | 33 +++ .../create_execution_handler.test.ts | 1 + .../server/task_runner/task_runner.test.ts | 1 + .../task_runner/task_runner_factory.test.ts | 1 + x-pack/plugins/alerting/server/types.ts | 1 + x-pack/plugins/apm/common/alert_types.ts | 5 + .../alerts/register_error_count_alert_type.ts | 1 + ...egister_transaction_duration_alert_type.ts | 1 + ...transaction_duration_anomaly_alert_type.ts | 1 + ...ister_transaction_error_rate_alert_type.ts | 1 + ...r_inventory_metric_threshold_alert_type.ts | 1 + .../register_log_threshold_alert_type.ts | 1 + .../register_metric_anomaly_alert_type.ts | 1 + .../register_metric_threshold_alert_type.ts | 1 + .../register_anomaly_detection_alert_type.ts | 1 + .../monitoring/server/alerts/base_alert.ts | 1 + .../utils/create_lifecycle_rule_type.test.ts | 1 + .../rules_notification_alert_type.ts | 1 + .../detection_engine/reference_rules/eql.ts | 1 + .../detection_engine/reference_rules/ml.ts | 1 + .../detection_engine/reference_rules/query.ts | 1 + .../reference_rules/threshold.ts | 1 + .../signals/signal_rule_alert_type.ts | 1 + .../server/alert_types/es_query/alert_type.ts | 1 + .../alert_types/geo_containment/alert_type.ts | 1 + .../alert_types/index_threshold/alert_type.ts | 1 + .../server/lib/alerts/duration_anomaly.ts | 1 + .../uptime/server/lib/alerts/status_check.ts | 1 + .../plugins/uptime/server/lib/alerts/tls.ts | 1 + .../uptime/server/lib/alerts/tls_legacy.ts | 1 + .../plugins/alerts/server/alert_types.ts | 13 ++ .../alerts_restricted/server/alert_types.ts | 2 + .../tests/alerting/rule_types.ts | 2 + .../spaces_only/tests/alerting/rule_types.ts | 2 + .../fixtures/plugins/alerts/server/plugin.ts | 3 + 68 files changed, 489 insertions(+), 139 deletions(-) create mode 100644 x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts create mode 100644 x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.ts diff --git a/docs/api/alerting/legacy/list.asciidoc b/docs/api/alerting/legacy/list.asciidoc index be37be36cd0e89..07307797c4223c 100644 --- a/docs/api/alerting/legacy/list.asciidoc +++ b/docs/api/alerting/legacy/list.asciidoc @@ -80,6 +80,7 @@ The API returns the following: }, "producer":"stackAlerts", "minimumLicenseRequired":"basic", + "isExportable":true, "enabledInLicense":true, "authorizedConsumers":{ "alerts":{ @@ -113,6 +114,9 @@ Each alert type contains the following properties: | `minimumLicenseRequired` | The license required to use the alert type. +| `isExportable` +| Whether the rule type is exportable through the Saved Objects Management UI. + | `enabledInLicense` | Whether the alert type is enabled or disabled based on the license. diff --git a/docs/api/alerting/list_rule_types.asciidoc b/docs/api/alerting/list_rule_types.asciidoc index 31c8416e750593..21ace9f3105c04 100644 --- a/docs/api/alerting/list_rule_types.asciidoc +++ b/docs/api/alerting/list_rule_types.asciidoc @@ -82,6 +82,7 @@ The API returns the following: }, "producer":"stackAlerts", "minimum_license_required":"basic", + "is_exportable":true, "enabled_in_license":true, "authorized_consumers":{ "alerts":{ @@ -115,6 +116,9 @@ Each rule type contains the following properties: | `minimum_license_required` | The license required to use the rule type. +| `is_exportable` +| Whether the rule type is exportable through the Saved Objects Management UI. + | `enabled_in_license` | Whether the rule type is enabled or disabled based on the license. diff --git a/docs/user/alerting/create-and-manage-rules.asciidoc b/docs/user/alerting/create-and-manage-rules.asciidoc index af6714aef662ff..cc91ebcd99be2d 100644 --- a/docs/user/alerting/create-and-manage-rules.asciidoc +++ b/docs/user/alerting/create-and-manage-rules.asciidoc @@ -152,6 +152,25 @@ You can perform these operations in bulk by multi-selecting rules, and then clic [role="screenshot"] image:images/bulk-mute-disable.png[The Manage rules button lets you mute/unmute, enable/disable, and delete in bulk,width=75%] +[float] +[[importing-and-exporting-rules]] +=== Import and export rules + +To import and export rules, use the <>. + +[NOTE] +============================================== +Some rule types cannot be exported through this interface: + +**Security rules** can be imported and exported using the {security-guide}/rules-ui-management.html#import-export-rules-ui[Security UI]. + +**Stack monitoring rules** are <> for you and therefore cannot be managed via the Saved Objects Management UI. +============================================== + +Rules are disabled on export. You are prompted to re-enable rule on successful import. +[role="screenshot"] +image::images/rules-imported-banner.png[Rules import banner, width=50%] + [float] [[rule-details]] === Drilldown to rule details diff --git a/src/core/server/saved_objects/routes/utils.test.ts b/src/core/server/saved_objects/routes/utils.test.ts index 623d2dcc71faca..2127352e4c60e2 100644 --- a/src/core/server/saved_objects/routes/utils.test.ts +++ b/src/core/server/saved_objects/routes/utils.test.ts @@ -101,6 +101,22 @@ describe('createSavedObjectsStreamFromNdJson', () => { }, ]); }); + + it('handles an ndjson stream that only contains excluded saved objects', async () => { + const savedObjectsStream = await createSavedObjectsStreamFromNdJson( + new Readable({ + read() { + this.push( + '{"excludedObjects":[{"id":"foo","reason":"excluded","type":"foo-type"}],"excludedObjectsCount":1,"exportedCount":0,"missingRefCount":0,"missingReferences":[]}\n' + ); + this.push(null); + }, + }) + ); + + const result = await readStreamToCompletion(savedObjectsStream); + expect(result).toEqual([]); + }); }); describe('validateTypes', () => { diff --git a/src/core/server/saved_objects/routes/utils.ts b/src/core/server/saved_objects/routes/utils.ts index e933badfe80feb..47996847a83877 100644 --- a/src/core/server/saved_objects/routes/utils.ts +++ b/src/core/server/saved_objects/routes/utils.ts @@ -32,7 +32,7 @@ export async function createSavedObjectsStreamFromNdJson(ndJsonStream: Readable) } }), createFilterStream( - (obj) => !!obj && !(obj as SavedObjectsExportResultDetails).exportedCount + (obj) => !!obj && (obj as SavedObjectsExportResultDetails).exportedCount === undefined ), createConcatStream([]), ]); diff --git a/x-pack/examples/alerting_example/server/alert_types/always_firing.ts b/x-pack/examples/alerting_example/server/alert_types/always_firing.ts index 6e9ec0d367c9a5..f056c292b018f3 100644 --- a/x-pack/examples/alerting_example/server/alert_types/always_firing.ts +++ b/x-pack/examples/alerting_example/server/alert_types/always_firing.ts @@ -53,6 +53,7 @@ export const alertType: AlertType< ], defaultActionGroupId: DEFAULT_ACTION_GROUP, minimumLicenseRequired: 'basic', + isExportable: true, async executor({ services, params: { instances = DEFAULT_INSTANCES_TO_GENERATE, thresholds }, diff --git a/x-pack/examples/alerting_example/server/alert_types/astros.ts b/x-pack/examples/alerting_example/server/alert_types/astros.ts index 45ea6b48bf6f4f..8f9a2935183002 100644 --- a/x-pack/examples/alerting_example/server/alert_types/astros.ts +++ b/x-pack/examples/alerting_example/server/alert_types/astros.ts @@ -51,6 +51,7 @@ export const alertType: AlertType< name: 'People In Space Right Now', actionGroups: [{ id: 'default', name: 'default' }], minimumLicenseRequired: 'basic', + isExportable: true, defaultActionGroupId: 'default', recoveryActionGroup: { id: 'hasLandedBackOnEarth', diff --git a/x-pack/plugins/alerting/README.md b/x-pack/plugins/alerting/README.md index 9d314cc048b705..62d2f2b57b8e87 100644 --- a/x-pack/plugins/alerting/README.md +++ b/x-pack/plugins/alerting/README.md @@ -118,6 +118,7 @@ The following table describes the properties of the `options` object. |executor|This is where the code for the rule type lives. This is a function to be called when executing a rule on an interval basis. For full details, see the executor section below.|Function| |producer|The id of the application producing this rule type.|string| |minimumLicenseRequired|The value of a minimum license. Most of the rules are licensed as "basic".|string| +|isExportable|Whether the rule type is exportable from the Saved Objects Management UI.|boolean| ### Executor @@ -262,6 +263,7 @@ const myRuleType: AlertType< ], }, minimumLicenseRequired: 'basic', + isExportable: true, async executor({ alertId, startedAt, diff --git a/x-pack/plugins/alerting/common/alert_type.ts b/x-pack/plugins/alerting/common/alert_type.ts index e39c6d0a66f6ca..e56034a4c41f8f 100644 --- a/x-pack/plugins/alerting/common/alert_type.ts +++ b/x-pack/plugins/alerting/common/alert_type.ts @@ -20,6 +20,7 @@ export interface AlertType< defaultActionGroupId: ActionGroupIds; producer: string; minimumLicenseRequired: LicenseType; + isExportable: boolean; } export interface ActionGroup { diff --git a/x-pack/plugins/alerting/public/alert_api.test.ts b/x-pack/plugins/alerting/public/alert_api.test.ts index 023ea255e1c42d..dd2f7d167c1c36 100644 --- a/x-pack/plugins/alerting/public/alert_api.test.ts +++ b/x-pack/plugins/alerting/public/alert_api.test.ts @@ -24,6 +24,7 @@ describe('loadAlertTypes', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, producer: 'alerts', }, @@ -49,6 +50,7 @@ describe('loadAlertType', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, producer: 'alerts', }; @@ -71,6 +73,7 @@ describe('loadAlertType', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, producer: 'alerts', }; diff --git a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts index 7eb59963113865..e7e311902d08d7 100644 --- a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts +++ b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.test.ts @@ -20,6 +20,7 @@ const mockAlertType = (id: string): AlertType => ({ defaultActionGroupId: 'default', producer: 'alerts', minimumLicenseRequired: 'basic', + isExportable: true, }); describe('AlertNavigationRegistry', () => { diff --git a/x-pack/plugins/alerting/server/alert_type_registry.test.ts b/x-pack/plugins/alerting/server/alert_type_registry.test.ts index 7f34760c73199c..63e381bc66c0ae 100644 --- a/x-pack/plugins/alerting/server/alert_type_registry.test.ts +++ b/x-pack/plugins/alerting/server/alert_type_registry.test.ts @@ -47,6 +47,7 @@ describe('has()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }); @@ -67,6 +68,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }; @@ -99,6 +101,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }; @@ -129,6 +132,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }; @@ -159,6 +163,7 @@ describe('register()', () => { executor: jest.fn(), producer: 'alerts', minimumLicenseRequired: 'basic', + isExportable: true, }; const registry = new AlertTypeRegistry(alertTypeRegistryParams); registry.register(alertType); @@ -203,6 +208,7 @@ describe('register()', () => { }, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }; @@ -227,6 +233,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }; @@ -257,6 +264,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }; @@ -279,6 +287,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }); @@ -294,6 +303,7 @@ describe('register()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }) @@ -315,6 +325,7 @@ describe('get()', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, executor: jest.fn(), producer: 'alerts', }); @@ -339,6 +350,7 @@ describe('get()', () => { "defaultActionGroupId": "default", "executor": [MockFunction], "id": "test", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "Test", "producer": "alerts", @@ -377,6 +389,7 @@ describe('list()', () => { }, ], defaultActionGroupId: 'testActionGroup', + isExportable: true, minimumLicenseRequired: 'basic', executor: jest.fn(), producer: 'alerts', @@ -403,6 +416,7 @@ describe('list()', () => { "defaultActionGroupId": "testActionGroup", "enabledInLicense": false, "id": "test", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "Test", "producer": "alerts", @@ -467,6 +481,7 @@ describe('ensureAlertTypeEnabled', () => { defaultActionGroupId: 'default', executor: jest.fn(), producer: 'alerts', + isExportable: true, minimumLicenseRequired: 'basic', recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, }); @@ -497,6 +512,7 @@ function alertTypeWithVariables( name: `${id}-name`, actionGroups: [], defaultActionGroupId: id, + isExportable: true, minimumLicenseRequired: 'basic', async executor() {}, producer: 'alerts', diff --git a/x-pack/plugins/alerting/server/alert_type_registry.ts b/x-pack/plugins/alerting/server/alert_type_registry.ts index 21feb769267914..64fca58c25e66e 100644 --- a/x-pack/plugins/alerting/server/alert_type_registry.ts +++ b/x-pack/plugins/alerting/server/alert_type_registry.ts @@ -46,6 +46,7 @@ export interface RegistryAlertType | 'actionVariables' | 'producer' | 'minimumLicenseRequired' + | 'isExportable' > { id: string; enabledInLicense: boolean; @@ -250,6 +251,7 @@ export class AlertTypeRegistry { actionVariables, producer, minimumLicenseRequired, + isExportable, }, ]: [string, UntypedNormalizedAlertType]) => ({ id, @@ -260,6 +262,7 @@ export class AlertTypeRegistry { actionVariables, producer, minimumLicenseRequired, + isExportable, enabledInLicense: !!this.licenseState.getLicenseCheckForAlertType( id, name, diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/aggregate.test.ts b/x-pack/plugins/alerting/server/alerts_client/tests/aggregate.test.ts index bf966d38f6bc6c..611ff23e462565 100644 --- a/x-pack/plugins/alerting/server/alerts_client/tests/aggregate.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/tests/aggregate.test.ts @@ -58,6 +58,7 @@ describe('aggregate()', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myType', name: 'myType', @@ -110,6 +111,7 @@ describe('aggregate()', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, producer: 'alerts', authorizedConsumers: { diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/create.test.ts b/x-pack/plugins/alerting/server/alerts_client/tests/create.test.ts index 793357215d382c..e231d1e3c27a29 100644 --- a/x-pack/plugins/alerting/server/alerts_client/tests/create.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/tests/create.test.ts @@ -1293,6 +1293,7 @@ describe('create()', () => { }), }, minimumLicenseRequired: 'basic', + isExportable: true, async executor() {}, producer: 'alerts', }); diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/find.test.ts b/x-pack/plugins/alerting/server/alerts_client/tests/find.test.ts index fe788cd43bc2b1..5ec39681a758bb 100644 --- a/x-pack/plugins/alerting/server/alerts_client/tests/find.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/tests/find.test.ts @@ -67,6 +67,7 @@ describe('find()', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, id: 'myType', name: 'myType', producer: 'myApp', @@ -126,6 +127,7 @@ describe('find()', () => { recoveryActionGroup: RecoveredActionGroup, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, producer: 'alerts', authorizedConsumers: { myApp: { read: true, all: true }, diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/lib.ts b/x-pack/plugins/alerting/server/alerts_client/tests/lib.ts index e4cd24ca7e49a6..e0f4f9f6da0f1e 100644 --- a/x-pack/plugins/alerting/server/alerts_client/tests/lib.ts +++ b/x-pack/plugins/alerting/server/alerts_client/tests/lib.ts @@ -88,6 +88,7 @@ export function getBeforeSetup( recoveryActionGroup: RecoveredActionGroup, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor() {}, producer: 'alerts', })); diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/list_alert_types.test.ts b/x-pack/plugins/alerting/server/alerts_client/tests/list_alert_types.test.ts index 9fe33996b9edf5..0f849423409d8f 100644 --- a/x-pack/plugins/alerting/server/alerts_client/tests/list_alert_types.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/tests/list_alert_types.test.ts @@ -58,6 +58,7 @@ describe('listAlertTypes', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'alertingAlertType', name: 'alertingAlertType', @@ -69,6 +70,7 @@ describe('listAlertTypes', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -110,6 +112,7 @@ describe('listAlertTypes', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myType', name: 'myType', @@ -122,6 +125,7 @@ describe('listAlertTypes', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, producer: 'alerts', enabledInLicense: true, @@ -139,6 +143,7 @@ describe('listAlertTypes', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, producer: 'alerts', authorizedConsumers: { diff --git a/x-pack/plugins/alerting/server/alerts_client/tests/update.test.ts b/x-pack/plugins/alerting/server/alerts_client/tests/update.test.ts index 350c9ed31298f0..2de56d20702f45 100644 --- a/x-pack/plugins/alerting/server/alerts_client/tests/update.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/tests/update.test.ts @@ -127,6 +127,7 @@ describe('update()', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, async executor() {}, producer: 'alerts', @@ -773,6 +774,7 @@ describe('update()', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, validate: { params: schema.object({ @@ -1096,6 +1098,7 @@ describe('update()', () => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, async executor() {}, producer: 'alerts', diff --git a/x-pack/plugins/alerting/server/alerts_client_conflict_retries.test.ts b/x-pack/plugins/alerting/server/alerts_client_conflict_retries.test.ts index 98ad427d0c37b9..e45b3513eef26c 100644 --- a/x-pack/plugins/alerting/server/alerts_client_conflict_retries.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client_conflict_retries.test.ts @@ -335,6 +335,7 @@ beforeEach(() => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, async executor() {}, producer: 'alerts', @@ -346,6 +347,7 @@ beforeEach(() => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, async executor() {}, producer: 'alerts', diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts index 2227e0cecd0a68..c07148f03c6849 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts @@ -203,6 +203,7 @@ beforeEach(() => { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, async executor() {}, producer: 'myApp', @@ -892,6 +893,7 @@ describe('AlertingAuthorization', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myOtherAppAlertType', name: 'myOtherAppAlertType', @@ -903,6 +905,7 @@ describe('AlertingAuthorization', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -914,6 +917,7 @@ describe('AlertingAuthorization', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'mySecondAppAlertType', name: 'mySecondAppAlertType', @@ -1242,6 +1246,7 @@ describe('AlertingAuthorization', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myOtherAppAlertType', name: 'myOtherAppAlertType', @@ -1253,6 +1258,7 @@ describe('AlertingAuthorization', () => { actionVariables: undefined, defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -1300,6 +1306,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myAppAlertType", "producer": "myApp", @@ -1328,6 +1335,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myOtherAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myOtherAppAlertType", "producer": "myOtherApp", @@ -1387,6 +1395,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myAppAlertType", "producer": "myApp", @@ -1423,6 +1432,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myOtherAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myOtherAppAlertType", "producer": "myOtherApp", @@ -1502,6 +1512,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myOtherAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myOtherAppAlertType", "producer": "myOtherApp", @@ -1526,6 +1537,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myAppAlertType", "producer": "myApp", @@ -1605,6 +1617,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myOtherAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myOtherAppAlertType", "producer": "myOtherApp", @@ -1633,6 +1646,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myAppAlertType", "producer": "myApp", @@ -1703,6 +1717,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myAppAlertType", "producer": "myApp", @@ -1807,6 +1822,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myOtherAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myOtherAppAlertType", "producer": "myOtherApp", @@ -1831,6 +1847,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myAppAlertType", "producer": "myApp", @@ -1914,6 +1931,7 @@ describe('AlertingAuthorization', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "myOtherAppAlertType", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "myOtherAppAlertType", "producer": "myOtherApp", diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization_kuery.test.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization_kuery.test.ts index 8a558b6427383a..7d39380f7bd1a4 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization_kuery.test.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization_kuery.test.ts @@ -26,6 +26,7 @@ describe('asKqlFiltersByRuleTypeAndConsumer', () => { name: 'myAppAlertType', producer: 'myApp', minimumLicenseRequired: 'basic', + isExportable: true, authorizedConsumers: { myApp: { read: true, all: true }, }, @@ -53,6 +54,7 @@ describe('asKqlFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -88,6 +90,7 @@ describe('asKqlFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -104,6 +107,7 @@ describe('asKqlFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myOtherAppAlertType', name: 'myOtherAppAlertType', @@ -120,6 +124,7 @@ describe('asKqlFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'mySecondAppAlertType', name: 'mySecondAppAlertType', @@ -162,6 +167,7 @@ describe('asEsDslFiltersByRuleTypeAndConsumer', () => { name: 'myAppAlertType', producer: 'myApp', minimumLicenseRequired: 'basic', + isExportable: true, authorizedConsumers: { myApp: { read: true, all: true }, }, @@ -216,6 +222,7 @@ describe('asEsDslFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -283,6 +290,7 @@ describe('asEsDslFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myAppAlertType', name: 'myAppAlertType', @@ -299,6 +307,7 @@ describe('asEsDslFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'myOtherAppAlertType', name: 'myOtherAppAlertType', @@ -315,6 +324,7 @@ describe('asEsDslFiltersByRuleTypeAndConsumer', () => { actionGroups: [], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, id: 'mySecondAppAlertType', name: 'mySecondAppAlertType', diff --git a/x-pack/plugins/alerting/server/config.test.ts b/x-pack/plugins/alerting/server/config.test.ts index a8befe5210752e..f7280e05b78f31 100644 --- a/x-pack/plugins/alerting/server/config.test.ts +++ b/x-pack/plugins/alerting/server/config.test.ts @@ -12,7 +12,6 @@ describe('config validation', () => { const config: Record = {}; expect(configSchema.validate(config)).toMatchInlineSnapshot(` Object { - "enableImportExport": false, "healthCheck": Object { "interval": "60m", }, diff --git a/x-pack/plugins/alerting/server/config.ts b/x-pack/plugins/alerting/server/config.ts index d50917fd135785..e42955b385bf1e 100644 --- a/x-pack/plugins/alerting/server/config.ts +++ b/x-pack/plugins/alerting/server/config.ts @@ -16,7 +16,6 @@ export const configSchema = schema.object({ interval: schema.string({ validate: validateDurationSchema, defaultValue: '5m' }), removalDelay: schema.string({ validate: validateDurationSchema, defaultValue: '1h' }), }), - enableImportExport: schema.boolean({ defaultValue: false }), }); export type AlertsConfig = TypeOf; diff --git a/x-pack/plugins/alerting/server/health/get_state.test.ts b/x-pack/plugins/alerting/server/health/get_state.test.ts index 2dddf81e3b7667..24f3c101b26b6e 100644 --- a/x-pack/plugins/alerting/server/health/get_state.test.ts +++ b/x-pack/plugins/alerting/server/health/get_state.test.ts @@ -71,7 +71,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }), pollInterval ).subscribe(); @@ -105,7 +104,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }), pollInterval, retryDelay @@ -150,7 +148,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }) ).toPromise(); @@ -181,7 +178,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }) ).toPromise(); @@ -212,7 +208,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }) ).toPromise(); @@ -240,7 +235,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }), retryDelay ).subscribe((status) => { @@ -271,7 +265,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }), retryDelay ).subscribe((status) => { @@ -308,7 +301,6 @@ describe('getHealthServiceStatusWithRetryAndErrorHandling', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }) ).toPromise(); diff --git a/x-pack/plugins/alerting/server/lib/license_state.test.ts b/x-pack/plugins/alerting/server/lib/license_state.test.ts index a1c326656f735a..e04ce85b353744 100644 --- a/x-pack/plugins/alerting/server/lib/license_state.test.ts +++ b/x-pack/plugins/alerting/server/lib/license_state.test.ts @@ -70,6 +70,7 @@ describe('getLicenseCheckForAlertType', () => { executor: jest.fn(), producer: 'alerts', minimumLicenseRequired: 'gold', + isExportable: true, recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, }; @@ -204,6 +205,7 @@ describe('ensureLicenseForAlertType()', () => { executor: jest.fn(), producer: 'alerts', minimumLicenseRequired: 'gold', + isExportable: true, recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, }; diff --git a/x-pack/plugins/alerting/server/plugin.test.ts b/x-pack/plugins/alerting/server/plugin.test.ts index 4e9249944a6bf9..9adc3cc9d65692 100644 --- a/x-pack/plugins/alerting/server/plugin.test.ts +++ b/x-pack/plugins/alerting/server/plugin.test.ts @@ -18,7 +18,6 @@ import { AlertsConfig } from './config'; import { AlertType } from './types'; import { eventLogMock } from '../../event_log/server/mocks'; import { actionsMock } from '../../actions/server/mocks'; -import mappings from './saved_objects/mappings.json'; describe('Alerting Plugin', () => { describe('setup()', () => { @@ -37,7 +36,6 @@ describe('Alerting Plugin', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }); plugin = new AlertingPlugin(context); @@ -61,78 +59,13 @@ describe('Alerting Plugin', () => { ); }); - it('should register saved object with no management capability if enableImportExport is false', async () => { - const context = coreMock.createPluginInitializerContext({ - healthCheck: { - interval: '5m', - }, - invalidateApiKeysTask: { - interval: '5m', - removalDelay: '1h', - }, - enableImportExport: false, - }); - plugin = new AlertingPlugin(context); - - const setupMocks = coreMock.createSetup(); - await plugin.setup(setupMocks, { - licensing: licensingMock.createSetup(), - encryptedSavedObjects: encryptedSavedObjectsMock.createSetup(), - taskManager: taskManagerMock.createSetup(), - eventLog: eventLogServiceMock.create(), - actions: actionsMock.createSetup(), - statusService: statusServiceMock.createSetupContract(), - }); - - expect(setupMocks.savedObjects.registerType).toHaveBeenCalledTimes(2); - const registerAlertingSavedObject = setupMocks.savedObjects.registerType.mock.calls[0][0]; - expect(registerAlertingSavedObject.name).toEqual('alert'); - expect(registerAlertingSavedObject.hidden).toBe(true); - expect(registerAlertingSavedObject.mappings).toEqual(mappings.alert); - expect(registerAlertingSavedObject.management).toBeUndefined(); - }); - - it('should register saved object with import/export capability if enableImportExport is true', async () => { - const context = coreMock.createPluginInitializerContext({ - healthCheck: { - interval: '5m', - }, - invalidateApiKeysTask: { - interval: '5m', - removalDelay: '1h', - }, - enableImportExport: true, - }); - plugin = new AlertingPlugin(context); - - const setupMocks = coreMock.createSetup(); - await plugin.setup(setupMocks, { - licensing: licensingMock.createSetup(), - encryptedSavedObjects: encryptedSavedObjectsMock.createSetup(), - taskManager: taskManagerMock.createSetup(), - eventLog: eventLogServiceMock.create(), - actions: actionsMock.createSetup(), - statusService: statusServiceMock.createSetupContract(), - }); - - expect(setupMocks.savedObjects.registerType).toHaveBeenCalledTimes(2); - const registerAlertingSavedObject = setupMocks.savedObjects.registerType.mock.calls[0][0]; - expect(registerAlertingSavedObject.name).toEqual('alert'); - expect(registerAlertingSavedObject.hidden).toBe(true); - expect(registerAlertingSavedObject.mappings).toEqual(mappings.alert); - expect(registerAlertingSavedObject.management).not.toBeUndefined(); - expect(registerAlertingSavedObject.management?.importableAndExportable).toBe(true); - expect(registerAlertingSavedObject.management?.getTitle).not.toBeUndefined(); - expect(registerAlertingSavedObject.management?.onImport).not.toBeUndefined(); - expect(registerAlertingSavedObject.management?.onExport).not.toBeUndefined(); - }); - describe('registerType()', () => { let setup: PluginSetupContract; const sampleAlertType: AlertType = { id: 'test', name: 'test', minimumLicenseRequired: 'basic', + isExportable: true, actionGroups: [], defaultActionGroupId: 'default', producer: 'test', @@ -189,7 +122,6 @@ describe('Alerting Plugin', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }); const plugin = new AlertingPlugin(context); @@ -229,7 +161,6 @@ describe('Alerting Plugin', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }); const plugin = new AlertingPlugin(context); @@ -283,7 +214,6 @@ describe('Alerting Plugin', () => { interval: '5m', removalDelay: '1h', }, - enableImportExport: false, }); const plugin = new AlertingPlugin(context); diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index 5afa1b235a8c1e..df63625bf242d2 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -192,8 +192,6 @@ export class AlertingPlugin { event: { provider: EVENT_LOG_PROVIDER }, }); - setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects, this.config); - this.eventLogService = plugins.eventLog; plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS)); @@ -221,6 +219,13 @@ export class AlertingPlugin { }); } + setupSavedObjects( + core.savedObjects, + plugins.encryptedSavedObjects, + this.alertTypeRegistry, + this.logger + ); + initializeApiKeyInvalidator( this.logger, core.getStartServices(), diff --git a/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.test.ts b/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.test.ts index 3e6f2f484a6d87..e2bf1afdb0f6ee 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.test.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/list_alert_types.test.ts @@ -47,6 +47,7 @@ describe('listAlertTypesRoute', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, authorizedConsumers: {}, actionVariables: { @@ -79,6 +80,7 @@ describe('listAlertTypesRoute', () => { "defaultActionGroupId": "default", "enabledInLicense": true, "id": "1", + "isExportable": true, "minimumLicenseRequired": "basic", "name": "name", "producer": "test", @@ -120,6 +122,7 @@ describe('listAlertTypesRoute', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, authorizedConsumers: {}, actionVariables: { @@ -172,6 +175,7 @@ describe('listAlertTypesRoute', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, authorizedConsumers: {}, actionVariables: { diff --git a/x-pack/plugins/alerting/server/routes/rule_types.test.ts b/x-pack/plugins/alerting/server/routes/rule_types.test.ts index 58c9a4b4c46fd0..4f04f8c7575c5d 100644 --- a/x-pack/plugins/alerting/server/routes/rule_types.test.ts +++ b/x-pack/plugins/alerting/server/routes/rule_types.test.ts @@ -48,6 +48,7 @@ describe('ruleTypesRoute', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, authorizedConsumers: {}, actionVariables: { @@ -70,6 +71,7 @@ describe('ruleTypesRoute', () => { ], default_action_group_id: 'default', minimum_license_required: 'basic', + is_exportable: true, recovery_action_group: RecoveredActionGroup, authorized_consumers: {}, action_variables: { @@ -102,6 +104,7 @@ describe('ruleTypesRoute', () => { "default_action_group_id": "default", "enabled_in_license": true, "id": "1", + "is_exportable": true, "minimum_license_required": "basic", "name": "name", "producer": "test", @@ -143,6 +146,7 @@ describe('ruleTypesRoute', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, authorizedConsumers: {}, actionVariables: { @@ -195,6 +199,7 @@ describe('ruleTypesRoute', () => { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, authorizedConsumers: {}, actionVariables: { diff --git a/x-pack/plugins/alerting/server/routes/rule_types.ts b/x-pack/plugins/alerting/server/routes/rule_types.ts index a3a44f9b013cd8..f67e07f13feed5 100644 --- a/x-pack/plugins/alerting/server/routes/rule_types.ts +++ b/x-pack/plugins/alerting/server/routes/rule_types.ts @@ -19,6 +19,7 @@ const rewriteBodyRes: RewriteResponseCase = (result actionGroups, defaultActionGroupId, minimumLicenseRequired, + isExportable, actionVariables, authorizedConsumers, ...rest @@ -29,6 +30,7 @@ const rewriteBodyRes: RewriteResponseCase = (result action_groups: actionGroups, default_action_group_id: defaultActionGroupId, minimum_license_required: minimumLicenseRequired, + is_exportable: isExportable, action_variables: actionVariables, authorized_consumers: authorizedConsumers, }) diff --git a/x-pack/plugins/alerting/server/saved_objects/index.ts b/x-pack/plugins/alerting/server/saved_objects/index.ts index 1ad0f972b2ec01..88ee3179ab3d8b 100644 --- a/x-pack/plugins/alerting/server/saved_objects/index.ts +++ b/x-pack/plugins/alerting/server/saved_objects/index.ts @@ -6,6 +6,7 @@ */ import type { + Logger, SavedObject, SavedObjectsExportTransformContext, SavedObjectsServiceSetup, @@ -17,7 +18,9 @@ import { EncryptedSavedObjectsPluginSetup } from '../../../encrypted_saved_objec import { transformRulesForExport } from './transform_rule_for_export'; import { RawAlert } from '../types'; import { getImportWarnings } from './get_import_warnings'; -import { AlertsConfig } from '../config'; +import { isRuleExportable } from './is_rule_exportable'; +import { AlertTypeRegistry } from '../alert_type_registry'; + export { partiallyUpdateAlert } from './partially_update_alert'; export const AlertAttributesExcludedFromAAD = [ @@ -44,65 +47,63 @@ export type AlertAttributesExcludedFromAADType = export function setupSavedObjects( savedObjects: SavedObjectsServiceSetup, encryptedSavedObjects: EncryptedSavedObjectsPluginSetup, - alertingConfig: Promise + ruleTypeRegistry: AlertTypeRegistry, + logger: Logger ) { - alertingConfig.then((config: AlertsConfig) => { - savedObjects.registerType({ - name: 'alert', - hidden: true, - namespaceType: 'single', - migrations: getMigrations(encryptedSavedObjects), - mappings: mappings.alert as SavedObjectsTypeMappingDefinition, - ...(config.enableImportExport - ? { - management: { - importableAndExportable: true, - getTitle(ruleSavedObject: SavedObject) { - return `Rule: [${ruleSavedObject.attributes.name}]`; - }, - onImport(ruleSavedObjects) { - return { - warnings: getImportWarnings(ruleSavedObjects), - }; - }, - onExport( - context: SavedObjectsExportTransformContext, - objects: Array> - ) { - return transformRulesForExport(objects); - }, - }, - } - : {}), - }); + savedObjects.registerType({ + name: 'alert', + hidden: true, + namespaceType: 'single', + migrations: getMigrations(encryptedSavedObjects), + mappings: mappings.alert as SavedObjectsTypeMappingDefinition, + management: { + importableAndExportable: true, + getTitle(ruleSavedObject: SavedObject) { + return `Rule: [${ruleSavedObject.attributes.name}]`; + }, + onImport(ruleSavedObjects) { + return { + warnings: getImportWarnings(ruleSavedObjects), + }; + }, + onExport( + context: SavedObjectsExportTransformContext, + objects: Array> + ) { + return transformRulesForExport(objects); + }, + isExportable(ruleSavedObject: SavedObject) { + return isRuleExportable(ruleSavedObject, ruleTypeRegistry, logger); + }, + }, + }); - savedObjects.registerType({ - name: 'api_key_pending_invalidation', - hidden: true, - namespaceType: 'agnostic', - mappings: { - properties: { - apiKeyId: { - type: 'keyword', - }, - createdAt: { - type: 'date', - }, + savedObjects.registerType({ + name: 'api_key_pending_invalidation', + hidden: true, + namespaceType: 'agnostic', + mappings: { + properties: { + apiKeyId: { + type: 'keyword', + }, + createdAt: { + type: 'date', }, }, - }); + }, + }); - // Encrypted attributes - encryptedSavedObjects.registerType({ - type: 'alert', - attributesToEncrypt: new Set(['apiKey']), - attributesToExcludeFromAAD: new Set(AlertAttributesExcludedFromAAD), - }); + // Encrypted attributes + encryptedSavedObjects.registerType({ + type: 'alert', + attributesToEncrypt: new Set(['apiKey']), + attributesToExcludeFromAAD: new Set(AlertAttributesExcludedFromAAD), + }); - // Encrypted attributes - encryptedSavedObjects.registerType({ - type: 'api_key_pending_invalidation', - attributesToEncrypt: new Set(['apiKeyId']), - }); + // Encrypted attributes + encryptedSavedObjects.registerType({ + type: 'api_key_pending_invalidation', + attributesToEncrypt: new Set(['apiKeyId']), }); } diff --git a/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts b/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts new file mode 100644 index 00000000000000..cc2dfbd3e2d2f2 --- /dev/null +++ b/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.test.ts @@ -0,0 +1,208 @@ +/* + * 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 { MockedLogger, loggerMock } from '@kbn/logging/target/mocks'; +import { TaskRunnerFactory } from '../task_runner'; +import { AlertTypeRegistry, ConstructorOptions } from '../alert_type_registry'; +import { taskManagerMock } from '../../../task_manager/server/mocks'; +import { ILicenseState } from '../lib/license_state'; +import { licenseStateMock } from '../lib/license_state.mock'; +import { licensingMock } from '../../../licensing/server/mocks'; +import { isRuleExportable } from './is_rule_exportable'; + +let ruleTypeRegistryParams: ConstructorOptions; +let logger: MockedLogger; +let mockedLicenseState: jest.Mocked; +const taskManager = taskManagerMock.createSetup(); + +beforeEach(() => { + jest.resetAllMocks(); + mockedLicenseState = licenseStateMock.create(); + logger = loggerMock.create(); + ruleTypeRegistryParams = { + taskManager, + taskRunnerFactory: new TaskRunnerFactory(), + licenseState: mockedLicenseState, + licensing: licensingMock.createSetup(), + }; +}); + +describe('isRuleExportable', () => { + it('should return true if rule type isExportable is true', () => { + const registry = new AlertTypeRegistry(ruleTypeRegistryParams); + registry.register({ + id: 'foo', + name: 'Foo', + actionGroups: [ + { + id: 'default', + name: 'Default', + }, + ], + defaultActionGroupId: 'default', + minimumLicenseRequired: 'basic', + isExportable: true, + executor: jest.fn(), + producer: 'alerts', + }); + expect( + isRuleExportable( + { + id: '1', + type: 'alert', + attributes: { + enabled: true, + name: 'rule-name', + tags: ['tag-1', 'tag-2'], + alertTypeId: 'foo', + consumer: 'alert-consumer', + schedule: { interval: '1m' }, + actions: [], + params: {}, + createdBy: 'me', + updatedBy: 'me', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + apiKey: '4tndskbuhewotw4klrhgjewrt9u', + apiKeyOwner: 'me', + throttle: null, + notifyWhen: 'onActionGroupChange', + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'active', + lastExecutionDate: '2020-08-20T19:23:38Z', + error: null, + }, + scheduledTaskId: '2q5tjbf3q45twer', + }, + references: [], + }, + registry, + logger + ) + ).toEqual(true); + }); + + it('should return false and log warning if rule type isExportable is false', () => { + const registry = new AlertTypeRegistry(ruleTypeRegistryParams); + registry.register({ + id: 'foo', + name: 'Foo', + actionGroups: [ + { + id: 'default', + name: 'Default', + }, + ], + defaultActionGroupId: 'default', + minimumLicenseRequired: 'basic', + isExportable: false, + executor: jest.fn(), + producer: 'alerts', + }); + expect( + isRuleExportable( + { + id: '1', + type: 'alert', + attributes: { + enabled: true, + name: 'rule-name', + tags: ['tag-1', 'tag-2'], + alertTypeId: 'foo', + consumer: 'alert-consumer', + schedule: { interval: '1m' }, + actions: [], + params: {}, + createdBy: 'me', + updatedBy: 'me', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + apiKey: '4tndskbuhewotw4klrhgjewrt9u', + apiKeyOwner: 'me', + throttle: null, + notifyWhen: 'onActionGroupChange', + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'active', + lastExecutionDate: '2020-08-20T19:23:38Z', + error: null, + }, + scheduledTaskId: '2q5tjbf3q45twer', + }, + references: [], + }, + registry, + logger + ) + ).toEqual(false); + expect(logger.warn).toHaveBeenCalledWith( + `Skipping export of rule \"1\" because rule type \"foo\" is not exportable through this interface.` + ); + }); + + it('should return false and log warning if rule type is not registered', () => { + const registry = new AlertTypeRegistry(ruleTypeRegistryParams); + registry.register({ + id: 'foo', + name: 'Foo', + actionGroups: [ + { + id: 'default', + name: 'Default', + }, + ], + defaultActionGroupId: 'default', + minimumLicenseRequired: 'basic', + isExportable: false, + executor: jest.fn(), + producer: 'alerts', + }); + expect( + isRuleExportable( + { + id: '1', + type: 'alert', + attributes: { + enabled: true, + name: 'rule-name', + tags: ['tag-1', 'tag-2'], + alertTypeId: 'bar', + consumer: 'alert-consumer', + schedule: { interval: '1m' }, + actions: [], + params: {}, + createdBy: 'me', + updatedBy: 'me', + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + apiKey: '4tndskbuhewotw4klrhgjewrt9u', + apiKeyOwner: 'me', + throttle: null, + notifyWhen: 'onActionGroupChange', + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'active', + lastExecutionDate: '2020-08-20T19:23:38Z', + error: null, + }, + scheduledTaskId: '2q5tjbf3q45twer', + }, + references: [], + }, + registry, + logger + ) + ).toEqual(false); + expect(logger.warn).toHaveBeenCalledWith( + `Skipping export of rule \"1\" because rule type \"bar\" is not recognized.` + ); + }); +}); diff --git a/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.ts b/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.ts new file mode 100644 index 00000000000000..38290e5f465cc3 --- /dev/null +++ b/x-pack/plugins/alerting/server/saved_objects/is_rule_exportable.ts @@ -0,0 +1,33 @@ +/* + * 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 { Logger, SavedObject } from 'kibana/server'; +import { RawAlert } from '../types'; +import { AlertTypeRegistry } from '../alert_type_registry'; + +export function isRuleExportable( + rule: SavedObject, + ruleTypeRegistry: AlertTypeRegistry, + logger: Logger +): boolean { + const ruleSO = rule as SavedObject; + try { + const ruleType = ruleTypeRegistry.get(ruleSO.attributes.alertTypeId); + if (!ruleType.isExportable) { + logger.warn( + `Skipping export of rule "${ruleSO.id}" because rule type "${ruleSO.attributes.alertTypeId}" is not exportable through this interface.` + ); + } + + return ruleType.isExportable; + } catch (err) { + logger.warn( + `Skipping export of rule "${ruleSO.id}" because rule type "${ruleSO.attributes.alertTypeId}" is not recognized.` + ); + return false; + } +} diff --git a/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts b/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts index 1dcd19119b6fd8..b264428b4d6f2b 100644 --- a/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts @@ -44,6 +44,7 @@ const alertType: NormalizedAlertType< ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: { id: 'recovered', name: 'Recovered', diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 88d1b1b24a4ec9..4f650975f830ee 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -44,6 +44,7 @@ const alertType: jest.Mocked = { actionGroups: [{ id: 'default', name: 'Default' }, RecoveredActionGroup], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: RecoveredActionGroup, executor: jest.fn(), producer: 'alerts', diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts index 343dffa0d5e709..050345f3e617f4 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner_factory.test.ts @@ -26,6 +26,7 @@ const alertType: UntypedNormalizedAlertType = { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: { id: 'recovered', name: 'Recovered', diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index f8846035e6b02d..f21e17adc841d8 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -146,6 +146,7 @@ export interface AlertType< params?: ActionVariable[]; }; minimumLicenseRequired: LicenseType; + isExportable: boolean; } export type UntypedAlertType = AlertType< diff --git a/x-pack/plugins/apm/common/alert_types.ts b/x-pack/plugins/apm/common/alert_types.ts index 12df93d54b2964..ad233c7f6df921 100644 --- a/x-pack/plugins/apm/common/alert_types.ts +++ b/x-pack/plugins/apm/common/alert_types.ts @@ -33,6 +33,7 @@ export const ALERT_TYPES_CONFIG: Record< actionGroups: Array>; defaultActionGroupId: ThresholdMetActionGroupId; minimumLicenseRequired: string; + isExportable: boolean; producer: string; } > = { @@ -44,6 +45,7 @@ export const ALERT_TYPES_CONFIG: Record< defaultActionGroupId: THRESHOLD_MET_GROUP_ID, minimumLicenseRequired: 'basic', producer: 'apm', + isExportable: true, }, [AlertType.TransactionDuration]: { name: i18n.translate('xpack.apm.transactionDurationAlert.name', { @@ -53,6 +55,7 @@ export const ALERT_TYPES_CONFIG: Record< defaultActionGroupId: THRESHOLD_MET_GROUP_ID, minimumLicenseRequired: 'basic', producer: 'apm', + isExportable: true, }, [AlertType.TransactionDurationAnomaly]: { name: i18n.translate('xpack.apm.transactionDurationAnomalyAlert.name', { @@ -62,6 +65,7 @@ export const ALERT_TYPES_CONFIG: Record< defaultActionGroupId: THRESHOLD_MET_GROUP_ID, minimumLicenseRequired: 'basic', producer: 'apm', + isExportable: true, }, [AlertType.TransactionErrorRate]: { name: i18n.translate('xpack.apm.transactionErrorRateAlert.name', { @@ -71,6 +75,7 @@ export const ALERT_TYPES_CONFIG: Record< defaultActionGroupId: THRESHOLD_MET_GROUP_ID, minimumLicenseRequired: 'basic', producer: 'apm', + isExportable: true, }, }; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts index 2a63c53b626cd0..7548d6eba060aa 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts @@ -71,6 +71,7 @@ export function registerErrorCountAlertType({ }, producer: 'apm', minimumLicenseRequired: 'basic', + isExportable: true, executor: async ({ services, params }) => { const config = await config$.pipe(take(1)).toPromise(); const alertParams = params; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts index 24a6376761a7d3..ca7806251f75e5 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts @@ -79,6 +79,7 @@ export function registerTransactionDurationAlertType({ }, producer: 'apm', minimumLicenseRequired: 'basic', + isExportable: true, executor: async ({ services, params }) => { const config = await config$.pipe(take(1)).toPromise(); const alertParams = params; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts index f640925b0a0fa0..de0657d075d7fb 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts @@ -87,6 +87,7 @@ export function registerTransactionDurationAnomalyAlertType({ }, producer: 'apm', minimumLicenseRequired: 'basic', + isExportable: true, executor: async ({ services, params }) => { if (!ml) { return {}; diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts index 47ed5236ce74c5..718ffd9c92167a 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts @@ -77,6 +77,7 @@ export function registerTransactionErrorRateAlertType({ }, producer: 'apm', minimumLicenseRequired: 'basic', + isExportable: true, executor: async ({ services, params: alertParams }) => { const config = await config$.pipe(take(1)).toPromise(); const indices = await getApmIndices({ diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/register_inventory_metric_threshold_alert_type.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/register_inventory_metric_threshold_alert_type.ts index 81204c7b71a688..a2d8e522c7c8d5 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/register_inventory_metric_threshold_alert_type.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/register_inventory_metric_threshold_alert_type.ts @@ -89,6 +89,7 @@ export const registerMetricInventoryThresholdAlertType = ( actionGroups: [FIRED_ACTIONS, WARNING_ACTIONS], producer: 'infrastructure', minimumLicenseRequired: 'basic', + isExportable: true, executor: createInventoryMetricThresholdExecutor(libs), actionVariables: { context: [ diff --git a/x-pack/plugins/infra/server/lib/alerting/log_threshold/register_log_threshold_alert_type.ts b/x-pack/plugins/infra/server/lib/alerting/log_threshold/register_log_threshold_alert_type.ts index b7c6881b20390c..62d92d0487ff74 100644 --- a/x-pack/plugins/infra/server/lib/alerting/log_threshold/register_log_threshold_alert_type.ts +++ b/x-pack/plugins/infra/server/lib/alerting/log_threshold/register_log_threshold_alert_type.ts @@ -107,6 +107,7 @@ export async function registerLogThresholdAlertType( defaultActionGroupId: FIRED_ACTIONS.id, actionGroups: [FIRED_ACTIONS], minimumLicenseRequired: 'basic', + isExportable: true, executor: createLogThresholdExecutor(libs), actionVariables: { context: [ diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/register_metric_anomaly_alert_type.ts b/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/register_metric_anomaly_alert_type.ts index 2adf37c60cf3a9..63354111a1a98c 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/register_metric_anomaly_alert_type.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/register_metric_anomaly_alert_type.ts @@ -64,6 +64,7 @@ export const registerMetricAnomalyAlertType = ( actionGroups: [FIRED_ACTIONS], producer: 'infrastructure', minimumLicenseRequired: 'basic', + isExportable: true, executor: createMetricAnomalyExecutor(libs, ml), actionVariables: { context: [ diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts index 7dbae03f20fbd6..e519d67b446a5d 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/register_metric_threshold_alert_type.ts @@ -100,6 +100,7 @@ export function registerMetricThresholdAlertType(libs: InfraBackendLibs): Metric defaultActionGroupId: FIRED_ACTIONS.id, actionGroups: [FIRED_ACTIONS, WARNING_ACTIONS], minimumLicenseRequired: 'basic', + isExportable: true, executor: createMetricThresholdExecutor(libs), actionVariables: { context: [ diff --git a/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts b/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts index f39b3850b71b14..93c627c0f6311f 100644 --- a/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts +++ b/x-pack/plugins/ml/server/lib/alerts/register_anomaly_detection_alert_type.ts @@ -119,6 +119,7 @@ export function registerAnomalyDetectionAlertType({ }, producer: PLUGIN_ID, minimumLicenseRequired: MINIMUM_FULL_LICENSE, + isExportable: true, async executor({ services, params, alertId, state, previousStartedAt, startedAt }) { const fakeRequest = {} as KibanaRequest; const { execute } = mlSharedServices.alertingServiceProvider( diff --git a/x-pack/plugins/monitoring/server/alerts/base_alert.ts b/x-pack/plugins/monitoring/server/alerts/base_alert.ts index bb80d84210a481..8954a4ae2486d5 100644 --- a/x-pack/plugins/monitoring/server/alerts/base_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/base_alert.ts @@ -96,6 +96,7 @@ export class BaseAlert { ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: false, executor: ( options: AlertExecutorOptions & { state: ExecutedState; diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts index 85e69eb51fd02f..a362dcccc2f0f8 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts @@ -40,6 +40,7 @@ function createRule() { }, id: 'test_type', minimumLicenseRequired: 'basic', + isExportable: true, name: 'Test type', producer: 'test', actionVariables: { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts index a4863e577c6bca..c85848ba6dcfec 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/notifications/rules_notification_alert_type.ts @@ -37,6 +37,7 @@ export const rulesNotificationAlertType = ({ }), }, minimumLicenseRequired: 'basic', + isExportable: false, async executor({ startedAt, previousStartedAt, alertId, services, params }) { const ruleAlertSavedObject = await services.savedObjectsClient.get( 'alert', diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/eql.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/eql.ts index 39d02c808d09e5..b98bd9b3551c37 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/eql.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/eql.ts @@ -45,6 +45,7 @@ export const createEqlAlertType = (ruleDataClient: RuleDataClient, logger: Logge context: [{ name: 'server', description: 'the server' }], }, minimumLicenseRequired: 'basic', + isExportable: false, producer: 'security-solution', async executor({ startedAt, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/ml.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/ml.ts index c07d0436cc90d0..14252bf62ef834 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/ml.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/ml.ts @@ -57,6 +57,7 @@ export const mlAlertType = createSecurityMlRuleType({ context: [{ name: 'server', description: 'the server' }], }, minimumLicenseRequired: 'basic', + isExportable: false, producer: 'security-solution', async executor({ services: { alertWithPersistence, findAlerts }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts index 39f325fd6cf8f1..4ca9448f5e3c73 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts @@ -43,6 +43,7 @@ export const createQueryAlertType = (ruleDataClient: RuleDataClient, logger: Log context: [{ name: 'server', description: 'the server' }], }, minimumLicenseRequired: 'basic', + isExportable: false, producer: 'security-solution', async executor({ services: { alertWithPersistence, findAlerts }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/threshold.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/threshold.ts index d4721e8bab11dc..fa291ef3139cd5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/threshold.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/threshold.ts @@ -113,6 +113,7 @@ export const createThresholdAlertType = (ruleDataClient: RuleDataClient, logger: context: [{ name: 'server', description: 'the server' }], }, minimumLicenseRequired: 'basic', + isExportable: false, producer: 'security-solution', async executor({ startedAt, services, params, alertId }) { const fromDate = moment(startedAt).subtract(moment.duration(5, 'm')); // hardcoded 5-minute rule interval diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts index 32bd6d71bfb1da..ba665fa43e8b84 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -103,6 +103,7 @@ export const signalRulesAlertType = ({ }, producer: SERVER_APP_ID, minimumLicenseRequired: 'basic', + isExportable: false, async executor({ previousStartedAt, startedAt, diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/alert_type.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/alert_type.ts index b81bc19d5c731e..c9f233002d79be 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/alert_type.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/alert_type.ts @@ -140,6 +140,7 @@ export function getAlertType( ], }, minimumLicenseRequired: 'basic', + isExportable: true, executor, producer: STACK_ALERTS_FEATURE_ID, }; diff --git a/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts b/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts index e3d379f2869b91..43ae726fa2478a 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/geo_containment/alert_type.ts @@ -177,5 +177,6 @@ export function getAlertType(logger: Logger): GeoContainmentAlertType { }, actionVariables, minimumLicenseRequired: 'gold', + isExportable: true, }; } diff --git a/x-pack/plugins/stack_alerts/server/alert_types/index_threshold/alert_type.ts b/x-pack/plugins/stack_alerts/server/alert_types/index_threshold/alert_type.ts index a242c1e0eb29e3..aa56951b5dcba0 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/index_threshold/alert_type.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/index_threshold/alert_type.ts @@ -125,6 +125,7 @@ export function getAlertType( ], }, minimumLicenseRequired: 'basic', + isExportable: true, executor, producer: STACK_ALERTS_FEATURE_ID, }; diff --git a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts index b3262976b0cace..981a7e7ca3920d 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/duration_anomaly.ts @@ -89,6 +89,7 @@ export const durationAnomalyAlertFactory: UptimeAlertTypeFactory state: [...durationAnomalyTranslations.actionVariables, ...commonStateTranslations], }, minimumLicenseRequired: 'basic', + isExportable: true, async executor({ options, uptimeEsClient, savedObjectsClient, dynamicSettings }) { const { services: { alertInstanceFactory }, diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts index c5a6ef877c47a4..6f3e3303f6bdcf 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts @@ -258,6 +258,7 @@ export const statusCheckAlertFactory: UptimeAlertTypeFactory = ( state: [...commonMonitorStateI18, ...commonStateTranslations], }, minimumLicenseRequired: 'basic', + isExportable: true, async executor({ options: { params: rawParams, diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls.ts b/x-pack/plugins/uptime/server/lib/alerts/tls.ts index f29744fdbb70f5..09f5e2fe0f6d5f 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/tls.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/tls.ts @@ -112,6 +112,7 @@ export const tlsAlertFactory: UptimeAlertTypeFactory = (_server, state: [...tlsTranslations.actionVariables, ...commonStateTranslations], }, minimumLicenseRequired: 'basic', + isExportable: true, async executor({ options, dynamicSettings, uptimeEsClient }) { const { services: { alertInstanceFactory }, diff --git a/x-pack/plugins/uptime/server/lib/alerts/tls_legacy.ts b/x-pack/plugins/uptime/server/lib/alerts/tls_legacy.ts index 8f1c0093e60ac8..5bf91b7c5486d7 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/tls_legacy.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/tls_legacy.ts @@ -103,6 +103,7 @@ export const tlsLegacyAlertFactory: UptimeAlertTypeFactory = (_s state: [...tlsTranslations.actionVariables, ...commonStateTranslations], }, minimumLicenseRequired: 'basic', + isExportable: true, async executor({ options, dynamicSettings, uptimeEsClient }) { const { services: { alertInstanceFactory }, diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts index 3e622b49d03df7..3c9d783f5a3578 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts @@ -81,6 +81,7 @@ function getAlwaysFiringAlertType() { producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, actionVariables: { state: [{ name: 'instanceStateValue', description: 'the instance state value' }], params: [{ name: 'instanceParamsValue', description: 'the instance params value' }], @@ -167,6 +168,7 @@ function getCumulativeFiringAlertType() { producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor(alertExecutorOptions) { const { services, state } = alertExecutorOptions; const group = 'default'; @@ -212,6 +214,7 @@ function getNeverFiringAlertType() { producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor({ services, params, state }) { await services.scopedClusterClient.asCurrentUser.index({ index: params.index, @@ -252,6 +255,7 @@ function getFailingAlertType() { producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor({ services, params, state }) { await services.scopedClusterClient.asCurrentUser.index({ index: params.index, @@ -290,6 +294,7 @@ function getAuthorizationAlertType(core: CoreSetup) { defaultActionGroupId: 'default', producer: 'alertsFixture', minimumLicenseRequired: 'basic', + isExportable: true, validate: { params: paramsSchema, }, @@ -376,6 +381,7 @@ function getValidationAlertType() { ], producer: 'alertsFixture', minimumLicenseRequired: 'basic', + isExportable: true, defaultActionGroupId: 'default', validate: { params: paramsSchema, @@ -404,6 +410,7 @@ function getPatternFiringAlertType() { producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor(alertExecutorOptions) { const { services, state, params } = alertExecutorOptions; const pattern = params.pattern; @@ -468,6 +475,7 @@ export function defineAlertTypes( producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor() {}, }; const goldNoopAlertType: AlertType<{}, {}, {}, {}, 'default'> = { @@ -477,6 +485,7 @@ export function defineAlertTypes( producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'gold', + isExportable: true, async executor() {}, }; const onlyContextVariablesAlertType: AlertType<{}, {}, {}, {}, 'default'> = { @@ -486,6 +495,7 @@ export function defineAlertTypes( producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, actionVariables: { context: [{ name: 'aContextVariable', description: 'this is a context variable' }], }, @@ -501,6 +511,7 @@ export function defineAlertTypes( state: [{ name: 'aStateVariable', description: 'this is a state variable' }], }, minimumLicenseRequired: 'basic', + isExportable: true, async executor() {}, }; const throwAlertType: AlertType<{}, {}, {}, {}, 'default'> = { @@ -515,6 +526,7 @@ export function defineAlertTypes( producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor() { throw new Error('this alert is intended to fail'); }, @@ -531,6 +543,7 @@ export function defineAlertTypes( producer: 'alertsFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor() { await new Promise((resolve) => setTimeout(resolve, 5000)); }, diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/server/alert_types.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/server/alert_types.ts index 884af7801855f9..2255d1fa95e2de 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/server/alert_types.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts_restricted/server/alert_types.ts @@ -20,6 +20,7 @@ export function defineAlertTypes( producer: 'alertsRestrictedFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, recoveryActionGroup: { id: 'restrictedRecovered', name: 'Restricted Recovery' }, async executor() {}, }; @@ -30,6 +31,7 @@ export function defineAlertTypes( producer: 'alertsRestrictedFixture', defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor() {}, }; alerting.registerType(noopRestrictedAlertType); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/rule_types.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/rule_types.ts index c851aaf2bbc88d..f52f0977a630b0 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/rule_types.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/alerting/rule_types.ts @@ -30,6 +30,7 @@ export default function listAlertTypes({ getService }: FtrProviderContext) { }, producer: 'alertsFixture', minimum_license_required: 'basic', + is_exportable: true, recovery_action_group: { id: 'recovered', name: 'Recovered', @@ -56,6 +57,7 @@ export default function listAlertTypes({ getService }: FtrProviderContext) { }, producer: 'alertsRestrictedFixture', minimum_license_required: 'basic', + is_exportable: true, enabled_in_license: true, }; diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/rule_types.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/rule_types.ts index 3d3cec4c30252f..86a0e269b26d67 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/rule_types.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/rule_types.ts @@ -42,6 +42,7 @@ export default function listAlertTypes({ getService }: FtrProviderContext) { }, producer: 'alertsFixture', minimum_license_required: 'basic', + is_exportable: true, enabled_in_license: true, }); expect(Object.keys(authorizedConsumers)).to.contain('alertsFixture'); @@ -126,6 +127,7 @@ export default function listAlertTypes({ getService }: FtrProviderContext) { }, producer: 'alertsFixture', minimumLicenseRequired: 'basic', + isExportable: true, enabledInLicense: true, }); expect(Object.keys(authorizedConsumers)).to.contain('alertsFixture'); diff --git a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/server/plugin.ts b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/server/plugin.ts index 10a81e43090886..8d0d2c4f0be335 100644 --- a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/server/plugin.ts +++ b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/server/plugin.ts @@ -24,6 +24,7 @@ export const noopAlertType: AlertType<{}, {}, {}, {}, 'default'> = { actionGroups: [{ id: 'default', name: 'Default' }], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', + isExportable: true, async executor() {}, producer: 'alerts', }; @@ -47,6 +48,7 @@ export const alwaysFiringAlertType: AlertType< defaultActionGroupId: 'default', producer: 'alerts', minimumLicenseRequired: 'basic', + isExportable: true, async executor(alertExecutorOptions) { const { services, state, params } = alertExecutorOptions; @@ -76,6 +78,7 @@ export const failingAlertType: AlertType Date: Tue, 29 Jun 2021 04:19:02 +0300 Subject: [PATCH 063/227] [Osquery] Add Saved queries (#100965) --- .../osquery/common/schemas/common/schemas.ts | 19 +- .../create_saved_query_request_schema.ts | 14 +- x-pack/plugins/osquery/kibana.json | 3 +- .../osquery/public/actions/actions_table.tsx | 19 +- .../public/common/hooks/use_breadcrumbs.tsx | 34 +++ .../osquery/public/common/page_paths.ts | 10 +- .../plugins/osquery/public/components/app.tsx | 9 + .../public/components/osquery_schema_link.tsx | 20 ++ .../plugins/osquery/public/editor/index.tsx | 2 +- .../public/editor/osquery_schema/v4.8.0.json | 1 + .../osquery/public/editor/osquery_tables.ts | 2 +- ...managed_policy_create_import_extension.tsx | 3 +- .../public/live_queries/form/index.tsx | 54 +++- .../form/live_query_query_field.tsx | 19 +- .../common/add_new_pack_query_flyout.tsx | 7 +- .../osquery/public/queries/edit/index.tsx | 53 ---- .../osquery/public/queries/form/index.tsx | 72 ------ .../osquery/public/queries/form/schema.ts | 30 --- .../plugins/osquery/public/queries/index.tsx | 36 --- .../osquery/public/queries/new/index.tsx | 32 --- .../osquery/public/queries/queries/index.tsx | 244 ------------------ .../plugins/osquery/public/routes/index.tsx | 4 + .../routes/live_queries/details/index.tsx | 2 +- .../public/routes/saved_queries/edit/form.tsx | 81 ++++++ .../routes/saved_queries/edit/index.tsx | 124 +++++++++ .../public/routes/saved_queries/edit/tabs.tsx | 78 ++++++ .../public/routes/saved_queries/index.tsx | 35 +++ .../routes/saved_queries/list/index.tsx | 217 ++++++++++++++++ .../public/routes/saved_queries/new/form.tsx | 81 ++++++ .../public/routes/saved_queries/new/index.tsx | 62 +++++ .../osquery/public/saved_queries/constants.ts | 8 + .../form/code_editor_field.tsx | 17 +- .../public/saved_queries/form/index.tsx | 74 ++++++ .../form/use_saved_query_form.tsx | 64 +++++ .../osquery/public/saved_queries/index.tsx | 12 + .../saved_queries/saved_queries_dropdown.tsx | 104 ++++++++ .../saved_queries/saved_query_flyout.tsx | 89 +++++++ .../saved_queries/use_create_saved_query.ts | 70 +++++ .../saved_queries/use_delete_saved_query.ts | 46 ++++ .../public/saved_queries/use_saved_queries.ts | 46 ++++ .../public/saved_queries/use_saved_query.ts | 54 ++++ .../use_scheduled_query_group.ts | 38 +++ .../saved_queries/use_update_saved_query.ts | 66 +++++ .../queries/constants.ts | 3 + .../queries/platform_checkbox_group_field.tsx | 11 +- .../queries/query_flyout.tsx | 48 +++- .../scheduled_query_groups/queries/schema.tsx | 10 + .../use_scheduled_query_group_query_form.tsx | 3 + .../scheduled_query_groups_table.tsx | 25 +- x-pack/plugins/osquery/public/types.ts | 4 +- .../scripts/schema_formatter/script.ts | 2 +- x-pack/plugins/osquery/server/config.ts | 2 +- .../lib/osquery_app_context_services.ts | 3 +- .../lib/saved_query/saved_object_mappings.ts | 30 ++- x-pack/plugins/osquery/server/plugin.ts | 1 + .../routes/action/create_action_route.ts | 6 +- .../saved_query/create_saved_query_route.ts | 6 +- .../saved_query/read_saved_query_route.ts | 8 +- .../saved_query/update_saved_query_route.ts | 6 +- x-pack/plugins/osquery/server/types.ts | 2 + .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- 62 files changed, 1678 insertions(+), 551 deletions(-) create mode 100644 x-pack/plugins/osquery/public/components/osquery_schema_link.tsx create mode 100644 x-pack/plugins/osquery/public/editor/osquery_schema/v4.8.0.json delete mode 100644 x-pack/plugins/osquery/public/queries/edit/index.tsx delete mode 100644 x-pack/plugins/osquery/public/queries/form/index.tsx delete mode 100644 x-pack/plugins/osquery/public/queries/form/schema.ts delete mode 100644 x-pack/plugins/osquery/public/queries/index.tsx delete mode 100644 x-pack/plugins/osquery/public/queries/new/index.tsx delete mode 100644 x-pack/plugins/osquery/public/queries/queries/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/edit/form.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/new/form.tsx create mode 100644 x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx create mode 100644 x-pack/plugins/osquery/public/saved_queries/constants.ts rename x-pack/plugins/osquery/public/{queries => saved_queries}/form/code_editor_field.tsx (69%) create mode 100644 x-pack/plugins/osquery/public/saved_queries/form/index.tsx create mode 100644 x-pack/plugins/osquery/public/saved_queries/form/use_saved_query_form.tsx create mode 100644 x-pack/plugins/osquery/public/saved_queries/index.tsx create mode 100644 x-pack/plugins/osquery/public/saved_queries/saved_queries_dropdown.tsx create mode 100644 x-pack/plugins/osquery/public/saved_queries/saved_query_flyout.tsx create mode 100644 x-pack/plugins/osquery/public/saved_queries/use_create_saved_query.ts create mode 100644 x-pack/plugins/osquery/public/saved_queries/use_delete_saved_query.ts create mode 100644 x-pack/plugins/osquery/public/saved_queries/use_saved_queries.ts create mode 100644 x-pack/plugins/osquery/public/saved_queries/use_saved_query.ts create mode 100644 x-pack/plugins/osquery/public/saved_queries/use_scheduled_query_group.ts create mode 100644 x-pack/plugins/osquery/public/saved_queries/use_update_saved_query.ts diff --git a/x-pack/plugins/osquery/common/schemas/common/schemas.ts b/x-pack/plugins/osquery/common/schemas/common/schemas.ts index f5d0a357b85b85..1e52080debb9a9 100644 --- a/x-pack/plugins/osquery/common/schemas/common/schemas.ts +++ b/x-pack/plugins/osquery/common/schemas/common/schemas.ts @@ -7,10 +7,10 @@ import * as t from 'io-ts'; -export const name = t.string; -export type Name = t.TypeOf; -export const nameOrUndefined = t.union([name, t.undefined]); -export type NameOrUndefined = t.TypeOf; +export const id = t.string; +export type Id = t.TypeOf; +export const idOrUndefined = t.union([id, t.undefined]); +export type IdOrUndefined = t.TypeOf; export const agentSelection = t.type({ agents: t.array(t.string), @@ -18,6 +18,7 @@ export const agentSelection = t.type({ platformsSelected: t.array(t.string), policiesSelected: t.array(t.string), }); + export type AgentSelection = t.TypeOf; export const agentSelectionOrUndefined = t.union([agentSelection, t.undefined]); export type AgentSelectionOrUndefined = t.TypeOf; @@ -36,3 +37,13 @@ export const query = t.string; export type Query = t.TypeOf; export const queryOrUndefined = t.union([query, t.undefined]); export type QueryOrUndefined = t.TypeOf; + +export const version = t.string; +export type Version = t.TypeOf; +export const versionOrUndefined = t.union([version, t.undefined]); +export type VersionOrUndefined = t.TypeOf; + +export const interval = t.string; +export type Interval = t.TypeOf; +export const intervalOrUndefined = t.union([interval, t.undefined]); +export type IntervalOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/osquery/common/schemas/routes/saved_query/create_saved_query_request_schema.ts b/x-pack/plugins/osquery/common/schemas/routes/saved_query/create_saved_query_request_schema.ts index 9e901be1476bca..5aa08d9afde4f1 100644 --- a/x-pack/plugins/osquery/common/schemas/routes/saved_query/create_saved_query_request_schema.ts +++ b/x-pack/plugins/osquery/common/schemas/routes/saved_query/create_saved_query_request_schema.ts @@ -7,14 +7,24 @@ import * as t from 'io-ts'; -import { name, description, Description, platform, query } from '../../common/schemas'; +import { + id, + description, + Description, + platform, + query, + version, + interval, +} from '../../common/schemas'; import { RequiredKeepUndefined } from '../../../types'; export const createSavedQueryRequestSchema = t.type({ - name, + id, description, platform, query, + version, + interval, }); export type CreateSavedQueryRequestSchema = t.OutputOf; diff --git a/x-pack/plugins/osquery/kibana.json b/x-pack/plugins/osquery/kibana.json index 86a4d817de40e4..a8f3975430e5e5 100644 --- a/x-pack/plugins/osquery/kibana.json +++ b/x-pack/plugins/osquery/kibana.json @@ -26,7 +26,8 @@ "features", "fleet", "navigation", - "triggersActionsUi" + "triggersActionsUi", + "security" ], "server": true, "ui": true, diff --git a/x-pack/plugins/osquery/public/actions/actions_table.tsx b/x-pack/plugins/osquery/public/actions/actions_table.tsx index 5d1b9b723d98b6..0ee928ad8aa147 100644 --- a/x-pack/plugins/osquery/public/actions/actions_table.tsx +++ b/x-pack/plugins/osquery/public/actions/actions_table.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import { isArray } from 'lodash'; import { i18n } from '@kbn/i18n'; import { EuiBasicTable, EuiButtonIcon, EuiCodeBlock, formatDate } from '@elastic/eui'; import React, { useState, useCallback, useMemo } from 'react'; @@ -54,6 +55,8 @@ const ActionsTableComponent = () => { const renderAgentsColumn = useCallback((_, item) => <>{item.fields.agents?.length ?? 0}, []); + const renderCreatedByColumn = useCallback((userId) => (isArray(userId) ? userId[0] : '-'), []); + const renderTimestampColumn = useCallback( (_, item) => <>{formatDate(item.fields['@timestamp'][0])}, [] @@ -90,6 +93,14 @@ const ActionsTableComponent = () => { width: '200px', render: renderTimestampColumn, }, + { + field: 'fields.user_id', + name: i18n.translate('xpack.osquery.liveQueryActions.table.createdByColumnTitle', { + defaultMessage: 'Run by', + }), + width: '200px', + render: renderCreatedByColumn, + }, { name: i18n.translate('xpack.osquery.liveQueryActions.table.viewDetailsColumnTitle', { defaultMessage: 'View details', @@ -101,7 +112,13 @@ const ActionsTableComponent = () => { ], }, ], - [renderActionsColumn, renderAgentsColumn, renderQueryColumn, renderTimestampColumn] + [ + renderActionsColumn, + renderAgentsColumn, + renderCreatedByColumn, + renderQueryColumn, + renderTimestampColumn, + ] ); const pagination = useMemo( diff --git a/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx b/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx index 660ef87fb57e3e..7b52b330d0148f 100644 --- a/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx +++ b/x-pack/plugins/osquery/public/common/hooks/use_breadcrumbs.tsx @@ -67,6 +67,40 @@ const breadcrumbGetters: { text: liveQueryId, }, ], + saved_queries: () => [ + BASE_BREADCRUMB, + { + text: i18n.translate('xpack.osquery.breadcrumbs.savedQueriesPageTitle', { + defaultMessage: 'Saved queries', + }), + }, + ], + saved_query_new: () => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.saved_queries(), + text: i18n.translate('xpack.osquery.breadcrumbs.savedQueriesPageTitle', { + defaultMessage: 'Saved queries', + }), + }, + { + text: i18n.translate('xpack.osquery.breadcrumbs.newSavedQueryPageTitle', { + defaultMessage: 'New', + }), + }, + ], + saved_query_edit: ({ savedQueryName }) => [ + BASE_BREADCRUMB, + { + href: pagePathGetters.saved_queries(), + text: i18n.translate('xpack.osquery.breadcrumbs.savedQueriesPageTitle', { + defaultMessage: 'Saved queries', + }), + }, + { + text: savedQueryName, + }, + ], scheduled_query_groups: () => [ BASE_BREADCRUMB, { diff --git a/x-pack/plugins/osquery/public/common/page_paths.ts b/x-pack/plugins/osquery/public/common/page_paths.ts index b4c7963fb9a02a..0e0d8310ae8be8 100644 --- a/x-pack/plugins/osquery/public/common/page_paths.ts +++ b/x-pack/plugins/osquery/public/common/page_paths.ts @@ -11,12 +11,15 @@ export type StaticPage = | 'live_queries' | 'live_query_new' | 'scheduled_query_groups' - | 'scheduled_query_group_add'; + | 'scheduled_query_group_add' + | 'saved_queries' + | 'saved_query_new'; export type DynamicPage = | 'live_query_details' | 'scheduled_query_group_details' - | 'scheduled_query_group_edit'; + | 'scheduled_query_group_edit' + | 'saved_query_edit'; export type Page = StaticPage | DynamicPage; @@ -50,6 +53,9 @@ export const pagePathGetters: { live_queries: () => '/live_queries', live_query_new: () => '/live_queries/new', live_query_details: ({ liveQueryId }) => `/live_queries/${liveQueryId}`, + saved_queries: () => '/saved_queries', + saved_query_new: () => '/saved_queries/new', + saved_query_edit: ({ savedQueryId }) => `/saved_queries/${savedQueryId}`, scheduled_query_groups: () => '/scheduled_query_groups', scheduled_query_group_add: () => '/scheduled_query_groups/add', scheduled_query_group_details: ({ scheduledQueryGroupId }) => diff --git a/x-pack/plugins/osquery/public/components/app.tsx b/x-pack/plugins/osquery/public/components/app.tsx index d56aacc99ad53b..df61b116a5647d 100644 --- a/x-pack/plugins/osquery/public/components/app.tsx +++ b/x-pack/plugins/osquery/public/components/app.tsx @@ -50,6 +50,15 @@ const OsqueryAppComponent = () => { defaultMessage="Scheduled query groups" /> + + + diff --git a/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx b/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx new file mode 100644 index 00000000000000..d1f346bad33501 --- /dev/null +++ b/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx @@ -0,0 +1,20 @@ +/* + * 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 { EuiText, EuiLink } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React from 'react'; + +export const OsquerySchemaLink = React.memo(() => ( + + + + + +)); + +OsquerySchemaLink.displayName = 'OsquerySchemaLink'; diff --git a/x-pack/plugins/osquery/public/editor/index.tsx b/x-pack/plugins/osquery/public/editor/index.tsx index 70da55ca3f007b..5be2b1816ad86f 100644 --- a/x-pack/plugins/osquery/public/editor/index.tsx +++ b/x-pack/plugins/osquery/public/editor/index.tsx @@ -40,7 +40,7 @@ const OsqueryEditorComponent: React.FC = ({ name="osquery_editor" setOptions={EDITOR_SET_OPTIONS} editorProps={EDITOR_PROPS} - height="200px" + height="150px" width="100%" /> ); diff --git a/x-pack/plugins/osquery/public/editor/osquery_schema/v4.8.0.json b/x-pack/plugins/osquery/public/editor/osquery_schema/v4.8.0.json new file mode 100644 index 00000000000000..2a15d54e7d3230 --- /dev/null +++ b/x-pack/plugins/osquery/public/editor/osquery_schema/v4.8.0.json @@ -0,0 +1 @@ +[{"name":"account_policy_data"},{"name":"acpi_tables"},{"name":"ad_config"},{"name":"alf"},{"name":"alf_exceptions"},{"name":"alf_explicit_auths"},{"name":"app_schemes"},{"name":"apparmor_events"},{"name":"apparmor_profiles"},{"name":"appcompat_shims"},{"name":"apps"},{"name":"apt_sources"},{"name":"arp_cache"},{"name":"asl"},{"name":"atom_packages"},{"name":"augeas"},{"name":"authenticode"},{"name":"authorization_mechanisms"},{"name":"authorizations"},{"name":"authorized_keys"},{"name":"autoexec"},{"name":"azure_instance_metadata"},{"name":"azure_instance_tags"},{"name":"background_activities_moderator"},{"name":"battery"},{"name":"bitlocker_info"},{"name":"block_devices"},{"name":"bpf_process_events"},{"name":"bpf_socket_events"},{"name":"browser_plugins"},{"name":"carbon_black_info"},{"name":"carves"},{"name":"certificates"},{"name":"chassis_info"},{"name":"chocolatey_packages"},{"name":"chrome_extension_content_scripts"},{"name":"chrome_extensions"},{"name":"connectivity"},{"name":"cpu_info"},{"name":"cpu_time"},{"name":"cpuid"},{"name":"crashes"},{"name":"crontab"},{"name":"cups_destinations"},{"name":"cups_jobs"},{"name":"curl"},{"name":"curl_certificate"},{"name":"deb_packages"},{"name":"default_environment"},{"name":"device_file"},{"name":"device_firmware"},{"name":"device_hash"},{"name":"device_partitions"},{"name":"disk_encryption"},{"name":"disk_events"},{"name":"disk_info"},{"name":"dns_cache"},{"name":"dns_resolvers"},{"name":"docker_container_fs_changes"},{"name":"docker_container_labels"},{"name":"docker_container_mounts"},{"name":"docker_container_networks"},{"name":"docker_container_ports"},{"name":"docker_container_processes"},{"name":"docker_container_stats"},{"name":"docker_containers"},{"name":"docker_image_history"},{"name":"docker_image_labels"},{"name":"docker_image_layers"},{"name":"docker_images"},{"name":"docker_info"},{"name":"docker_network_labels"},{"name":"docker_networks"},{"name":"docker_version"},{"name":"docker_volume_labels"},{"name":"docker_volumes"},{"name":"drivers"},{"name":"ec2_instance_metadata"},{"name":"ec2_instance_tags"},{"name":"elf_dynamic"},{"name":"elf_info"},{"name":"elf_sections"},{"name":"elf_segments"},{"name":"elf_symbols"},{"name":"etc_hosts"},{"name":"etc_protocols"},{"name":"etc_services"},{"name":"event_taps"},{"name":"example"},{"name":"extended_attributes"},{"name":"fan_speed_sensors"},{"name":"fbsd_kmods"},{"name":"file"},{"name":"file_events"},{"name":"firefox_addons"},{"name":"gatekeeper"},{"name":"gatekeeper_approved_apps"},{"name":"groups"},{"name":"hardware_events"},{"name":"hash"},{"name":"homebrew_packages"},{"name":"hvci_status"},{"name":"ibridge_info"},{"name":"ie_extensions"},{"name":"intel_me_info"},{"name":"interface_addresses"},{"name":"interface_details"},{"name":"interface_ipv6"},{"name":"iokit_devicetree"},{"name":"iokit_registry"},{"name":"iptables"},{"name":"kernel_extensions"},{"name":"kernel_info"},{"name":"kernel_modules"},{"name":"kernel_panics"},{"name":"keychain_acls"},{"name":"keychain_items"},{"name":"known_hosts"},{"name":"kva_speculative_info"},{"name":"last"},{"name":"launchd"},{"name":"launchd_overrides"},{"name":"listening_ports"},{"name":"lldp_neighbors"},{"name":"load_average"},{"name":"location_services"},{"name":"logged_in_users"},{"name":"logical_drives"},{"name":"logon_sessions"},{"name":"lxd_certificates"},{"name":"lxd_cluster"},{"name":"lxd_cluster_members"},{"name":"lxd_images"},{"name":"lxd_instance_config"},{"name":"lxd_instance_devices"},{"name":"lxd_instances"},{"name":"lxd_networks"},{"name":"lxd_storage_pools"},{"name":"magic"},{"name":"managed_policies"},{"name":"md_devices"},{"name":"md_drives"},{"name":"md_personalities"},{"name":"mdfind"},{"name":"mdls"},{"name":"memory_array_mapped_addresses"},{"name":"memory_arrays"},{"name":"memory_device_mapped_addresses"},{"name":"memory_devices"},{"name":"memory_error_info"},{"name":"memory_info"},{"name":"memory_map"},{"name":"mounts"},{"name":"msr"},{"name":"nfs_shares"},{"name":"npm_packages"},{"name":"ntdomains"},{"name":"ntfs_acl_permissions"},{"name":"ntfs_journal_events"},{"name":"nvram"},{"name":"oem_strings"},{"name":"office_mru"},{"name":"os_version"},{"name":"osquery_events"},{"name":"osquery_extensions"},{"name":"osquery_flags"},{"name":"osquery_info"},{"name":"osquery_packs"},{"name":"osquery_registry"},{"name":"osquery_schedule"},{"name":"package_bom"},{"name":"package_install_history"},{"name":"package_receipts"},{"name":"patches"},{"name":"pci_devices"},{"name":"physical_disk_performance"},{"name":"pipes"},{"name":"pkg_packages"},{"name":"platform_info"},{"name":"plist"},{"name":"portage_keywords"},{"name":"portage_packages"},{"name":"portage_use"},{"name":"power_sensors"},{"name":"powershell_events"},{"name":"preferences"},{"name":"process_envs"},{"name":"process_events"},{"name":"process_file_events"},{"name":"process_memory_map"},{"name":"process_namespaces"},{"name":"process_open_files"},{"name":"process_open_pipes"},{"name":"process_open_sockets"},{"name":"processes"},{"name":"programs"},{"name":"prometheus_metrics"},{"name":"python_packages"},{"name":"quicklook_cache"},{"name":"registry"},{"name":"routes"},{"name":"rpm_package_files"},{"name":"rpm_packages"},{"name":"running_apps"},{"name":"safari_extensions"},{"name":"sandboxes"},{"name":"scheduled_tasks"},{"name":"screenlock"},{"name":"seccomp_events"},{"name":"selinux_events"},{"name":"selinux_settings"},{"name":"services"},{"name":"shadow"},{"name":"shared_folders"},{"name":"shared_memory"},{"name":"shared_resources"},{"name":"sharing_preferences"},{"name":"shell_history"},{"name":"shellbags"},{"name":"shimcache"},{"name":"shortcut_files"},{"name":"signature"},{"name":"sip_config"},{"name":"smart_drive_info"},{"name":"smbios_tables"},{"name":"smc_keys"},{"name":"socket_events"},{"name":"ssh_configs"},{"name":"startup_items"},{"name":"sudoers"},{"name":"suid_bin"},{"name":"syslog_events"},{"name":"system_controls"},{"name":"system_extensions"},{"name":"system_info"},{"name":"systemd_units"},{"name":"temperature_sensors"},{"name":"time"},{"name":"time_machine_backups"},{"name":"time_machine_destinations"},{"name":"ulimit_info"},{"name":"uptime"},{"name":"usb_devices"},{"name":"user_events"},{"name":"user_groups"},{"name":"user_interaction_events"},{"name":"user_ssh_keys"},{"name":"userassist"},{"name":"users"},{"name":"video_info"},{"name":"virtual_memory_info"},{"name":"wifi_networks"},{"name":"wifi_status"},{"name":"wifi_survey"},{"name":"winbaseobj"},{"name":"windows_crashes"},{"name":"windows_eventlog"},{"name":"windows_events"},{"name":"windows_optional_features"},{"name":"windows_security_center"},{"name":"windows_security_products"},{"name":"wmi_bios_info"},{"name":"wmi_cli_event_consumers"},{"name":"wmi_event_filters"},{"name":"wmi_filter_consumer_binding"},{"name":"wmi_script_event_consumers"},{"name":"xprotect_entries"},{"name":"xprotect_meta"},{"name":"xprotect_reports"},{"name":"yara"},{"name":"yara_events"},{"name":"ycloud_instance_metadata"},{"name":"yum_sources"}] \ No newline at end of file diff --git a/x-pack/plugins/osquery/public/editor/osquery_tables.ts b/x-pack/plugins/osquery/public/editor/osquery_tables.ts index d114cda742f9de..d41df4021bae63 100644 --- a/x-pack/plugins/osquery/public/editor/osquery_tables.ts +++ b/x-pack/plugins/osquery/public/editor/osquery_tables.ts @@ -20,7 +20,7 @@ let osqueryTables: TablesJSON | null = null; export const getOsqueryTables = () => { if (!osqueryTables) { // eslint-disable-next-line @typescript-eslint/no-var-requires - osqueryTables = normalizeTables(require('./osquery_schema/v4.7.0.json')); + osqueryTables = normalizeTables(require('./osquery_schema/v4.8.0.json')); } return osqueryTables; }; diff --git a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx index 2305df807f1c84..28d69a6a7b15a1 100644 --- a/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx +++ b/x-pack/plugins/osquery/public/fleet_integration/osquery_managed_policy_create_import_extension.tsx @@ -207,7 +207,8 @@ export const OsqueryManagedPolicyCreateImportExtension = React.memo< integrationPolicyId={policy?.id} agentPolicyId={policy?.policy_id} /> - + + {editMode && scheduledQueryGroupTableData.inputs[0].streams.length ? ( diff --git a/x-pack/plugins/osquery/public/live_queries/form/index.tsx b/x-pack/plugins/osquery/public/live_queries/form/index.tsx index 6f2d1afec6fe93..9e952810e3352c 100644 --- a/x-pack/plugins/osquery/public/live_queries/form/index.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/index.tsx @@ -5,20 +5,28 @@ * 2.0. */ -import { EuiButton, EuiSteps, EuiSpacer, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { + EuiButton, + EuiButtonEmpty, + EuiSteps, + EuiSpacer, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; import { EuiContainedStepProps } from '@elastic/eui/src/components/steps/steps'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import React, { useMemo } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { useMutation } from 'react-query'; import { UseField, Form, FormData, useForm, useFormData, FIELD_TYPES } from '../../shared_imports'; import { AgentsTableField } from './agents_table_field'; import { LiveQueryQueryField } from './live_query_query_field'; import { useKibana } from '../../common/lib/kibana'; -import { ResultTabs } from '../../queries/edit/tabs'; +import { ResultTabs } from '../../routes/saved_queries/edit/tabs'; import { queryFieldValidation } from '../../common/validations'; import { fieldValidators } from '../../shared_imports'; +import { SavedQueryFlyout } from '../../saved_queries'; import { useErrorToast } from '../../common/hooks/use_error_toast'; const FORM_ID = 'liveQueryForm'; @@ -27,19 +35,17 @@ export const MAX_QUERY_LENGTH = 2000; interface LiveQueryFormProps { defaultValue?: Partial | undefined; - onSubmit?: (payload: Record) => Promise; onSuccess?: () => void; } -const LiveQueryFormComponent: React.FC = ({ - defaultValue, - // onSubmit, - onSuccess, -}) => { +const LiveQueryFormComponent: React.FC = ({ defaultValue, onSuccess }) => { const { http } = useKibana().services; - + const [showSavedQueryFlyout, setShowSavedQueryFlyout] = useState(false); const setErrorToast = useErrorToast(); + const handleShowSaveQueryFlout = useCallback(() => setShowSavedQueryFlyout(true), []); + const handleCloseSaveQueryFlout = useCallback(() => setShowSavedQueryFlyout(false), []); + const { data, isLoading, @@ -139,6 +145,8 @@ const LiveQueryFormComponent: React.FC = ({ [queryStatus] ); + const flyoutFormDefaultValue = useMemo(() => ({ query }), [query]); + const formSteps: EuiContainedStepProps[] = useMemo( () => [ { @@ -161,6 +169,17 @@ const LiveQueryFormComponent: React.FC = ({ /> + + + + + = ({ actionId, agentIds, agentSelected, + handleShowSaveQueryFlout, queryComponentProps, queryStatus, queryValueProvided, @@ -203,9 +223,17 @@ const LiveQueryFormComponent: React.FC = ({ ); return ( -
- - + <> +
+ + + {showSavedQueryFlyout ? ( + + ) : null} + ); }; diff --git a/x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx b/x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx index 07c13b930e1434..9f0b5acd8994a5 100644 --- a/x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx +++ b/x-pack/plugins/osquery/public/live_queries/form/live_query_query_field.tsx @@ -5,11 +5,13 @@ * 2.0. */ +import { EuiFormRow, EuiSpacer } from '@elastic/eui'; import React, { useCallback } from 'react'; -import { EuiFormRow } from '@elastic/eui'; +import { OsquerySchemaLink } from '../../components/osquery_schema_link'; import { FieldHook } from '../../shared_imports'; import { OsqueryEditor } from '../../editor'; +import { SavedQueriesDropdown } from '../../saved_queries/saved_queries_dropdown'; interface LiveQueryQueryFieldProps { disabled?: boolean; @@ -20,6 +22,13 @@ const LiveQueryQueryFieldComponent: React.FC = ({ disa const { value, setValue, errors } = field; const error = errors[0]?.message; + const handleSavedQueryChange = useCallback( + (savedQuery) => { + setValue(savedQuery.query); + }, + [setValue] + ); + const handleEditorChange = useCallback( (newValue) => { setValue(newValue); @@ -29,7 +38,13 @@ const LiveQueryQueryFieldComponent: React.FC = ({ disa return ( - + <> + + + }> + + + ); }; diff --git a/x-pack/plugins/osquery/public/packs/common/add_new_pack_query_flyout.tsx b/x-pack/plugins/osquery/public/packs/common/add_new_pack_query_flyout.tsx index 2680b5198fadbb..85578564b1eb2c 100644 --- a/x-pack/plugins/osquery/public/packs/common/add_new_pack_query_flyout.tsx +++ b/x-pack/plugins/osquery/public/packs/common/add_new_pack_query_flyout.tsx @@ -8,7 +8,7 @@ import { EuiFlyout, EuiFlyoutBody, EuiFlyoutHeader, EuiTitle } from '@elastic/eui'; import React from 'react'; -import { SavedQueryForm } from '../../queries/form'; +import { SavedQueryForm } from '../../saved_queries/form'; // @ts-expect-error update types const AddNewPackQueryFlyoutComponent = ({ handleClose, handleSubmit }) => ( @@ -19,7 +19,10 @@ const AddNewPackQueryFlyoutComponent = ({ handleClose, handleSubmit }) => ( - + { + // @ts-expect-error update types + + } ); diff --git a/x-pack/plugins/osquery/public/queries/edit/index.tsx b/x-pack/plugins/osquery/public/queries/edit/index.tsx deleted file mode 100644 index 61094b2d079402..00000000000000 --- a/x-pack/plugins/osquery/public/queries/edit/index.tsx +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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 { isEmpty } from 'lodash/fp'; -import React from 'react'; -import { useMutation, useQuery } from 'react-query'; - -import { SavedQueryForm } from '../form'; -import { useKibana } from '../../common/lib/kibana'; - -interface EditSavedQueryPageProps { - onSuccess: () => void; - savedQueryId: string; -} - -const EditSavedQueryPageComponent: React.FC = ({ - onSuccess, - savedQueryId, -}) => { - const { http } = useKibana().services; - - const { isLoading, data: savedQueryDetails } = useQuery(['savedQuery', { savedQueryId }], () => - http.get(`/internal/osquery/saved_query/${savedQueryId}`) - ); - const updateSavedQueryMutation = useMutation( - (payload) => - http.put(`/internal/osquery/saved_query/${savedQueryId}`, { body: JSON.stringify(payload) }), - { onSuccess } - ); - - if (isLoading) { - return <>{'Loading...'}; - } - - return ( - <> - {!isEmpty(savedQueryDetails) && ( - - )} - - ); -}; - -export const EditSavedQueryPage = React.memo(EditSavedQueryPageComponent); diff --git a/x-pack/plugins/osquery/public/queries/form/index.tsx b/x-pack/plugins/osquery/public/queries/form/index.tsx deleted file mode 100644 index 02468fbfde2283..00000000000000 --- a/x-pack/plugins/osquery/public/queries/form/index.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 { EuiButton, EuiSpacer } from '@elastic/eui'; -import React from 'react'; - -import { Field, getUseField, useForm, UseField, Form } from '../../shared_imports'; -import { CodeEditorField } from './code_editor_field'; -import { formSchema } from './schema'; - -export const CommonUseField = getUseField({ component: Field }); - -const SAVED_QUERY_FORM_ID = 'savedQueryForm'; - -interface SavedQueryFormProps { - defaultValue?: unknown; - handleSubmit: () => Promise; - type?: string; -} - -const SavedQueryFormComponent: React.FC = ({ - defaultValue, - handleSubmit, - type, -}) => { - const { form } = useForm({ - // @ts-expect-error update types - id: defaultValue ? SAVED_QUERY_FORM_ID + defaultValue.id : SAVED_QUERY_FORM_ID, - schema: formSchema, - onSubmit: handleSubmit, - options: { - stripEmptyFields: false, - }, - // @ts-expect-error update types - defaultValue, - }); - - const { submit } = form; - - return ( -
- - - - - - - - - {type === 'edit' ? 'Update' : 'Save'} - - ); -}; - -export const SavedQueryForm = React.memo(SavedQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/queries/form/schema.ts b/x-pack/plugins/osquery/public/queries/form/schema.ts deleted file mode 100644 index 33200e45dc8e38..00000000000000 --- a/x-pack/plugins/osquery/public/queries/form/schema.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 { FIELD_TYPES, FormSchema } from '../../shared_imports'; - -export const formSchema: FormSchema = { - name: { - type: FIELD_TYPES.TEXT, - label: 'Query name', - }, - description: { - type: FIELD_TYPES.TEXTAREA, - label: 'Description', - validations: [], - }, - platform: { - type: FIELD_TYPES.SELECT, - label: 'Platform', - defaultValue: 'all', - }, - query: { - label: 'Query', - type: FIELD_TYPES.TEXTAREA, - validations: [], - }, -}; diff --git a/x-pack/plugins/osquery/public/queries/index.tsx b/x-pack/plugins/osquery/public/queries/index.tsx deleted file mode 100644 index 7ecce3cfb22f4e..00000000000000 --- a/x-pack/plugins/osquery/public/queries/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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, { useCallback, useState } from 'react'; - -import { QueriesPage } from './queries'; -import { NewSavedQueryPage } from './new'; -import { EditSavedQueryPage } from './edit'; - -const QueriesComponent = () => { - const [showNewSavedQueryForm, setShowNewSavedQueryForm] = useState(false); - const [editSavedQueryId, setEditSavedQueryId] = useState(null); - - const goBack = useCallback(() => { - setShowNewSavedQueryForm(false); - setEditSavedQueryId(null); - }, []); - - const handleNewQueryClick = useCallback(() => setShowNewSavedQueryForm(true), []); - - if (showNewSavedQueryForm) { - return ; - } - - if (editSavedQueryId?.length) { - return ; - } - - return ; -}; - -export const Queries = React.memo(QueriesComponent); diff --git a/x-pack/plugins/osquery/public/queries/new/index.tsx b/x-pack/plugins/osquery/public/queries/new/index.tsx deleted file mode 100644 index 2682db126ea094..00000000000000 --- a/x-pack/plugins/osquery/public/queries/new/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * 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 { useMutation } from 'react-query'; - -import { useKibana } from '../../common/lib/kibana'; -import { SavedQueryForm } from '../form'; - -interface NewSavedQueryPageProps { - onSuccess: () => void; -} - -const NewSavedQueryPageComponent: React.FC = ({ onSuccess }) => { - const { http } = useKibana().services; - - const createSavedQueryMutation = useMutation( - (payload) => http.post(`/internal/osquery/saved_query`, { body: JSON.stringify(payload) }), - { - onSuccess, - } - ); - - // @ts-expect-error update types - return ; -}; - -export const NewSavedQueryPage = React.memo(NewSavedQueryPageComponent); diff --git a/x-pack/plugins/osquery/public/queries/queries/index.tsx b/x-pack/plugins/osquery/public/queries/queries/index.tsx deleted file mode 100644 index bf766a15a44a34..00000000000000 --- a/x-pack/plugins/osquery/public/queries/queries/index.tsx +++ /dev/null @@ -1,244 +0,0 @@ -/* - * 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 { map } from 'lodash/fp'; -import { - EuiBasicTable, - EuiButton, - EuiButtonIcon, - EuiCodeBlock, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - RIGHT_ALIGNMENT, -} from '@elastic/eui'; -import React, { useCallback, useMemo, useState } from 'react'; -import { useQuery, useQueryClient, useMutation } from 'react-query'; -import { useHistory } from 'react-router-dom'; -import qs from 'query-string'; - -import { useKibana } from '../../common/lib/kibana'; - -interface QueriesPageProps { - onEditClick: (savedQueryId: string) => void; - onNewClick: () => void; -} - -const QueriesPageComponent: React.FC = ({ onEditClick, onNewClick }) => { - const { push } = useHistory(); - const queryClient = useQueryClient(); - const [pageIndex, setPageIndex] = useState(0); - const [pageSize, setPageSize] = useState(5); - const [sortField, setSortField] = useState('updated_at'); - const [sortDirection, setSortDirection] = useState('desc'); - const [selectedItems, setSelectedItems] = useState([]); - const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState>({}); - const { http } = useKibana().services; - - const deleteSavedQueriesMutation = useMutation( - (payload) => http.delete(`/internal/osquery/saved_query`, { body: JSON.stringify(payload) }), - { - onSuccess: () => queryClient.invalidateQueries('savedQueryList'), - } - ); - - const { data = {} } = useQuery( - ['savedQueryList', { pageIndex, pageSize, sortField, sortDirection }], - () => - http.get('/internal/osquery/saved_query', { - query: { - pageIndex, - pageSize, - sortField, - sortDirection, - }, - }), - { - keepPreviousData: true, - // Refetch the data every 10 seconds - refetchInterval: 5000, - } - ); - const { total = 0, saved_objects: savedQueries } = data; - - const toggleDetails = useCallback( - (item) => () => { - const itemIdToExpandedRowMapValues = { ...itemIdToExpandedRowMap }; - if (itemIdToExpandedRowMapValues[item.id]) { - delete itemIdToExpandedRowMapValues[item.id]; - } else { - itemIdToExpandedRowMapValues[item.id] = ( - - {item.attributes.query} - - ); - } - setItemIdToExpandedRowMap(itemIdToExpandedRowMapValues); - }, - [itemIdToExpandedRowMap] - ); - - const renderExtendedItemToggle = useCallback( - (item) => ( - - ), - [itemIdToExpandedRowMap, toggleDetails] - ); - - const handleEditClick = useCallback((item) => onEditClick(item.id), [onEditClick]); - - const handlePlayClick = useCallback( - (item) => - push({ - search: qs.stringify({ - tab: 'live_query', - }), - state: { - query: { - id: item.id, - query: item.attributes.query, - }, - }, - }), - [push] - ); - - const columns = useMemo( - () => [ - { - field: 'attributes.name', - name: 'Query name', - sortable: true, - truncateText: true, - }, - { - field: 'attributes.description', - name: 'Description', - sortable: true, - truncateText: true, - }, - { - field: 'updated_at', - name: 'Last updated at', - sortable: true, - truncateText: true, - }, - { - name: 'Actions', - actions: [ - { - name: 'Live query', - description: 'Run live query', - type: 'icon', - icon: 'play', - onClick: handlePlayClick, - }, - { - name: 'Edit', - description: 'Edit or run this query', - type: 'icon', - icon: 'documentEdit', - onClick: handleEditClick, - }, - ], - }, - { - align: RIGHT_ALIGNMENT, - width: '40px', - isExpander: true, - render: renderExtendedItemToggle, - }, - ], - [handleEditClick, handlePlayClick, renderExtendedItemToggle] - ); - - const onTableChange = useCallback(({ page = {}, sort = {} }) => { - setPageIndex(page.index); - setPageSize(page.size); - setSortField(sort.field); - setSortDirection(sort.direction); - }, []); - - const pagination = useMemo( - () => ({ - pageIndex, - pageSize, - totalItemCount: total, - pageSizeOptions: [3, 5, 8], - }), - [total, pageIndex, pageSize] - ); - - const sorting = useMemo( - () => ({ - sort: { - field: sortField, - direction: sortDirection, - }, - }), - [sortDirection, sortField] - ); - - const selection = useMemo( - () => ({ - selectable: () => true, - onSelectionChange: setSelectedItems, - initialSelected: [], - }), - [] - ); - - const handleDeleteClick = useCallback(() => { - const selectedItemsIds = map('id', selectedItems); - // @ts-expect-error update types - deleteSavedQueriesMutation.mutate({ savedQueryIds: selectedItemsIds }); - }, [deleteSavedQueriesMutation, selectedItems]); - - return ( -
- - - {!selectedItems.length ? ( - - {'New query'} - - ) : ( - - {`Delete ${selectedItems.length} Queries`} - - )} - - - - - - {savedQueries && ( - - )} -
- ); -}; - -export const QueriesPage = React.memo(QueriesPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/index.tsx b/x-pack/plugins/osquery/public/routes/index.tsx index 7007feb19d663b..a858a51aad64e3 100644 --- a/x-pack/plugins/osquery/public/routes/index.tsx +++ b/x-pack/plugins/osquery/public/routes/index.tsx @@ -11,12 +11,16 @@ import { Switch, Redirect, Route } from 'react-router-dom'; import { useBreadcrumbs } from '../common/hooks/use_breadcrumbs'; import { LiveQueries } from './live_queries'; import { ScheduledQueryGroups } from './scheduled_query_groups'; +import { SavedQueries } from './saved_queries'; const OsqueryAppRoutesComponent = () => { useBreadcrumbs('base'); return ( + + + diff --git a/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx index 64a1fb0791e835..e4f1bb447a15a2 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/details/index.tsx @@ -27,7 +27,7 @@ import { useRouterNavigate } from '../../../common/lib/kibana'; import { WithHeaderLayout } from '../../../components/layouts'; import { useActionResults } from '../../../action_results/use_action_results'; import { useActionDetails } from '../../../actions/use_action_details'; -import { ResultTabs } from '../../../queries/edit/tabs'; +import { ResultTabs } from '../../saved_queries/edit/tabs'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/edit/form.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/edit/form.tsx new file mode 100644 index 00000000000000..8d77b7819bd3e2 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/edit/form.tsx @@ -0,0 +1,81 @@ +/* + * 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 { + EuiBottomBar, + EuiButtonEmpty, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, +} from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { Form } from '../../../shared_imports'; +import { SavedQueryForm } from '../../../saved_queries/form'; +import { useSavedQueryForm } from '../../../saved_queries/form/use_saved_query_form'; + +interface EditSavedQueryFormProps { + defaultValue?: unknown; + handleSubmit: () => Promise; +} + +const EditSavedQueryFormComponent: React.FC = ({ + defaultValue, + handleSubmit, +}) => { + const savedQueryListProps = useRouterNavigate('saved_queries'); + + const { form } = useSavedQueryForm({ + defaultValue, + handleSubmit, + }); + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export const EditSavedQueryForm = React.memo(EditSavedQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx new file mode 100644 index 00000000000000..4aaf8e4fc4fc33 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/edit/index.tsx @@ -0,0 +1,124 @@ +/* + * 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 { + EuiButtonEmpty, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiConfirmModal, +} from '@elastic/eui'; +import { isEmpty } from 'lodash/fp'; +import React, { useCallback, useMemo, useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { useParams } from 'react-router-dom'; + +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { WithHeaderLayout } from '../../../components/layouts'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; +import { EditSavedQueryForm } from './form'; +import { useDeleteSavedQuery, useUpdateSavedQuery, useSavedQuery } from '../../../saved_queries'; + +const EditSavedQueryPageComponent = () => { + const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); + const { savedQueryId } = useParams<{ savedQueryId: string }>(); + const savedQueryListProps = useRouterNavigate('saved_queries'); + + const { isLoading, data: savedQueryDetails } = useSavedQuery({ savedQueryId }); + const updateSavedQueryMutation = useUpdateSavedQuery({ savedQueryId }); + const deleteSavedQueryMutation = useDeleteSavedQuery({ savedQueryId }); + + useBreadcrumbs('saved_query_edit', { savedQueryId: savedQueryDetails?.attributes?.id ?? '' }); + + const handleCloseDeleteConfirmationModal = useCallback(() => { + setIsDeleteModalVisible(false); + }, []); + + const handleDeleteClick = useCallback(() => { + setIsDeleteModalVisible(true); + }, []); + + const handleDeleteConfirmClick = useCallback(() => { + deleteSavedQueryMutation.mutateAsync().then(() => { + handleCloseDeleteConfirmationModal(); + }); + }, [deleteSavedQueryMutation, handleCloseDeleteConfirmationModal]); + + const LeftColumn = useMemo( + () => ( + + + + + + + + +

+ +

+ +
+
+
+ ), + [savedQueryDetails?.attributes?.id, savedQueryListProps] + ); + + const RightColumn = useMemo( + () => ( + + + + ), + [handleDeleteClick] + ); + + if (isLoading) return null; + + return ( + + {!isLoading && !isEmpty(savedQueryDetails) && ( + + )} + {isDeleteModalVisible ? ( + +

You’re about to delete this query.

+

Are you sure you want to do this?

+
+ ) : null} +
+ ); +}; + +export const EditSavedQueryPage = React.memo(EditSavedQueryPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx new file mode 100644 index 00000000000000..1946cd6dd3450f --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/edit/tabs.tsx @@ -0,0 +1,78 @@ +/* + * 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 { EuiTabbedContent, EuiSpacer } from '@elastic/eui'; +import React, { useMemo } from 'react'; + +import { ResultsTable } from '../../../results/results_table'; +import { ActionResultsSummary } from '../../../action_results/action_results_summary'; + +interface ResultTabsProps { + actionId: string; + agentIds?: string[]; + expirationDate: Date; + isLive?: boolean; + startDate?: string; + endDate?: string; +} + +const ResultTabsComponent: React.FC = ({ + actionId, + agentIds, + endDate, + expirationDate, + isLive, + startDate, +}) => { + const tabs = useMemo( + () => [ + { + id: 'results', + name: 'Results', + content: ( + <> + + + + ), + }, + { + id: 'status', + name: 'Status', + content: ( + <> + + + + ), + }, + ], + [actionId, agentIds, endDate, expirationDate, isLive, startDate] + ); + + return ( + + ); +}; + +export const ResultTabs = React.memo(ResultTabsComponent); diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/index.tsx new file mode 100644 index 00000000000000..f986129bdfefc9 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/index.tsx @@ -0,0 +1,35 @@ +/* + * 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 { Switch, Route, useRouteMatch } from 'react-router-dom'; + +import { QueriesPage } from './list'; +import { NewSavedQueryPage } from './new'; +import { EditSavedQueryPage } from './edit'; +import { useBreadcrumbs } from '../../common/hooks/use_breadcrumbs'; + +const SavedQueriesComponent = () => { + useBreadcrumbs('saved_queries'); + const match = useRouteMatch(); + + return ( + + + + + + + + + + + + ); +}; + +export const SavedQueries = React.memo(SavedQueriesComponent); diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx new file mode 100644 index 00000000000000..7e8e8e543dfabf --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx @@ -0,0 +1,217 @@ +/* + * 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 moment from 'moment'; +import { + EuiInMemoryTable, + EuiButton, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; +import React, { useCallback, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { SavedObject } from 'kibana/public'; +import { WithHeaderLayout } from '../../../components/layouts'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; +import { useSavedQueries } from '../../../saved_queries/use_saved_queries'; + +interface EditButtonProps { + savedQueryId: string; + savedQueryName: string; +} + +const EditButtonComponent: React.FC = ({ savedQueryId, savedQueryName }) => { + const buttonProps = useRouterNavigate(`saved_queries/${savedQueryId}`); + + return ( + + ); +}; + +const EditButton = React.memo(EditButtonComponent); + +const SavedQueriesPageComponent = () => { + useBreadcrumbs('saved_queries'); + const newQueryLinkProps = useRouterNavigate('saved_queries/new'); + const [pageIndex, setPageIndex] = useState(0); + const [pageSize, setPageSize] = useState(10); + const [sortField, setSortField] = useState('updated_at'); + const [sortDirection, setSortDirection] = useState('desc'); + + const { data } = useSavedQueries({ isLive: true }); + + // const handlePlayClick = useCallback( + // (item) => + // push({ + // search: qs.stringify({ + // tab: 'live_query', + // }), + // state: { + // query: { + // id: item.id, + // query: item.attributes.query, + // }, + // }, + // }), + // [push] + // ); + + const renderEditAction = useCallback( + (item: SavedObject<{ name: string }>) => ( + + ), + [] + ); + + const renderUpdatedAt = useCallback((updatedAt, item) => { + if (!updatedAt) return '-'; + + const updatedBy = + item.attributes.updated_by !== item.attributes.created_by + ? ` @ ${item.attributes.updated_by}` + : ''; + return updatedAt ? `${moment(updatedAt).fromNow()}${updatedBy}` : '-'; + }, []); + + const columns = useMemo( + () => [ + { + field: 'attributes.id', + name: 'Query ID', + sortable: true, + truncateText: true, + }, + { + field: 'attributes.description', + name: 'Description', + sortable: true, + truncateText: true, + }, + { + field: 'attributes.created_by', + name: 'Created by', + sortable: true, + truncateText: true, + }, + { + field: 'attributes.updated_at', + name: 'Last updated at', + sortable: (item: SavedObject<{ updated_at: string }>) => + item.attributes.updated_at ? Date.parse(item.attributes.updated_at) : 0, + truncateText: true, + render: renderUpdatedAt, + }, + { + name: 'Actions', + actions: [ + // { + // name: 'Live query', + // description: 'Run live query', + // type: 'icon', + // icon: 'play', + // onClick: handlePlayClick, + // }, + { render: renderEditAction }, + ], + }, + ], + [renderEditAction, renderUpdatedAt] + ); + + const onTableChange = useCallback(({ page = {}, sort = {} }) => { + setPageIndex(page.index); + setPageSize(page.size); + setSortField(sort.field); + setSortDirection(sort.direction); + }, []); + + const pagination = useMemo( + () => ({ + pageIndex, + pageSize, + totalItemCount: data?.total ?? 0, + pageSizeOptions: [10, 20, 50, 100], + }), + [pageIndex, pageSize, data?.total] + ); + + const sorting = useMemo( + () => ({ + sort: { + field: sortField, + direction: sortDirection, + }, + }), + [sortDirection, sortField] + ); + + const LeftColumn = useMemo( + () => ( + + + +

+ +

+ +
+
+
+ ), + [] + ); + + const RightColumn = useMemo( + () => ( + + + + ), + [newQueryLinkProps] + ); + + return ( + + {data?.savedObjects && ( + + )} + + ); +}; + +export const QueriesPage = React.memo(SavedQueriesPageComponent); diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/new/form.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/new/form.tsx new file mode 100644 index 00000000000000..31d0c5637cc3e9 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/new/form.tsx @@ -0,0 +1,81 @@ +/* + * 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 { + EuiBottomBar, + EuiButtonEmpty, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, +} from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { Form } from '../../../shared_imports'; +import { SavedQueryForm } from '../../../saved_queries/form'; +import { useSavedQueryForm } from '../../../saved_queries/form/use_saved_query_form'; + +interface NewSavedQueryFormProps { + defaultValue?: unknown; + handleSubmit: () => Promise; +} + +const NewSavedQueryFormComponent: React.FC = ({ + defaultValue, + handleSubmit, +}) => { + const savedQueryListProps = useRouterNavigate('saved_queries'); + + const { form } = useSavedQueryForm({ + defaultValue, + handleSubmit, + }); + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export const NewSavedQueryForm = React.memo(NewSavedQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx b/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx new file mode 100644 index 00000000000000..3f5a1af64fe347 --- /dev/null +++ b/x-pack/plugins/osquery/public/routes/saved_queries/new/index.tsx @@ -0,0 +1,62 @@ +/* + * 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 { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import React, { useMemo } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useRouterNavigate } from '../../../common/lib/kibana'; +import { WithHeaderLayout } from '../../../components/layouts'; +import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +import { BetaBadge, BetaBadgeRowWrapper } from '../../../components/beta_badge'; +import { NewSavedQueryForm } from './form'; +import { useCreateSavedQuery } from '../../../saved_queries/use_create_saved_query'; + +const NewSavedQueryPageComponent = () => { + useBreadcrumbs('saved_query_new'); + const savedQueryListProps = useRouterNavigate('saved_queries'); + + const createSavedQueryMutation = useCreateSavedQuery({ withRedirect: true }); + + const LeftColumn = useMemo( + () => ( + + + + + + + + +

+ +

+ +
+
+
+ ), + [savedQueryListProps] + ); + + return ( + + { + // @ts-expect-error update types + + } + + ); +}; + +export const NewSavedQueryPage = React.memo(NewSavedQueryPageComponent); diff --git a/x-pack/plugins/osquery/public/saved_queries/constants.ts b/x-pack/plugins/osquery/public/saved_queries/constants.ts new file mode 100644 index 00000000000000..69ca805e3e8fad --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/constants.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export const SAVED_QUERIES_ID = 'savedQueryList'; diff --git a/x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx b/x-pack/plugins/osquery/public/saved_queries/form/code_editor_field.tsx similarity index 69% rename from x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx rename to x-pack/plugins/osquery/public/saved_queries/form/code_editor_field.tsx index 77ffdc4457d3d5..c70aeae66396e7 100644 --- a/x-pack/plugins/osquery/public/queries/form/code_editor_field.tsx +++ b/x-pack/plugins/osquery/public/saved_queries/form/code_editor_field.tsx @@ -5,11 +5,11 @@ * 2.0. */ -import { FormattedMessage } from '@kbn/i18n/react'; import { isEmpty } from 'lodash/fp'; -import { EuiFormRow, EuiLink, EuiText } from '@elastic/eui'; +import { EuiFormRow } from '@elastic/eui'; import React from 'react'; +import { OsquerySchemaLink } from '../../components/osquery_schema_link'; import { OsqueryEditor } from '../../editor'; import { FieldHook } from '../../shared_imports'; @@ -17,19 +17,6 @@ interface CodeEditorFieldProps { field: FieldHook; } -const OsquerySchemaLink = React.memo(() => ( - - - - - -)); - -OsquerySchemaLink.displayName = 'OsquerySchemaLink'; - const CodeEditorFieldComponent: React.FC = ({ field }) => { const { value, label, labelAppend, helpText, setValue, errors } = field; const error = errors[0]?.message; diff --git a/x-pack/plugins/osquery/public/saved_queries/form/index.tsx b/x-pack/plugins/osquery/public/saved_queries/form/index.tsx new file mode 100644 index 00000000000000..174227eb5e6e5f --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/form/index.tsx @@ -0,0 +1,74 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle, EuiText } from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { ALL_OSQUERY_VERSIONS_OPTIONS } from '../../scheduled_query_groups/queries/constants'; +import { PlatformCheckBoxGroupField } from '../../scheduled_query_groups/queries/platform_checkbox_group_field'; +import { Field, getUseField, UseField } from '../../shared_imports'; +import { CodeEditorField } from './code_editor_field'; + +export const CommonUseField = getUseField({ component: Field }); + +const SavedQueryFormComponent = () => ( + <> + + + + + + + + + +
+ +
+
+ + + +
+
+ + + + + + + + + + + + + +); + +export const SavedQueryForm = React.memo(SavedQueryFormComponent); diff --git a/x-pack/plugins/osquery/public/saved_queries/form/use_saved_query_form.tsx b/x-pack/plugins/osquery/public/saved_queries/form/use_saved_query_form.tsx new file mode 100644 index 00000000000000..6417b40747e0f1 --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/form/use_saved_query_form.tsx @@ -0,0 +1,64 @@ +/* + * 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 { isArray } from 'lodash'; +import uuid from 'uuid'; +import { produce } from 'immer'; + +import { useForm } from '../../shared_imports'; +import { formSchema } from '../../scheduled_query_groups/queries/schema'; +import { ScheduledQueryGroupFormData } from '../../scheduled_query_groups/queries/use_scheduled_query_group_query_form'; + +const SAVED_QUERY_FORM_ID = 'savedQueryForm'; + +interface UseSavedQueryFormProps { + defaultValue?: unknown; + handleSubmit: (payload: unknown) => Promise; +} + +export const useSavedQueryForm = ({ defaultValue, handleSubmit }: UseSavedQueryFormProps) => + useForm({ + id: SAVED_QUERY_FORM_ID + uuid.v4(), + schema: formSchema, + onSubmit: handleSubmit, + options: { + stripEmptyFields: false, + }, + // @ts-expect-error update types + defaultValue, + serializer: (payload) => + produce(payload, (draft) => { + // @ts-expect-error update types + if (draft.platform?.split(',').length === 3) { + // if all platforms are checked then use undefined + // @ts-expect-error update types + delete draft.platform; + } + if (isArray(draft.version)) { + if (!draft.version.length) { + // @ts-expect-error update types + delete draft.version; + } else { + draft.version = draft.version[0]; + } + } + return draft; + }), + // @ts-expect-error update types + deserializer: (payload) => { + if (!payload) return {} as ScheduledQueryGroupFormData; + + return { + id: payload.id, + description: payload.description, + query: payload.query, + interval: payload.interval ? parseInt(payload.interval, 10) : undefined, + platform: payload.platform, + version: payload.version ? [payload.version] : [], + }; + }, + }); diff --git a/x-pack/plugins/osquery/public/saved_queries/index.tsx b/x-pack/plugins/osquery/public/saved_queries/index.tsx new file mode 100644 index 00000000000000..405af5638c868e --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/index.tsx @@ -0,0 +1,12 @@ +/* + * 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. + */ + +export * from './saved_query_flyout'; +export * from './use_saved_query'; +export * from './use_saved_queries'; +export * from './use_update_saved_query'; +export * from './use_delete_saved_query'; diff --git a/x-pack/plugins/osquery/public/saved_queries/saved_queries_dropdown.tsx b/x-pack/plugins/osquery/public/saved_queries/saved_queries_dropdown.tsx new file mode 100644 index 00000000000000..e30954a695b2d9 --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/saved_queries_dropdown.tsx @@ -0,0 +1,104 @@ +/* + * 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 { find } from 'lodash/fp'; +import { EuiCodeBlock, EuiFormRow, EuiComboBox, EuiText } from '@elastic/eui'; +import React, { useCallback, useState } from 'react'; +import { SimpleSavedObject } from 'kibana/public'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useSavedQueries } from './use_saved_queries'; + +interface SavedQueriesDropdownProps { + disabled?: boolean; + onChange: ( + value: SimpleSavedObject<{ + id: string; + description?: string | undefined; + query: string; + }>['attributes'] + ) => void; +} + +const SavedQueriesDropdownComponent: React.FC = ({ + disabled, + onChange, +}) => { + const [selectedOptions, setSelectedOptions] = useState([]); + + const { data } = useSavedQueries({}); + + const queryOptions = + data?.savedObjects?.map((savedQuery) => ({ + label: savedQuery.attributes.id ?? '', + value: { + id: savedQuery.attributes.id, + description: savedQuery.attributes.description, + query: savedQuery.attributes.query, + }, + })) ?? []; + + const handleSavedQueryChange = useCallback( + (newSelectedOptions) => { + const selectedSavedQuery = find( + ['attributes.id', newSelectedOptions[0].value.id], + data?.savedObjects + ); + + if (selectedSavedQuery) { + onChange(selectedSavedQuery.attributes); + } + setSelectedOptions(newSelectedOptions); + }, + [data?.savedObjects, onChange] + ); + + const renderOption = useCallback( + ({ value }) => ( + <> + {value.id} + +

{value.description}

+
+ + {value.query} + + + ), + [] + ); + + return ( + + } + fullWidth + > + + + ); +}; + +export const SavedQueriesDropdown = React.memo(SavedQueriesDropdownComponent); diff --git a/x-pack/plugins/osquery/public/saved_queries/saved_query_flyout.tsx b/x-pack/plugins/osquery/public/saved_queries/saved_query_flyout.tsx new file mode 100644 index 00000000000000..6d14943a6bc84c --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/saved_query_flyout.tsx @@ -0,0 +1,89 @@ +/* + * 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 { + EuiFlyout, + EuiTitle, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiFlyoutFooter, + EuiPortal, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiButton, +} from '@elastic/eui'; +import React, { useCallback } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { Form } from '../shared_imports'; +import { useSavedQueryForm } from './form/use_saved_query_form'; +import { SavedQueryForm } from './form'; +import { useCreateSavedQuery } from './use_create_saved_query'; + +interface AddQueryFlyoutProps { + defaultValue: unknown; + onClose: () => void; +} + +const SavedQueryFlyoutComponent: React.FC = ({ defaultValue, onClose }) => { + const createSavedQueryMutation = useCreateSavedQuery({ withRedirect: false }); + + const handleSubmit = useCallback( + (payload) => createSavedQueryMutation.mutateAsync(payload).then(() => onClose()), + [createSavedQueryMutation, onClose] + ); + + const { form } = useSavedQueryForm({ + defaultValue, + handleSubmit, + }); + + return ( + + + + +

+ +

+
+
+ +
+ + +
+ + + + + + + + + + + + + + +
+
+ ); +}; + +export const SavedQueryFlyout = React.memo(SavedQueryFlyoutComponent); diff --git a/x-pack/plugins/osquery/public/saved_queries/use_create_saved_query.ts b/x-pack/plugins/osquery/public/saved_queries/use_create_saved_query.ts new file mode 100644 index 00000000000000..cc5c33c6e42801 --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/use_create_saved_query.ts @@ -0,0 +1,70 @@ +/* + * 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 { useMutation, useQueryClient } from 'react-query'; +import { i18n } from '@kbn/i18n'; + +import { useKibana } from '../common/lib/kibana'; +import { savedQuerySavedObjectType } from '../../common/types'; +import { PLUGIN_ID } from '../../common'; +import { pagePathGetters } from '../common/page_paths'; +import { SAVED_QUERIES_ID } from './constants'; +import { useErrorToast } from '../common/hooks/use_error_toast'; + +interface UseCreateSavedQueryProps { + withRedirect?: boolean; +} + +export const useCreateSavedQuery = ({ withRedirect }: UseCreateSavedQueryProps) => { + const queryClient = useQueryClient(); + const { + application: { navigateToApp }, + savedObjects, + security, + notifications: { toasts }, + } = useKibana().services; + const setErrorToast = useErrorToast(); + + return useMutation( + async (payload) => { + const currentUser = await security.authc.getCurrentUser(); + + if (!currentUser) { + throw new Error('CurrentUser is missing'); + } + + return savedObjects.client.create(savedQuerySavedObjectType, { + // @ts-expect-error update types + ...payload, + created_by: currentUser.username, + created_at: new Date(Date.now()).toISOString(), + updated_by: currentUser.username, + updated_at: new Date(Date.now()).toISOString(), + }); + }, + { + onError: (error) => { + // @ts-expect-error update types + setErrorToast(error, { title: error.body.error, toastMessage: error.body.message }); + }, + onSuccess: (payload) => { + queryClient.invalidateQueries(SAVED_QUERIES_ID); + if (withRedirect) { + navigateToApp(PLUGIN_ID, { path: pagePathGetters.saved_queries() }); + } + toasts.addSuccess( + i18n.translate('xpack.osquery.newSavedQuery.successToastMessageText', { + defaultMessage: 'Successfully saved "{savedQueryId}" query', + values: { + savedQueryId: payload.attributes?.id ?? '', + }, + }) + ); + }, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/saved_queries/use_delete_saved_query.ts b/x-pack/plugins/osquery/public/saved_queries/use_delete_saved_query.ts new file mode 100644 index 00000000000000..b2fee8b25f7a4f --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/use_delete_saved_query.ts @@ -0,0 +1,46 @@ +/* + * 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 { useMutation, useQueryClient } from 'react-query'; +import { i18n } from '@kbn/i18n'; + +import { useKibana } from '../common/lib/kibana'; +import { savedQuerySavedObjectType } from '../../common/types'; +import { PLUGIN_ID } from '../../common'; +import { pagePathGetters } from '../common/page_paths'; +import { SAVED_QUERIES_ID } from './constants'; +import { useErrorToast } from '../common/hooks/use_error_toast'; + +interface UseDeleteSavedQueryProps { + savedQueryId: string; +} + +export const useDeleteSavedQuery = ({ savedQueryId }: UseDeleteSavedQueryProps) => { + const queryClient = useQueryClient(); + const { + application: { navigateToApp }, + savedObjects, + notifications: { toasts }, + } = useKibana().services; + const setErrorToast = useErrorToast(); + + return useMutation(() => savedObjects.client.delete(savedQuerySavedObjectType, savedQueryId), { + onError: (error) => { + // @ts-expect-error update types + setErrorToast(error, { title: error.body.error, toastMessage: error.body.message }); + }, + onSuccess: () => { + queryClient.invalidateQueries(SAVED_QUERIES_ID); + navigateToApp(PLUGIN_ID, { path: pagePathGetters.saved_queries() }); + toasts.addSuccess( + i18n.translate('xpack.osquery.editSavedQuery.deleteSuccessToastMessageText', { + defaultMessage: 'Successfully deleted saved query', + }) + ); + }, + }); +}; diff --git a/x-pack/plugins/osquery/public/saved_queries/use_saved_queries.ts b/x-pack/plugins/osquery/public/saved_queries/use_saved_queries.ts new file mode 100644 index 00000000000000..324d4aace16474 --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/use_saved_queries.ts @@ -0,0 +1,46 @@ +/* + * 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 { useQuery } from 'react-query'; + +import { useKibana } from '../common/lib/kibana'; +import { savedQuerySavedObjectType } from '../../common/types'; +import { SAVED_QUERIES_ID } from './constants'; + +export const useSavedQueries = ({ + isLive = false, + pageIndex = 0, + pageSize = 10000, + sortField = 'updated_at', + sortDirection = 'desc', +}) => { + const { savedObjects } = useKibana().services; + + return useQuery( + [SAVED_QUERIES_ID, { pageIndex, pageSize, sortField, sortDirection }], + async () => + savedObjects.client.find<{ + id: string; + description?: string; + query: string; + updated_at: string; + updated_by: string; + created_at: string; + created_by: string; + }>({ + type: savedQuerySavedObjectType, + page: pageIndex + 1, + perPage: pageSize, + sortField, + }), + { + keepPreviousData: true, + // Refetch the data every 10 seconds + refetchInterval: isLive ? 10000 : false, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/saved_queries/use_saved_query.ts b/x-pack/plugins/osquery/public/saved_queries/use_saved_query.ts new file mode 100644 index 00000000000000..92662cd24fd20d --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/use_saved_query.ts @@ -0,0 +1,54 @@ +/* + * 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 { useQuery } from 'react-query'; + +import { PLUGIN_ID } from '../../common'; +import { useKibana } from '../common/lib/kibana'; +import { savedQuerySavedObjectType } from '../../common/types'; +import { pagePathGetters } from '../common/page_paths'; +import { useErrorToast } from '../common/hooks/use_error_toast'; + +export const SAVED_QUERY_ID = 'savedQuery'; + +interface UseSavedQueryProps { + savedQueryId: string; +} + +export const useSavedQuery = ({ savedQueryId }: UseSavedQueryProps) => { + const { + application: { navigateToApp }, + savedObjects, + } = useKibana().services; + const setErrorToast = useErrorToast(); + + return useQuery( + [SAVED_QUERY_ID, { savedQueryId }], + async () => + savedObjects.client.get<{ + id: string; + description?: string; + query: string; + }>(savedQuerySavedObjectType, savedQueryId), + { + keepPreviousData: true, + onSuccess: (data) => { + if (data.error) { + setErrorToast(data.error, { + title: data.error.error, + toastMessage: data.error.message, + }); + navigateToApp(PLUGIN_ID, { path: pagePathGetters.saved_queries() }); + } + }, + onError: (error) => { + // @ts-expect-error update types + setErrorToast(error, { title: error.body.error, toastMessage: error.body.message }); + }, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/saved_queries/use_scheduled_query_group.ts b/x-pack/plugins/osquery/public/saved_queries/use_scheduled_query_group.ts new file mode 100644 index 00000000000000..93d552b3f71f3a --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/use_scheduled_query_group.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { useKibana } from '../common/lib/kibana'; +import { GetOnePackagePolicyResponse, packagePolicyRouteService } from '../../../fleet/common'; +import { OsqueryManagerPackagePolicy } from '../../common/types'; + +interface UseScheduledQueryGroup { + scheduledQueryGroupId: string; + skip?: boolean; +} + +export const useScheduledQueryGroup = ({ + scheduledQueryGroupId, + skip = false, +}: UseScheduledQueryGroup) => { + const { http } = useKibana().services; + + return useQuery< + Omit & { item: OsqueryManagerPackagePolicy }, + unknown, + OsqueryManagerPackagePolicy + >( + ['scheduledQueryGroup', { scheduledQueryGroupId }], + () => http.get(packagePolicyRouteService.getInfoPath(scheduledQueryGroupId)), + { + keepPreviousData: true, + enabled: !skip, + select: (response) => response.item, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/saved_queries/use_update_saved_query.ts b/x-pack/plugins/osquery/public/saved_queries/use_update_saved_query.ts new file mode 100644 index 00000000000000..1260413676a4e1 --- /dev/null +++ b/x-pack/plugins/osquery/public/saved_queries/use_update_saved_query.ts @@ -0,0 +1,66 @@ +/* + * 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 { useMutation, useQueryClient } from 'react-query'; +import { i18n } from '@kbn/i18n'; + +import { useKibana } from '../common/lib/kibana'; +import { savedQuerySavedObjectType } from '../../common/types'; +import { PLUGIN_ID } from '../../common'; +import { pagePathGetters } from '../common/page_paths'; +import { SAVED_QUERIES_ID } from './constants'; +import { useErrorToast } from '../common/hooks/use_error_toast'; + +interface UseUpdateSavedQueryProps { + savedQueryId: string; +} + +export const useUpdateSavedQuery = ({ savedQueryId }: UseUpdateSavedQueryProps) => { + const queryClient = useQueryClient(); + const { + application: { navigateToApp }, + savedObjects, + security, + notifications: { toasts }, + } = useKibana().services; + const setErrorToast = useErrorToast(); + + return useMutation( + async (payload) => { + const currentUser = await security.authc.getCurrentUser(); + + if (!currentUser) { + throw new Error('CurrentUser is missing'); + } + + return savedObjects.client.update(savedQuerySavedObjectType, savedQueryId, { + // @ts-expect-error update types + ...payload, + updated_by: currentUser.username, + updated_at: new Date(Date.now()).toISOString(), + }); + }, + { + onError: (error) => { + // @ts-expect-error update types + setErrorToast(error, { title: error.body.error, toastMessage: error.body.message }); + }, + onSuccess: (payload) => { + queryClient.invalidateQueries(SAVED_QUERIES_ID); + navigateToApp(PLUGIN_ID, { path: pagePathGetters.saved_queries() }); + toasts.addSuccess( + i18n.translate('xpack.osquery.editSavedQuery.successToastMessageText', { + defaultMessage: 'Successfully updated "{savedQueryName}" query', + values: { + savedQueryName: payload.attributes?.name ?? '', + }, + }) + ); + }, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/constants.ts b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/constants.ts index 3345c18d07b2cb..bedca9d5ef8d75 100644 --- a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/constants.ts +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/constants.ts @@ -6,6 +6,9 @@ */ export const ALL_OSQUERY_VERSIONS_OPTIONS = [ + { + label: '4.8.0', + }, { label: '4.7.0', }, diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/platform_checkbox_group_field.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/platform_checkbox_group_field.tsx index 4e433e9e240b1a..0d455486bfa25f 100644 --- a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/platform_checkbox_group_field.tsx +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/platform_checkbox_group_field.tsx @@ -6,7 +6,7 @@ */ import { isEmpty, pickBy } from 'lodash'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, @@ -112,6 +112,15 @@ export const PlatformCheckBoxGroupField = ({ const describedByIds = useMemo(() => (idAria ? [idAria] : []), [idAria]); + useEffect(() => { + setCheckboxIdToSelectedMap(() => + (options as EuiCheckboxGroupOption[]).reduce((acc, option) => { + acc[option.id] = isEmpty(field.value) ? true : field.value?.includes(option.id) ?? false; + return acc; + }, {} as Record) + ); + }, [field.value, options]); + return ( = ({ onSave, onClose, }) => { + const [isEditMode] = useState(!!defaultValue); const { form } = useScheduledQueryGroupQueryForm({ defaultValue, handleSubmit: (payload, isValid) => @@ -67,7 +70,31 @@ const QueryFlyoutComponent: React.FC = ({ [integrationPackageVersion] ); - const { submit } = form; + const { submit, setFieldValue } = form; + + const handleSetQueryValue = useCallback( + (savedQuery) => { + setFieldValue('id', savedQuery.id); + setFieldValue('query', savedQuery.query); + + if (savedQuery.description) { + setFieldValue('description', savedQuery.description); + } + + if (savedQuery.interval) { + setFieldValue('interval', savedQuery.interval); + } + + if (isFieldSupported && savedQuery.platform) { + setFieldValue('platform', savedQuery.platform); + } + + if (isFieldSupported && savedQuery.version) { + setFieldValue('version', [savedQuery.version]); + } + }, + [isFieldSupported, setFieldValue] + ); return ( @@ -75,7 +102,7 @@ const QueryFlyoutComponent: React.FC = ({

- {defaultValue ? ( + {isEditMode ? ( = ({
+ {!isEditMode ? ( + <> + + + + ) : null} - + Set heading level based on context

} + description={'Will be wrapped in a small, subdued EuiText block.'} + > = ({ euiFieldProps={{ disabled: !isFieldSupported }} /> -
+ {!isFieldSupported ? ( diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/schema.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/schema.tsx index 344c33b419dd6c..d8dbaad2f17e82 100644 --- a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/schema.tsx +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/schema.tsx @@ -22,6 +22,16 @@ export const formSchema = { }), validations: idFieldValidations.map((validator) => ({ validator })), }, + description: { + type: FIELD_TYPES.TEXT, + label: i18n.translate( + 'xpack.osquery.scheduledQueryGroup.queryFlyoutForm.descriptionFieldLabel', + { + defaultMessage: 'Description', + } + ), + validations: [], + }, query: { type: FIELD_TYPES.TEXT, label: i18n.translate('xpack.osquery.scheduledQueryGroup.queryFlyoutForm.queryFieldLabel', { diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/use_scheduled_query_group_query_form.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/use_scheduled_query_group_query_form.tsx index bcde5f4b970d43..fdf781c6d6f7ac 100644 --- a/x-pack/plugins/osquery/public/scheduled_query_groups/queries/use_scheduled_query_group_query_form.tsx +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/queries/use_scheduled_query_group_query_form.tsx @@ -45,6 +45,9 @@ export const useScheduledQueryGroupQueryForm = ({ // @ts-expect-error update types serializer: (payload) => produce(payload, (draft) => { + if (isArray(draft.platform)) { + draft.platform.join(','); + } if (draft.platform?.split(',').length === 3) { // if all platforms are checked then use undefined delete draft.platform; diff --git a/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx b/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx index 7b5f91157132e5..391e20c63653f6 100644 --- a/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx +++ b/x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_groups_table.tsx @@ -6,6 +6,7 @@ */ import { EuiInMemoryTable, EuiBasicTableColumn, EuiLink } from '@elastic/eui'; +import moment from 'moment'; import React, { useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; @@ -37,6 +38,13 @@ const ScheduledQueryGroupsTableComponent = () => { const renderActive = useCallback((_, item) => , []); + const renderUpdatedAt = useCallback((updatedAt, item) => { + if (!updatedAt) return '-'; + + const updatedBy = item.updated_by !== item.created_by ? ` @ ${item.updated_by}` : ''; + return updatedAt ? `${moment(updatedAt).fromNow()}${updatedBy}` : '-'; + }, []); + const columns: Array> = useMemo( () => [ { @@ -66,6 +74,21 @@ const ScheduledQueryGroupsTableComponent = () => { render: renderQueries, width: '150px', }, + { + field: 'created_by', + name: i18n.translate('xpack.osquery.scheduledQueryGroups.table.createdByColumnTitle', { + defaultMessage: 'Created by', + }), + sortable: true, + truncateText: true, + }, + { + field: 'updated_at', + name: 'Last updated', + sortable: (item) => (item.updated_at ? Date.parse(item.updated_at) : 0), + truncateText: true, + render: renderUpdatedAt, + }, { field: 'enabled', name: i18n.translate('xpack.osquery.scheduledQueryGroups.table.activeColumnTitle', { @@ -77,7 +100,7 @@ const ScheduledQueryGroupsTableComponent = () => { render: renderActive, }, ], - [renderActive, renderAgentPolicy, renderQueries] + [renderActive, renderAgentPolicy, renderQueries, renderUpdatedAt] ); const sorting = useMemo( diff --git a/x-pack/plugins/osquery/public/types.ts b/x-pack/plugins/osquery/public/types.ts index 441c00f2d09685..9a466dfc619b60 100644 --- a/x-pack/plugins/osquery/public/types.ts +++ b/x-pack/plugins/osquery/public/types.ts @@ -8,7 +8,8 @@ import { DiscoverStart } from '../../../../src/plugins/discover/public'; import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; import { FleetStart } from '../../fleet/public'; -import { LensPublicStart } from '../../../plugins/lens/public'; +import { LensPublicStart } from '../../lens/public'; +import { SecurityPluginStart } from '../../security/public'; import { CoreStart } from '../../../../src/core/public'; import { NavigationPublicPluginStart } from '../../../../src/plugins/navigation/public'; import { @@ -30,6 +31,7 @@ export interface StartPlugins { data: DataPublicPluginStart; fleet: FleetStart; lens?: LensPublicStart; + security: SecurityPluginStart; triggersActionsUi: TriggersAndActionsUIPublicPluginStart; } diff --git a/x-pack/plugins/osquery/scripts/schema_formatter/script.ts b/x-pack/plugins/osquery/scripts/schema_formatter/script.ts index 578c4a11209629..5cdf11d48c6963 100644 --- a/x-pack/plugins/osquery/scripts/schema_formatter/script.ts +++ b/x-pack/plugins/osquery/scripts/schema_formatter/script.ts @@ -37,7 +37,7 @@ run( const mapFunc = pullFields.bind(null, { name: true }); const formattedSchema = schemaData.map(mapFunc); await fs.writeFile( - path.join(schemaPath, `${flags.schema_version}-formatted`), + path.join(schemaPath, `${flags.schema_version}-formatted.json`), JSON.stringify(formattedSchema) ); }, diff --git a/x-pack/plugins/osquery/server/config.ts b/x-pack/plugins/osquery/server/config.ts index 56d67400a47d9a..3ec9213ae6d604 100644 --- a/x-pack/plugins/osquery/server/config.ts +++ b/x-pack/plugins/osquery/server/config.ts @@ -10,7 +10,7 @@ import { TypeOf, schema } from '@kbn/config-schema'; export const ConfigSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), actionEnabled: schema.boolean({ defaultValue: false }), - savedQueries: schema.boolean({ defaultValue: false }), + savedQueries: schema.boolean({ defaultValue: true }), packs: schema.boolean({ defaultValue: false }), }); diff --git a/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts b/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts index 5b1f8e780494da..6ebf469b8fb296 100644 --- a/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts +++ b/x-pack/plugins/osquery/server/lib/osquery_app_context_services.ts @@ -6,6 +6,7 @@ */ import { Logger, LoggerFactory } from 'src/core/server'; +import { SecurityPluginStart } from '../../../security/server'; import { AgentService, FleetStartContract, @@ -69,7 +70,7 @@ export class OsqueryAppContextService { export interface OsqueryAppContext { logFactory: LoggerFactory; config(): ConfigType; - + security: SecurityPluginStart; /** * Object readiness is tied to plugin start method */ diff --git a/x-pack/plugins/osquery/server/lib/saved_query/saved_object_mappings.ts b/x-pack/plugins/osquery/server/lib/saved_query/saved_object_mappings.ts index dadcea6e2fd4d1..537b6d7874ab8a 100644 --- a/x-pack/plugins/osquery/server/lib/saved_query/saved_object_mappings.ts +++ b/x-pack/plugins/osquery/server/lib/saved_query/saved_object_mappings.ts @@ -14,34 +14,40 @@ export const savedQuerySavedObjectMappings: SavedObjectsType['mappings'] = { description: { type: 'text', }, - name: { - type: 'text', + id: { + type: 'keyword', }, query: { type: 'text', }, - created: { + created_at: { type: 'date', }, - createdBy: { + created_by: { type: 'text', }, platform: { type: 'keyword', }, - updated: { + version: { + type: 'keyword', + }, + updated_at: { type: 'date', }, - updatedBy: { + updated_by: { type: 'text', }, + interval: { + type: 'keyword', + }, }, }; export const savedQueryType: SavedObjectsType = { name: savedQuerySavedObjectType, hidden: false, - namespaceType: 'single', + namespaceType: 'multiple-isolated', mappings: savedQuerySavedObjectMappings, }; @@ -53,16 +59,16 @@ export const packSavedObjectMappings: SavedObjectsType['mappings'] = { name: { type: 'text', }, - created: { + created_at: { type: 'date', }, - createdBy: { + created_by: { type: 'text', }, - updated: { + updated_at: { type: 'date', }, - updatedBy: { + updated_by: { type: 'text', }, queries: { @@ -81,6 +87,6 @@ export const packSavedObjectMappings: SavedObjectsType['mappings'] = { export const packType: SavedObjectsType = { name: packSavedObjectType, hidden: false, - namespaceType: 'single', + namespaceType: 'multiple-isolated', mappings: packSavedObjectMappings, }; diff --git a/x-pack/plugins/osquery/server/plugin.ts b/x-pack/plugins/osquery/server/plugin.ts index ae779a9788238e..6bc12f5736e5e2 100644 --- a/x-pack/plugins/osquery/server/plugin.ts +++ b/x-pack/plugins/osquery/server/plugin.ts @@ -46,6 +46,7 @@ export class OsqueryPlugin implements Plugin config, + security: plugins.security, }; initSavedObjects(core.savedObjects, osqueryContext); diff --git a/x-pack/plugins/osquery/server/routes/action/create_action_route.ts b/x-pack/plugins/osquery/server/routes/action/create_action_route.ts index 86e871f0411608..478bfc1053bdf6 100644 --- a/x-pack/plugins/osquery/server/routes/action/create_action_route.ts +++ b/x-pack/plugins/osquery/server/routes/action/create_action_route.ts @@ -48,13 +48,15 @@ export const createActionRoute = (router: IRouter, osqueryContext: OsqueryAppCon } try { + const currentUser = await osqueryContext.security.authc.getCurrentUser(request)?.username; const action = { action_id: uuid.v4(), '@timestamp': moment().toISOString(), - expiration: moment().add(1, 'days').toISOString(), + expiration: moment().add(5, 'minutes').toISOString(), type: 'INPUT_ACTION', input_type: 'osquery', agents: selectedAgents, + user_id: currentUser, data: { id: uuid.v4(), query: request.body.query, @@ -75,7 +77,7 @@ export const createActionRoute = (router: IRouter, osqueryContext: OsqueryAppCon incrementCount(soClient, 'live_query', 'errors'); return response.customError({ statusCode: 500, - body: new Error(`Error occurred whlie processing ${error}`), + body: new Error(`Error occurred while processing ${error}`), }); } } diff --git a/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts index 5eb7147d466072..a41cb7cc39b40b 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts @@ -28,13 +28,15 @@ export const createSavedQueryRoute = (router: IRouter) => { async (context, request, response) => { const savedObjectsClient = context.core.savedObjects.client; - const { name, description, platform, query } = request.body; + const { id, description, platform, query, version, interval } = request.body; const savedQuerySO = await savedObjectsClient.create(savedQuerySavedObjectType, { - name, + id, description, query, platform, + version, + interval, }); return response.ok({ diff --git a/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts index 8be4c6c50d821e..2d399648df4cc0 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/read_saved_query_route.ts @@ -21,18 +21,14 @@ export const readSavedQueryRoute = (router: IRouter) => { async (context, request, response) => { const savedObjectsClient = context.core.savedObjects.client; - const { attributes, ...savedQuery } = await savedObjectsClient.get( + const savedQuery = await savedObjectsClient.get( savedQuerySavedObjectType, // @ts-expect-error update types request.params.id ); return response.ok({ - body: { - ...savedQuery, - // @ts-expect-error update types - ...attributes, - }, + body: savedQuery, }); } ); diff --git a/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts b/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts index 579cd9b654cc0e..f9ecf675489dcf 100644 --- a/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts +++ b/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts @@ -23,17 +23,19 @@ export const updateSavedQueryRoute = (router: IRouter) => { const savedObjectsClient = context.core.savedObjects.client; // @ts-expect-error update types - const { name, description, platform, query } = request.body; + const { id, description, platform, query, version, interval } = request.body; const savedQuerySO = await savedObjectsClient.update( savedQuerySavedObjectType, // @ts-expect-error update types request.params.id, { - name, + id, description, platform, query, + version, + interval, } ); diff --git a/x-pack/plugins/osquery/server/types.ts b/x-pack/plugins/osquery/server/types.ts index 667fba2bc98e24..84b2ff41dc1cf8 100644 --- a/x-pack/plugins/osquery/server/types.ts +++ b/x-pack/plugins/osquery/server/types.ts @@ -13,6 +13,7 @@ import { import { FleetStartContract } from '../../fleet/server'; import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/server'; import { PluginSetupContract } from '../../features/server'; +import { SecurityPluginStart } from '../../security/server'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface OsqueryPluginSetup {} @@ -24,6 +25,7 @@ export interface SetupPlugins { actions: ActionsPlugin['setup']; data: DataPluginSetup; features: PluginSetupContract; + security: SecurityPluginStart; } export interface StartPlugins { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ca2be10624e66e..7ffd5d8f20ffd6 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -17336,7 +17336,7 @@ "xpack.osquery.breadcrumbs.newLiveQueryPageTitle": "新規", "xpack.osquery.breadcrumbs.overviewPageTitle": "概要", "xpack.osquery.breadcrumbs.scheduledQueryGroupsPageTitle": "スケジュールされたクエリグループ", - "xpack.osquery.codeEditorField.osquerySchemaLinkLabel": "Osqueryスキーマ", + "xpack.osquery.osquerySchemaLinkLabel": "Osqueryスキーマ", "xpack.osquery.common.tabBetaBadgeLabel": "ベータ", "xpack.osquery.common.tabBetaBadgeTooltipContent": "この機能は現在開発中です。他にも機能が追加され、機能によっては変更されるものもあります。", "xpack.osquery.editScheduledQuery.pageTitle": "{queryName}を編集", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 341741dd4046af..4a964fc5e2fd0f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -17573,7 +17573,7 @@ "xpack.osquery.breadcrumbs.newLiveQueryPageTitle": "新建", "xpack.osquery.breadcrumbs.overviewPageTitle": "概览", "xpack.osquery.breadcrumbs.scheduledQueryGroupsPageTitle": "已计划查询组", - "xpack.osquery.codeEditorField.osquerySchemaLinkLabel": "Osquery 架构", + "xpack.osquery.osquerySchemaLinkLabel": "Osquery 架构", "xpack.osquery.common.tabBetaBadgeLabel": "公测版", "xpack.osquery.common.tabBetaBadgeTooltipContent": "我们正在开发此功能。将会有更多的功能,某些功能可能有变更。", "xpack.osquery.createScheduledQuery.agentPolicyAgentsCountText": "{count, plural, other {# 个代理}}已注册", From da13795ed4e3c511ce44b87da7a5d146971f3866 Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Mon, 28 Jun 2021 22:03:08 -0400 Subject: [PATCH 064/227] Task/host isolation status pending (#103549) --- .../event_details/alert_summary_view.tsx | 4 ++-- .../detection_engine/alerts/translations.ts | 5 +++++ .../alerts/use_host_isolation_status.tsx | 22 +++++++++++++++++-- .../body/renderers/agent_statuses.tsx | 13 +++++++++-- .../body/renderers/formatted_field.tsx | 2 +- 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx index 59acb16c028d8e..d89f44542318e4 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx @@ -183,7 +183,7 @@ const AlertSummaryViewComponent: React.FC<{ return endpointAlertCheck({ data }); }, [data]); - const agentId = useMemo(() => { + const endpointId = useMemo(() => { const findAgentId = find({ category: 'agent', field: 'agent.id' }, data)?.values; return findAgentId ? findAgentId[0] : ''; }, [data]); @@ -194,7 +194,7 @@ const AlertSummaryViewComponent: React.FC<{ contextId: timelineId, eventId, fieldName: 'agent.status', - value: agentId, + value: endpointId, linkValue: undefined, }, }; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/translations.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/translations.ts index 9e4497f2f096bb..d5234e719b869c 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/translations.ts @@ -42,3 +42,8 @@ export const ISOLATION_STATUS_FAILURE = i18n.translate( 'xpack.securitySolution.endpoint.hostIsolation.isolationStatus.title', { defaultMessage: 'Failed to retrieve current isolation status' } ); + +export const ISOLATION_PENDING_FAILURE = i18n.translate( + 'xpack.securitySolution.endpoint.hostIsolation.isolationPending.title', + { defaultMessage: 'Failed to retrieve isolation pending statuses' } +); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx index 7419727fff6a2a..3bdd8c98137852 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx @@ -9,7 +9,8 @@ import { isEmpty } from 'lodash'; import { useEffect, useState } from 'react'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { getHostMetadata } from './api'; -import { ISOLATION_STATUS_FAILURE } from './translations'; +import { ISOLATION_STATUS_FAILURE, ISOLATION_PENDING_FAILURE } from './translations'; +import { fetchPendingActionsByAgentId } from '../../../../common/lib/endpoint_pending_actions'; import { isEndpointHostIsolated } from '../../../../common/utils/validators'; import { HostStatus } from '../../../../../common/endpoint/types'; @@ -17,6 +18,8 @@ interface HostIsolationStatusResponse { loading: boolean; isIsolated: boolean; agentStatus: HostStatus; + pendingIsolation: number; + pendingUnisolation: number; } /* @@ -28,6 +31,8 @@ export const useHostIsolationStatus = ({ }): HostIsolationStatusResponse => { const [isIsolated, setIsIsolated] = useState(false); const [agentStatus, setAgentStatus] = useState(HostStatus.UNHEALTHY); + const [pendingIsolation, setPendingIsolation] = useState(0); + const [pendingUnisolation, setPendingUnisolation] = useState(0); const [loading, setLoading] = useState(false); const { addError } = useAppToasts(); @@ -35,16 +40,29 @@ export const useHostIsolationStatus = ({ useEffect(() => { // isMounted tracks if a component is mounted before changing state let isMounted = true; + let fleetAgentId: string; const fetchData = async () => { try { const metadataResponse = await getHostMetadata({ agentId }); if (isMounted) { setIsIsolated(isEndpointHostIsolated(metadataResponse.metadata)); setAgentStatus(metadataResponse.host_status); + fleetAgentId = metadataResponse.metadata.elastic.agent.id; } } catch (error) { addError(error.message, { title: ISOLATION_STATUS_FAILURE }); } + + try { + const { data } = await fetchPendingActionsByAgentId(fleetAgentId); + if (isMounted) { + setPendingIsolation(data[0].pending_actions?.isolate ?? 0); + setPendingUnisolation(data[0].pending_actions?.unisolate ?? 0); + } + } catch (error) { + addError(error.message, { title: ISOLATION_PENDING_FAILURE }); + } + if (isMounted) { setLoading(false); } @@ -64,5 +82,5 @@ export const useHostIsolationStatus = ({ isMounted = false; }; }, [addError, agentId]); - return { loading, isIsolated, agentStatus }; + return { loading, isIsolated, agentStatus, pendingIsolation, pendingUnisolation }; }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/agent_statuses.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/agent_statuses.tsx index 16f11809dd72b5..2c88b305c7d05f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/agent_statuses.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/agent_statuses.tsx @@ -24,7 +24,12 @@ export const AgentStatuses = React.memo( eventId: string; value: string; }) => { - const { isIsolated, agentStatus } = useHostIsolationStatus({ agentId: value }); + const { + isIsolated, + agentStatus, + pendingIsolation, + pendingUnisolation, + } = useHostIsolationStatus({ agentId: value }); const isolationFieldName = 'host.isolation'; return ( @@ -45,7 +50,11 @@ export const AgentStatuses = React.memo( tooltipContent={isolationFieldName} value={`${isIsolated}`} > - +
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx index 3d5d410abb87ec..1d04849b198ad8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx @@ -126,7 +126,7 @@ const FormattedFieldValueComponent: React.FC<{ contextId={contextId} eventId={eventId} fieldName={fieldName} - value={value as string} + value={typeof value === 'string' ? value : ''} /> ); } else if ( From 1dce600efecf22138ddd225c10b06c6464515a45 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 28 Jun 2021 21:27:10 -0500 Subject: [PATCH 065/227] Collect `host.os.platform` telemetry for APM (#103520) Fixes #97958. --- .../__snapshots__/apm_telemetry.test.ts.snap | 22 +++++++++ .../collect_data_telemetry/tasks.test.ts | 38 +++++++++++++++ .../collect_data_telemetry/tasks.ts | 48 +++++++++++++++++++ .../apm/server/lib/apm_telemetry/schema.ts | 2 + .../apm/server/lib/apm_telemetry/types.ts | 2 + .../schema/xpack_plugins.json | 33 +++++++++++-- 6 files changed, 141 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap b/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap index d7fc8e6442f12e..71b0929164705b 100644 --- a/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap +++ b/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap @@ -675,6 +675,17 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the } } }, + "host": { + "properties": { + "os": { + "properties": { + "platform": { + "type": "keyword" + } + } + } + } + }, "counts": { "properties": { "transaction": { @@ -967,6 +978,17 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the } } }, + "host": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, "processor_events": { "properties": { "took": { diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts index 129da710978630..4bfac442b4a3cb 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts @@ -209,6 +209,44 @@ describe('data telemetry collection tasks', () => { }); }); + describe('host', () => { + const task = tasks.find((t) => t.name === 'host'); + + it('returns a map of host provider data', async () => { + const search = jest.fn().mockResolvedValueOnce({ + aggregations: { + platform: { + buckets: [ + { doc_count: 1, key: 'linux' }, + { doc_count: 1, key: 'windows' }, + { doc_count: 1, key: 'macos' }, + ], + }, + }, + }); + + expect(await task?.executor({ indices, search } as any)).toEqual({ + host: { + os: { platform: ['linux', 'windows', 'macos'] }, + }, + }); + }); + + describe('with no results', () => { + it('returns an empty map', async () => { + const search = jest.fn().mockResolvedValueOnce({}); + + expect(await task?.executor({ indices, search } as any)).toEqual({ + host: { + os: { + platform: [], + }, + }, + }); + }); + }); + }); + describe('processor_events', () => { const task = tasks.find((t) => t.name === 'processor_events'); diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts index 3d5b4b754e4aa5..fd341565c235b0 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts @@ -20,6 +20,7 @@ import { CONTAINER_ID, ERROR_GROUP_ID, HOST_NAME, + HOST_OS_PLATFORM, OBSERVER_HOSTNAME, PARENT_ID, POD_NAME, @@ -293,6 +294,53 @@ export const tasks: TelemetryTask[] = [ return { cloud }; }, }, + { + name: 'host', + executor: async ({ indices, search }) => { + function getBucketKeys({ + buckets, + }: { + buckets: Array<{ + doc_count: number; + key: string | number; + }>; + }) { + return buckets.map((bucket) => bucket.key as string); + } + + const response = await search({ + index: [ + indices['apm_oss.errorIndices'], + indices['apm_oss.metricsIndices'], + indices['apm_oss.spanIndices'], + indices['apm_oss.transactionIndices'], + ], + body: { + size: 0, + timeout, + aggs: { + platform: { + terms: { + field: HOST_OS_PLATFORM, + }, + }, + }, + }, + }); + + const { aggregations } = response; + + if (!aggregations) { + return { host: { os: { platform: [] } } }; + } + const host = { + os: { + platform: getBucketKeys(aggregations.platform), + }, + }; + return { host }; + }, + }, { name: 'environments', executor: async ({ indices, search }) => { diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts index 0b1bc3d50d4c1a..b04f64c6bccff6 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts @@ -135,6 +135,7 @@ export const apmSchema: MakeSchemaFrom = { provider: { type: 'array', items: { type: 'keyword' } }, region: { type: 'array', items: { type: 'keyword' } }, }, + host: { os: { platform: { type: 'array', items: { type: 'keyword' } } } }, counts: { transaction: timeframeMapSchema, span: timeframeMapSchema, @@ -185,6 +186,7 @@ export const apmSchema: MakeSchemaFrom = { tasks: { aggregated_transactions: { took: { ms: long } }, cloud: { took: { ms: long } }, + host: { took: { ms: long } }, processor_events: { took: { ms: long } }, agent_configuration: { took: { ms: long } }, services: { took: { ms: long } }, diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts index 6dc829425eadac..cd4e80ff6bf6bc 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts @@ -52,6 +52,7 @@ export interface APMUsage { provider: string[]; region: string[]; }; + host: { os: { platform: string[] } }; counts: { transaction: TimeframeMap; span: TimeframeMap; @@ -132,6 +133,7 @@ export interface APMUsage { tasks: Record< | 'aggregated_transactions' | 'cloud' + | 'host' | 'processor_events' | 'agent_configuration' | 'services' diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index bab4244139df07..5a8b30c5c0f267 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -31,10 +31,10 @@ "__index": { "type": "long" }, - "__swimlane": { + "__pagerduty": { "type": "long" }, - "__pagerduty": { + "__swimlane": { "type": "long" }, "__server-log": { @@ -71,10 +71,10 @@ "__index": { "type": "long" }, - "__swimlane": { + "__pagerduty": { "type": "long" }, - "__pagerduty": { + "__swimlane": { "type": "long" }, "__server-log": { @@ -1260,6 +1260,20 @@ } } }, + "host": { + "properties": { + "os": { + "properties": { + "platform": { + "type": "array", + "items": { + "type": "keyword" + } + } + } + } + } + }, "counts": { "properties": { "transaction": { @@ -1552,6 +1566,17 @@ } } }, + "host": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, "processor_events": { "properties": { "took": { From 09bd6301d63803afb503360bdb6c82ffcc497d08 Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Tue, 29 Jun 2021 08:57:30 +0200 Subject: [PATCH 066/227] [CCR & Snapshot+Restore] Center align states under tabs (#103237) * fix up CCR centered sates in tabs content * update snapshots list * fix lint errors * Change tab states for all pages in snapshot+restore * Remove unnecessary variables * Seems we dont need the class wrapper * fix broken type * Fix bug in ILM table when filtering it down * center align search box * fix linter errors * fix prettier warnings * revert content var refactor and just focus on ux * add breakword class to paragraph so we avoid text overflowing * fix prettier errors Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../authorization/components/page_error.tsx | 6 +- .../auto_follow_pattern_list.test.js | 2 +- .../follower_indices_list.test.js | 2 +- .../auto_follow_pattern_list.js | 47 +-- .../follower_indices_list.js | 47 +-- .../public/shared_imports.ts | 3 + .../sections/policy_table/policy_table.tsx | 6 +- .../helpers/home.helpers.ts | 1 + .../__jest__/client_integration/home.test.ts | 2 +- .../sections/home/policy_list/policy_list.tsx | 93 ++--- .../home/repository_list/repository_list.tsx | 104 ++--- .../home/restore_list/restore_list.tsx | 84 +++-- .../home/snapshot_list/snapshot_list.tsx | 356 ++++++++++-------- .../snapshot_restore/public/shared_imports.ts | 3 + 14 files changed, 415 insertions(+), 341 deletions(-) diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx index 732aa35b052370..9953a8fedb39b2 100644 --- a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx @@ -43,7 +43,11 @@ export const PageError: React.FunctionComponent = ({ body={ error && ( <> - {cause ? message || errorString :

{message || errorString}

} + {cause ? ( + message || errorString + ) : ( +

{message || errorString}

+ )} {cause && ( <> diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js index 1e7eb9562313d4..7f7a61a6f01779 100644 --- a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js @@ -38,7 +38,7 @@ describe('', () => { }); test('should show a loading indicator on component', async () => { - expect(exists('autoFollowPatternLoading')).toBe(true); + expect(exists('sectionLoading')).toBe(true); }); }); diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js index f004617a099d36..b9e47b029e3021 100644 --- a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js @@ -45,7 +45,7 @@ describe('', () => { }); test('should show a loading indicator on component', async () => { - expect(exists('followerIndexLoading')).toBe(true); + expect(exists('sectionLoading')).toBe(true); }); }); diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js index 1ab4e1a3e003a8..3a4273c1ed0e30 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js @@ -9,13 +9,12 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiButton, EuiEmptyPrompt, EuiText, EuiSpacer } from '@elastic/eui'; +import { EuiPageContent, EuiButton, EuiEmptyPrompt, EuiText, EuiSpacer } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../../src/plugins/kibana_react/public'; -import { extractQueryParams, SectionLoading } from '../../../../shared_imports'; +import { extractQueryParams, PageError, PageLoading } from '../../../../shared_imports'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_AUTO_FOLLOW_PATTERN_LIST_LOAD } from '../../../constants'; -import { SectionError, SectionUnauthorized } from '../../../components'; import { AutoFollowPatternTable, DetailPanel } from './components'; const REFRESH_RATE_MS = 30000; @@ -98,7 +97,12 @@ export class AutoFollowPatternList extends PureComponent { renderEmpty() { return ( -
+ } /> -
+ ); } @@ -170,19 +174,22 @@ export class AutoFollowPatternList extends PureComponent { if (!isAuthorized) { return ( - } - > - - + error={{ + error: ( + + ), + }} + /> ); } @@ -194,7 +201,7 @@ export class AutoFollowPatternList extends PureComponent { } ); - return ; + return ; } if (isEmpty) { @@ -203,14 +210,12 @@ export class AutoFollowPatternList extends PureComponent { if (apiStatus === API_STATUS.LOADING) { return ( -
- - - -
+ + + ); } diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js index a52ba0e613ca9e..4b593799f59330 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js @@ -9,13 +9,12 @@ import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiButton, EuiEmptyPrompt, EuiText, EuiSpacer } from '@elastic/eui'; +import { EuiPageContent, EuiButton, EuiEmptyPrompt, EuiText, EuiSpacer } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../../src/plugins/kibana_react/public'; -import { extractQueryParams, SectionLoading } from '../../../../shared_imports'; +import { extractQueryParams, PageLoading, PageError } from '../../../../shared_imports'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_FOLLOWER_INDEX_LIST_LOAD } from '../../../constants'; -import { SectionError, SectionUnauthorized } from '../../../components'; import { FollowerIndicesTable, DetailPanel } from './components'; const REFRESH_RATE_MS = 30000; @@ -89,7 +88,12 @@ export class FollowerIndicesList extends PureComponent { renderEmpty() { return ( -
+ } /> -
+ ); } renderLoading() { return ( -
- - - -
+ + + ); } @@ -171,19 +173,22 @@ export class FollowerIndicesList extends PureComponent { if (!isAuthorized) { return ( - } - > - - + error={{ + error: ( + + ), + }} + /> ); } @@ -195,7 +200,7 @@ export class FollowerIndicesList extends PureComponent { } ); - return ; + return ; } if (isEmpty) { diff --git a/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts b/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts index 55a10749230c74..38838968ad212f 100644 --- a/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts +++ b/x-pack/plugins/cross_cluster_replication/public/shared_imports.ts @@ -10,4 +10,7 @@ export { indices, SectionLoading, PageError, + PageLoading, } from '../../../../src/plugins/es_ui_shared/public'; + +export { APP_WRAPPER_CLASS } from '../../../../src/core/public'; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx index ba89d6c895d93e..6ed7d42a694cc7 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx @@ -85,8 +85,10 @@ export const PolicyTable: React.FunctionComponent = ({ ); } + // Wrapping the actual contents inside a div, otherwise the table layout will get messed up + // if the table size changes (ie: applying a filter) due to the flex props of the page wrapper. content = ( - +
= ({ {tableContent} - +
); } else { return ( diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts index 8a790342134ccf..00cec284f37473 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts @@ -255,6 +255,7 @@ export type TestSubjects = | 'snapshotDetail.version' | 'snapshotLink' | 'snapshotList' + | 'snapshotListEmpty' | 'snapshotList.cell' | 'snapshotList.closeButton' | 'snapshotList.content' diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts index c48d6d78d08f6a..9f334ce4d49c84 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts @@ -121,7 +121,7 @@ describe('', () => { }); expect(exists('repositoryList')).toBe(false); - expect(exists('snapshotList')).toBe(true); + expect(exists('snapshotListEmpty')).toBe(true); }); }); }); diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx index ca1f28c586522e..63aae47e638375 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx @@ -8,12 +8,13 @@ import React, { Fragment, useEffect } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { RouteComponentProps } from 'react-router-dom'; -import { EuiEmptyPrompt, EuiButton, EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { EuiPageContent, EuiEmptyPrompt, EuiButton, EuiCallOut, EuiSpacer } from '@elastic/eui'; import { reactRouterNavigate } from '../../../../../../../../src/plugins/kibana_react/public'; import { - SectionError, + PageLoading, + PageError, Error, WithPrivileges, NotAuthorizedSection, @@ -21,7 +22,6 @@ import { import { SlmPolicy } from '../../../../../common/types'; import { APP_SLM_CLUSTER_PRIVILEGES } from '../../../../../common'; -import { SectionLoading } from '../../../components'; import { BASE_PATH, UIM_POLICY_LIST_LOAD } from '../../../constants'; import { useDecodedParams } from '../../../lib'; import { useLoadPolicies, useLoadRetentionSettings } from '../../../services/http'; @@ -89,16 +89,16 @@ export const PolicyList: React.FunctionComponent + - + ); } else if (error) { content = ( - - -
- } - body={ - -

+ + -

-
- } - actions={ - - - - } - data-test-subj="emptyPrompt" - /> + + } + body={ + +

+ +

+
+ } + actions={ + + + + } + data-test-subj="emptyPrompt" + /> + ); } else { const policySchedules = policies.map((policy: SlmPolicy) => policy.schedule); @@ -152,7 +159,7 @@ export const PolicyList: React.FunctionComponent policy.retention)); content = ( - +
{hasDuplicateSchedules ? ( - +
); } @@ -198,7 +205,7 @@ export const PolicyList: React.FunctionComponent `cluster.${name}`)}> {({ hasPrivileges, privilegesMissing }) => hasPrivileges ? ( -
+ <> {policyName ? ( ) : null} {content} -
+ ) : ( + - + ); } else if (error) { content = ( - - - - } - body={ - -

+ + -

-
- } - actions={ - - - - } - data-test-subj="emptyPrompt" - /> + + } + body={ + +

+ +

+
+ } + actions={ + + + + } + data-test-subj="emptyPrompt" + /> + ); } else { content = ( - +
+ +
); } return ( -
+ <> {repositoryName ? ( ) : null} {content} -
+ ); }; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx index 8dabaf4f29847c..14044d3aaa1617 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx @@ -8,6 +8,7 @@ import React, { useEffect, useState, Fragment } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { + EuiPageContent, EuiEmptyPrompt, EuiPopover, EuiButtonEmpty, @@ -23,10 +24,10 @@ import { APP_RESTORE_INDEX_PRIVILEGES } from '../../../../../common'; import { WithPrivileges, NotAuthorizedSection, - SectionError, + PageError, + PageLoading, Error, } from '../../../../shared_imports'; -import { SectionLoading } from '../../../components'; import { UIM_RESTORE_LIST_LOAD } from '../../../constants'; import { useLoadRestores } from '../../../services/http'; import { linkToSnapshots } from '../../../services/navigation'; @@ -74,18 +75,18 @@ export const RestoreList: React.FunctionComponent = () => { if (isLoading) { // Because we're polling for new data, we only want to hide the list during the initial fetch. content = ( - + - + ); } else if (error) { // If we get an error while polling we don't need to show it to the user because they can still // work with the table. content = ( - { } else { if (restores && restores.length === 0) { content = ( - - - - } - body={ - -

+ + - - - ), - }} + id="xpack.snapshotRestore.restoreList.emptyPromptTitle" + defaultMessage="No restored snapshots" /> -

-
- } - data-test-subj="emptyPrompt" - /> + + } + body={ + +

+ + + + ), + }} + /> +

+
+ } + data-test-subj="emptyPrompt" + /> + ); } else { content = ( - +
{ - +
); } } @@ -217,7 +225,7 @@ export const RestoreList: React.FunctionComponent = () => { `index.${name}`)}> {({ hasPrivileges, privilegesMissing }) => hasPrivileges ? ( -
{content}
+ content ) : ( - - + + + + + ); } else if (error) { content = ( - - - - } - body={ -

- - - - ), - }} - /> -

- } - /> + + + + + } + body={ +

+ + + + ), + }} + /> +

+ } + /> +
); } else if (repositories.length === 0) { content = ( - - - - } - body={ - <> -

+ + -

-

- + + } + body={ + <> +

- -

- - } - data-test-subj="emptyPrompt" - /> +

+

+ + + +

+ + } + data-test-subj="emptyPrompt" + /> + ); } else if (snapshots.length === 0) { content = ( - - - - } - body={ - `cluster.${name}`)}> - {({ hasPrivileges }) => - hasPrivileges ? ( - -

- - - - ), - }} - /> -

-

- {policies.length === 0 ? ( - - - - ) : ( - + + + + } + body={ + `cluster.${name}`)} + > + {({ hasPrivileges }) => + hasPrivileges ? ( + +

+ + + + ), + }} + /> +

+

+ {policies.length === 0 ? ( + + + + ) : ( + + + + )} +

+
+ ) : ( + +

+ +

+

+ - - )} -

-
- ) : ( - -

- -

-

- - {' '} - - -

-
- ) - } -
- } - data-test-subj="emptyPrompt" - /> + id="xpack.snapshotRestore.emptyPrompt.noSnapshotsDocLinkText" + defaultMessage="Learn how to create a snapshot" + />{' '} + + +

+
+ ) + } + + } + data-test-subj="emptyPrompt" + /> + ); } else { const repositoryErrorsWarning = Object.keys(errors).length ? ( @@ -322,7 +350,7 @@ export const SnapshotList: React.FunctionComponent +
{repositoryErrorsWarning} - +
); } return ( -
+ <> {repositoryName && snapshotId ? ( ) : null} {content} -
+ ); }; diff --git a/x-pack/plugins/snapshot_restore/public/shared_imports.ts b/x-pack/plugins/snapshot_restore/public/shared_imports.ts index 759453edaba5db..84c195a51950b2 100644 --- a/x-pack/plugins/snapshot_restore/public/shared_imports.ts +++ b/x-pack/plugins/snapshot_restore/public/shared_imports.ts @@ -13,6 +13,7 @@ export { NotAuthorizedSection, SectionError, PageError, + PageLoading, sendRequest, SendRequestConfig, SendRequestResponse, @@ -22,3 +23,5 @@ export { UseRequestConfig, WithPrivileges, } from '../../../../src/plugins/es_ui_shared/public'; + +export { APP_WRAPPER_CLASS } from '../../../../src/core/public'; From ac17ab1436986b37f9d0a3969aff70e728481cf7 Mon Sep 17 00:00:00 2001 From: Esteban Beltran Date: Tue, 29 Jun 2021 08:58:37 +0200 Subject: [PATCH 067/227] Add signal and abort controller to agent metadata and TakeAction button (#103217) --- .../containers/detection_engine/alerts/api.ts | 10 ++++++++-- .../alerts/use_host_isolation_status.tsx | 8 +++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts index 05706981a681dc..72a9bf6e84441b 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/api.ts @@ -178,8 +178,14 @@ export const getCaseIdsFromAlertId = async ({ * * @param host id */ -export const getHostMetadata = async ({ agentId }: { agentId: string }): Promise => +export const getHostMetadata = async ({ + agentId, + signal, +}: { + agentId: string; + signal?: AbortSignal; +}): Promise => KibanaServices.get().http.fetch( resolvePathVariables(HOST_METADATA_GET_ROUTE, { id: agentId }), - { method: 'get' } + { method: 'GET', signal } ); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx index 3bdd8c98137852..259a377b10b796 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/alerts/use_host_isolation_status.tsx @@ -38,18 +38,23 @@ export const useHostIsolationStatus = ({ const { addError } = useAppToasts(); useEffect(() => { + const abortCtrl = new AbortController(); // isMounted tracks if a component is mounted before changing state let isMounted = true; let fleetAgentId: string; const fetchData = async () => { try { - const metadataResponse = await getHostMetadata({ agentId }); + const metadataResponse = await getHostMetadata({ agentId, signal: abortCtrl.signal }); if (isMounted) { setIsIsolated(isEndpointHostIsolated(metadataResponse.metadata)); setAgentStatus(metadataResponse.host_status); fleetAgentId = metadataResponse.metadata.elastic.agent.id; } } catch (error) { + // don't show self-aborted requests errors to the user + if (error.name === 'AbortError') { + return; + } addError(error.message, { title: ISOLATION_STATUS_FAILURE }); } @@ -80,6 +85,7 @@ export const useHostIsolationStatus = ({ return () => { // updates to show component is unmounted isMounted = false; + abortCtrl.abort(); }; }, [addError, agentId]); return { loading, isIsolated, agentStatus, pendingIsolation, pendingUnisolation }; From 4f63abc1e51710bb1ef8f3ba11b1059af51bbba4 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 29 Jun 2021 10:19:50 +0200 Subject: [PATCH 068/227] [Lens] Do not persist time zone (#102735) --- .../indexpattern_datasource/loader.test.ts | 2 +- .../definitions/date_histogram.test.tsx | 135 +----------------- .../operations/definitions/date_histogram.tsx | 48 ++----- .../operations/layer_helpers.test.ts | 11 +- .../embeddable/lens_embeddable_factory.ts | 15 +- .../server/migrations/common_migrations.ts | 36 ++++- .../saved_object_migrations.test.ts | 92 ++++++++++++ .../migrations/saved_object_migrations.ts | 18 ++- .../plugins/lens/server/migrations/types.ts | 65 +++++++++ 9 files changed, 248 insertions(+), 174 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts index 192f3d3c0c5359..d58d9e593e101d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/loader.test.ts @@ -770,7 +770,7 @@ describe('loader', () => { label: 'My hist', operationType: 'date_histogram', params: { - interval: '1d', + interval: 'm', }, sourceField: 'timestamp', }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx index 28325c8d2b6016..3b7554d8110f85 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.test.tsx @@ -176,30 +176,6 @@ describe('date_histogram', () => { }); expect(column.params.interval).toEqual('auto'); }); - - it('should create column object with restrictions', () => { - const column = dateHistogramOperation.buildColumn({ - layer: { columns: {}, columnOrder: [], indexPatternId: '' }, - indexPattern: createMockedIndexPattern(), - field: { - name: 'timestamp', - displayName: 'timestampLabel', - type: 'date', - esTypes: ['date'], - aggregatable: true, - searchable: true, - aggregationRestrictions: { - date_histogram: { - agg: 'date_histogram', - time_zone: 'UTC', - calendar_interval: '1y', - }, - }, - }, - }); - expect(column.params.interval).toEqual('1y'); - expect(column.params.timeZone).toEqual('UTC'); - }); }); describe('toEsAggsFn', () => { @@ -223,7 +199,7 @@ describe('date_histogram', () => { ); }); - it('should not use normalized es interval for rollups', () => { + it('should use restricted time zone and omit use normalized es interval for rollups', () => { const esAggsFn = dateHistogramOperation.toEsAggsFn( layer.columns.col1 as DateHistogramIndexPatternColumn, 'col1', @@ -271,6 +247,7 @@ describe('date_histogram', () => { arguments: expect.objectContaining({ interval: ['42w'], field: ['timestamp'], + time_zone: ['UTC'], useNormalizedEsInterval: [false], }), }) @@ -320,114 +297,6 @@ describe('date_histogram', () => { }); }); - describe('transfer', () => { - it('should adjust interval and time zone params if that is necessary due to restrictions', () => { - const transferedColumn = dateHistogramOperation.transfer!( - { - dataType: 'date', - isBucketed: true, - label: '', - operationType: 'date_histogram', - sourceField: 'dateField', - params: { - interval: 'd', - }, - }, - { - title: '', - id: '', - hasRestrictions: true, - fields: [ - { - name: 'dateField', - displayName: 'dateField', - type: 'date', - aggregatable: true, - searchable: true, - aggregationRestrictions: { - date_histogram: { - agg: 'date_histogram', - time_zone: 'CET', - calendar_interval: 'w', - }, - }, - }, - ], - getFieldByName: getFieldByNameFactory([ - { - name: 'dateField', - displayName: 'dateField', - type: 'date', - aggregatable: true, - searchable: true, - aggregationRestrictions: { - date_histogram: { - agg: 'date_histogram', - time_zone: 'CET', - calendar_interval: 'w', - }, - }, - }, - ]), - } - ); - expect(transferedColumn).toEqual( - expect.objectContaining({ - params: { - interval: 'w', - timeZone: 'CET', - }, - }) - ); - }); - - it('should retain interval', () => { - const transferedColumn = dateHistogramOperation.transfer!( - { - dataType: 'date', - isBucketed: true, - label: '', - operationType: 'date_histogram', - sourceField: 'dateField', - params: { - interval: '20s', - }, - }, - { - title: '', - id: '', - hasRestrictions: false, - fields: [ - { - name: 'dateField', - displayName: 'dateField', - type: 'date', - aggregatable: true, - searchable: true, - }, - ], - getFieldByName: getFieldByNameFactory([ - { - name: 'dateField', - displayName: 'dateField', - type: 'date', - aggregatable: true, - searchable: true, - }, - ]), - } - ); - expect(transferedColumn).toEqual( - expect.objectContaining({ - params: { - interval: '20s', - timeZone: undefined, - }, - }) - ); - }); - }); - describe('param editor', () => { it('should render current value', () => { const updateLayerSpy = jest.fn(); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx index a645079c7b9f8f..0091c43601202b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx @@ -45,7 +45,6 @@ export interface DateHistogramIndexPatternColumn extends FieldBasedIndexPatternC operationType: 'date_histogram'; params: { interval: string; - timeZone?: string; }; } @@ -106,12 +105,6 @@ export const dateHistogramOperation: OperationDefinition< }, getDefaultLabel: (column, indexPattern) => getSafeName(column.sourceField, indexPattern), buildColumn({ field }, columnParams) { - let interval = columnParams?.interval ?? autoInterval; - let timeZone: string | undefined; - if (field.aggregationRestrictions && field.aggregationRestrictions.date_histogram) { - interval = restrictedInterval(field.aggregationRestrictions) as string; - timeZone = field.aggregationRestrictions.date_histogram.time_zone; - } return { label: field.displayName, dataType: 'date', @@ -120,8 +113,7 @@ export const dateHistogramOperation: OperationDefinition< isBucketed: true, scale: 'interval', params: { - interval, - timeZone, + interval: columnParams?.interval ?? autoInterval, }, }; }, @@ -135,28 +127,6 @@ export const dateHistogramOperation: OperationDefinition< (!newField.aggregationRestrictions || newField.aggregationRestrictions.date_histogram) ); }, - transfer: (column, newIndexPattern) => { - const newField = newIndexPattern.getFieldByName(column.sourceField); - - if (newField?.aggregationRestrictions?.date_histogram) { - const restrictions = newField.aggregationRestrictions.date_histogram; - - return { - ...column, - params: { - ...column.params, - timeZone: restrictions.time_zone, - // TODO this rewrite logic is simplified - if the current interval is a multiple of - // the restricted interval, we could carry it over directly. However as the current - // UI does not allow to select multiples of an interval anyway, this is not included yet. - // If the UI allows to pick more complicated intervals, this should be re-visited. - interval: restrictedInterval(newField.aggregationRestrictions) as string, - }, - }; - } - - return column; - }, onFieldChange: (oldColumn, field) => { return { ...oldColumn, @@ -166,14 +136,24 @@ export const dateHistogramOperation: OperationDefinition< }, toEsAggsFn: (column, columnId, indexPattern) => { const usedField = indexPattern.getFieldByName(column.sourceField); + let timeZone: string | undefined; + let interval = column.params?.interval ?? autoInterval; + if ( + usedField && + usedField.aggregationRestrictions && + usedField.aggregationRestrictions.date_histogram + ) { + interval = restrictedInterval(usedField.aggregationRestrictions) as string; + timeZone = usedField.aggregationRestrictions.date_histogram.time_zone; + } return buildExpressionFunction('aggDateHistogram', { id: columnId, enabled: true, schema: 'segment', field: column.sourceField, - time_zone: column.params.timeZone, + time_zone: timeZone, useNormalizedEsInterval: !usedField?.aggregationRestrictions?.date_histogram, - interval: column.params.interval, + interval, drop_partials: false, min_doc_count: 0, extended_bounds: JSON.stringify({}), @@ -244,7 +224,7 @@ export const dateHistogramOperation: OperationDefinition< id="xpack.lens.indexPattern.dateHistogram.restrictedInterval" defaultMessage="Interval fixed to {intervalValue} due to aggregation restrictions." values={{ - intervalValue: currentColumn.params.interval, + intervalValue: restrictedInterval(field!.aggregationRestrictions), }} /> ) : ( diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts index 9eedae6d82d430..ef1de43ad06ed8 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts @@ -25,6 +25,7 @@ import { documentField } from '../document_field'; import { getFieldByNameFactory } from '../pure_helpers'; import { generateId } from '../../id_generator'; import { createMockedFullReference, createMockedManagedReference } from './mocks'; +import { IndexPatternColumn, OperationDefinition } from './definitions'; import { TinymathAST } from 'packages/kbn-tinymath'; jest.mock('../operations'); @@ -2642,7 +2643,15 @@ describe('state_helpers', () => { }); }); + // no operation currently requires this check, faking a transfer function to check whether the generic logic works it('should rewrite column params if that is necessary due to restrictions', () => { + operationDefinitionMap.date_histogram.transfer = ((oldColumn) => ({ + ...oldColumn, + params: { + ...oldColumn.params, + interval: 'w', + }, + })) as OperationDefinition['transfer']; const layer: IndexPatternLayer = { columnOrder: ['col1', 'col2'], columns: { @@ -2666,10 +2675,10 @@ describe('state_helpers', () => { ...layer.columns.col1, params: { interval: 'w', - timeZone: 'CET', }, }, }); + delete operationDefinitionMap.date_histogram.transfer; }); it('should remove operations referencing fields with wrong field types', () => { diff --git a/x-pack/plugins/lens/server/embeddable/lens_embeddable_factory.ts b/x-pack/plugins/lens/server/embeddable/lens_embeddable_factory.ts index ddc822f37b95bf..4f21378cc81155 100644 --- a/x-pack/plugins/lens/server/embeddable/lens_embeddable_factory.ts +++ b/x-pack/plugins/lens/server/embeddable/lens_embeddable_factory.ts @@ -8,8 +8,11 @@ import { EmbeddableRegistryDefinition } from 'src/plugins/embeddable/server'; import { SerializableState } from '../../../../../src/plugins/kibana_utils/common'; import { DOC_TYPE } from '../../common'; -import { commonRenameOperationsForFormula } from '../migrations/common_migrations'; -import { LensDocShapePre712 } from '../migrations/types'; +import { + commonRemoveTimezoneDateHistogramParam, + commonRenameOperationsForFormula, +} from '../migrations/common_migrations'; +import { LensDocShape713, LensDocShapePre712 } from '../migrations/types'; export const lensEmbeddableFactory = (): EmbeddableRegistryDefinition => { return { @@ -24,6 +27,14 @@ export const lensEmbeddableFactory = (): EmbeddableRegistryDefinition => { attributes: migratedLensState, } as unknown) as SerializableState; }, + '7.14.0': (state) => { + const lensState = (state as unknown) as { attributes: LensDocShape713 }; + const migratedLensState = commonRemoveTimezoneDateHistogramParam(lensState.attributes); + return ({ + ...lensState, + attributes: migratedLensState, + } as unknown) as SerializableState; + }, }, }; }; diff --git a/x-pack/plugins/lens/server/migrations/common_migrations.ts b/x-pack/plugins/lens/server/migrations/common_migrations.ts index 85055e471bac95..db19de7fd9c07f 100644 --- a/x-pack/plugins/lens/server/migrations/common_migrations.ts +++ b/x-pack/plugins/lens/server/migrations/common_migrations.ts @@ -6,7 +6,13 @@ */ import { cloneDeep } from 'lodash'; -import { LensDocShapePre712, OperationTypePre712, LensDocShapePost712 } from './types'; +import { + LensDocShapePre712, + OperationTypePre712, + LensDocShapePost712, + LensDocShape713, + LensDocShape714, +} from './types'; export const commonRenameOperationsForFormula = ( attributes: LensDocShapePre712 @@ -44,3 +50,31 @@ export const commonRenameOperationsForFormula = ( ); return newAttributes as LensDocShapePost712; }; + +export const commonRemoveTimezoneDateHistogramParam = ( + attributes: LensDocShape713 +): LensDocShape714 => { + const newAttributes = cloneDeep(attributes); + const datasourceLayers = newAttributes.state.datasourceStates.indexpattern.layers || {}; + (newAttributes as LensDocShapePost712).state.datasourceStates.indexpattern.layers = Object.fromEntries( + Object.entries(datasourceLayers).map(([layerId, layer]) => { + return [ + layerId, + { + ...layer, + columns: Object.fromEntries( + Object.entries(layer.columns).map(([columnId, column]) => { + if (column.operationType === 'date_histogram' && 'params' in column) { + const copy = { ...column, params: { ...column.params } }; + delete copy.params.timeZone; + return [columnId, copy]; + } + return [columnId, column]; + }) + ), + }, + ]; + }) + ); + return newAttributes as LensDocShapePost712; +}; diff --git a/x-pack/plugins/lens/server/migrations/saved_object_migrations.test.ts b/x-pack/plugins/lens/server/migrations/saved_object_migrations.test.ts index 5478d86e9b14c7..9daae1d184ab63 100644 --- a/x-pack/plugins/lens/server/migrations/saved_object_migrations.test.ts +++ b/x-pack/plugins/lens/server/migrations/saved_object_migrations.test.ts @@ -852,4 +852,96 @@ describe('Lens migrations', () => { validate(result2); }); }); + + describe('7.14.0 remove time zone from date histogram', () => { + const context = ({ log: { warning: () => {} } } as unknown) as SavedObjectMigrationContext; + const example = { + type: 'lens', + id: 'mocked-saved-object-id', + attributes: { + savedObjectId: '1', + title: 'MyRenamedOps', + description: '', + visualizationType: 'lnsXY', + state: { + datasourceStates: { + indexpattern: { + layers: { + '2': { + columns: { + '3': { + label: '@timestamp', + dataType: 'date', + operationType: 'date_histogram', + sourceField: '@timestamp', + isBucketed: true, + scale: 'interval', + params: { interval: 'auto', timeZone: 'Europe/Berlin' }, + }, + '4': { + label: '@timestamp', + dataType: 'date', + operationType: 'date_histogram', + sourceField: '@timestamp', + isBucketed: true, + scale: 'interval', + params: { interval: 'auto' }, + }, + '5': { + label: '@timestamp', + dataType: 'date', + operationType: 'my_unexpected_operation', + isBucketed: true, + scale: 'interval', + params: { timeZone: 'do not delete' }, + }, + }, + columnOrder: ['3', '4', '5'], + incompleteColumns: {}, + }, + }, + }, + }, + visualization: { + title: 'Empty XY chart', + legend: { isVisible: true, position: 'right' }, + valueLabels: 'hide', + preferredSeriesType: 'bar_stacked', + layers: [ + { + layerId: '5ab74ddc-93ca-44e2-9857-ecf85c86b53e', + accessors: [ + '5fea2a56-7b73-44b5-9a50-7f0c0c4f8fd0', + 'e5efca70-edb5-4d6d-a30a-79384066987e', + '7ffb7bde-4f42-47ab-b74d-1b4fd8393e0f', + ], + position: 'top', + seriesType: 'bar_stacked', + showGridlines: false, + xAccessor: '2e57a41e-5a52-42d3-877f-bd211d903ef8', + }, + ], + }, + query: { query: '', language: 'kuery' }, + filters: [], + }, + }, + }; + + it('should remove time zone param from date histogram', () => { + const result = migrations['7.14.0'](example, context) as ReturnType< + SavedObjectMigrationFn + >; + const layers = Object.values(result.attributes.state.datasourceStates.indexpattern.layers); + expect(layers.length).toBe(1); + const columns = Object.values(layers[0].columns); + expect(columns.length).toBe(3); + expect(columns[0].operationType).toEqual('date_histogram'); + expect((columns[0] as { params: {} }).params).toEqual({ interval: 'auto' }); + expect(columns[1].operationType).toEqual('date_histogram'); + expect((columns[1] as { params: {} }).params).toEqual({ interval: 'auto' }); + expect(columns[2].operationType).toEqual('my_unexpected_operation'); + expect((columns[2] as { params: {} }).params).toEqual({ timeZone: 'do not delete' }); + }); + }); }); diff --git a/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts b/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts index ba7004ba67a958..efcd6e2e6f3420 100644 --- a/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts +++ b/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts @@ -15,8 +15,11 @@ import { } from 'src/core/server'; import { Query, Filter } from 'src/plugins/data/public'; import { PersistableFilter } from '../../common'; -import { LensDocShapePost712, LensDocShapePre712 } from './types'; -import { commonRenameOperationsForFormula } from './common_migrations'; +import { LensDocShapePost712, LensDocShapePre712, LensDocShape713, LensDocShape714 } from './types'; +import { + commonRenameOperationsForFormula, + commonRemoveTimezoneDateHistogramParam, +} from './common_migrations'; interface LensDocShapePre710 { visualizationType: string | null; @@ -400,6 +403,16 @@ const renameOperationsForFormula: SavedObjectMigrationFn< }; }; +const removeTimezoneDateHistogramParam: SavedObjectMigrationFn = ( + doc +) => { + const newDoc = cloneDeep(doc); + return { + ...newDoc, + attributes: commonRemoveTimezoneDateHistogramParam(newDoc.attributes), + }; +}; + export const migrations: SavedObjectMigrationMap = { '7.7.0': removeInvalidAccessors, // The order of these migrations matter, since the timefield migration relies on the aggConfigs @@ -410,4 +423,5 @@ export const migrations: SavedObjectMigrationMap = { '7.12.0': transformTableState, '7.13.0': renameOperationsForFormula, '7.13.1': renameOperationsForFormula, // duplicate this migration in case a broken by value panel is added to the library + '7.14.0': removeTimezoneDateHistogramParam, }; diff --git a/x-pack/plugins/lens/server/migrations/types.ts b/x-pack/plugins/lens/server/migrations/types.ts index 38e079ff380516..035e1a86b86f8f 100644 --- a/x-pack/plugins/lens/server/migrations/types.ts +++ b/x-pack/plugins/lens/server/migrations/types.ts @@ -87,3 +87,68 @@ export interface LensDocShapePost712 { filters: Filter[]; }; } + +export type LensDocShape713 = Omit & { + state: Omit & { + datasourceStates: { + indexpattern: Omit< + LensDocShapePost712['state']['datasourceStates']['indexpattern'], + 'layers' + > & { + layers: Record< + string, + Omit< + LensDocShapePost712['state']['datasourceStates']['indexpattern']['layers'][string], + 'columns' + > & { + columns: Record< + string, + | { + operationType: OperationTypePost712; + } + | { + operationType: 'date_histogram'; + params: { + interval: string; + timeZone?: string; + }; + } + >; + } + >; + }; + }; + }; +}; + +export type LensDocShape714 = Omit & { + state: Omit & { + datasourceStates: { + indexpattern: Omit< + LensDocShapePost712['state']['datasourceStates']['indexpattern'], + 'layers' + > & { + layers: Record< + string, + Omit< + LensDocShapePost712['state']['datasourceStates']['indexpattern']['layers'][string], + 'columns' + > & { + columns: Record< + string, + | { + operationType: OperationTypePost712; + } + | { + operationType: 'date_histogram'; + params: { + interval: string; + }; + } + >; + } + >; + }; + }; + }; +}; From ce2fabe42084e861af3e9ebeae324be1fcf8ac5b Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 29 Jun 2021 10:31:41 +0200 Subject: [PATCH 069/227] add formula telemetry (#103451) --- .../definitions/formula/editor/formula_editor.tsx | 7 ++++++- x-pack/plugins/lens/server/usage/schema.ts | 4 ++++ .../telemetry_collection_xpack/schema/xpack_plugins.json | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx index 83a782b5192481..d3341ff119574e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx @@ -745,7 +745,12 @@ export function FormulaEditor({ button={ setIsHelpOpen(!isHelpOpen)} + onClick={() => { + if (!isHelpOpen) { + trackUiEvent('open_formula_popover'); + } + setIsHelpOpen(!isHelpOpen); + }} iconType="documentation" color="text" size="s" diff --git a/x-pack/plugins/lens/server/usage/schema.ts b/x-pack/plugins/lens/server/usage/schema.ts index c3608176717c56..cd4c80360a9b6c 100644 --- a/x-pack/plugins/lens/server/usage/schema.ts +++ b/x-pack/plugins/lens/server/usage/schema.ts @@ -14,6 +14,10 @@ const eventsSchema: MakeSchemaFrom = { type: 'long', _meta: { description: 'Number of times the user opened one of the in-product help popovers.' }, }, + open_formula_popover: { + type: 'long', + _meta: { description: 'Number of times the user opened the in-product formula help popover.' }, + }, toggle_fullscreen_formula: { type: 'long', _meta: { diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 5a8b30c5c0f267..89925786636da7 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -2190,6 +2190,10 @@ "description": "Number of times the user opened one of the in-product help popovers." } }, + "open_formula_popover": { + "type": "long", + "_meta": { "description": "Number of times the user opened the in-product formula help popover." } + }, "toggle_fullscreen_formula": { "type": "long", "_meta": { @@ -2425,6 +2429,10 @@ "description": "Number of times the user opened one of the in-product help popovers." } }, + "open_formula_popover": { + "type": "long", + "_meta": { "description": "Number of times the user opened the in-product formula help popover." } + }, "toggle_fullscreen_formula": { "type": "long", "_meta": { From 5c87807da1c472c4398ac2923550a3594e943082 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 29 Jun 2021 10:47:45 +0200 Subject: [PATCH 070/227] [Lens] Remove reference tooltip in Formula panel when the popup is open (#103283) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../formula/editor/formula_editor.tsx | 17 +++++++++++------ .../shared_components/tooltip_wrapper.tsx | 9 +++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx index d3341ff119574e..c83135536343d0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_editor.tsx @@ -24,7 +24,7 @@ import { monaco } from '@kbn/monaco'; import classNames from 'classnames'; import { CodeEditor } from '../../../../../../../../../src/plugins/kibana_react/public'; import type { CodeEditorProps } from '../../../../../../../../../src/plugins/kibana_react/public'; -import { useDebounceWithOptions } from '../../../../../shared_components'; +import { TooltipWrapper, useDebounceWithOptions } from '../../../../../shared_components'; import { ParamEditorProps } from '../../index'; import { getManagedColumnsFrom } from '../../../layer_helpers'; import { ErrorWrapper, runASTValidation, tryToParse } from '../validation'; @@ -729,11 +729,16 @@ export function FormulaEditor({ ) : ( - - + )} diff --git a/x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx b/x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx index f54cb6bd49dba1..0b361c8fa7f1ed 100644 --- a/x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx +++ b/x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx @@ -6,22 +6,23 @@ */ import React from 'react'; -import { EuiToolTip } from '@elastic/eui'; +import { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; -export interface TooltipWrapperProps { +export type TooltipWrapperProps = Partial> & { tooltipContent: string; condition: boolean; -} +}; export const TooltipWrapper: React.FunctionComponent = ({ children, condition, tooltipContent, + ...tooltipProps }) => { return ( <> {condition ? ( - + <>{children} ) : ( From 409a0f21cc4e9abac6ce28a1ae1b06196899aed9 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 29 Jun 2021 11:21:07 +0200 Subject: [PATCH 071/227] [Exploratory view] use percentages in distribution chart (#103080) --- x-pack/plugins/lens/public/index.ts | 3 + .../operations/definitions/index.ts | 1 + .../operations/index.ts | 2 + .../public/indexpattern_datasource/types.ts | 3 + .../configurations/constants/constants.ts | 1 + .../configurations/lens_attributes.test.ts | 209 +++++++++++++++++- .../configurations/lens_attributes.ts | 36 ++- .../lens_columns/overall_column.tsx | 110 +++++++++ .../rum/data_distribution_config.ts | 6 +- .../synthetics/data_distribution_config.ts | 4 +- .../test_data/sample_attribute.ts | 94 +++++++- .../shared/exploratory_view/types.ts | 1 + 12 files changed, 447 insertions(+), 23 deletions(-) create mode 100644 x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_columns/overall_column.tsx diff --git a/x-pack/plugins/lens/public/index.ts b/x-pack/plugins/lens/public/index.ts index a82bc0b9c0d3dd..3054f3787a24c6 100644 --- a/x-pack/plugins/lens/public/index.ts +++ b/x-pack/plugins/lens/public/index.ts @@ -54,6 +54,9 @@ export type { CounterRateIndexPatternColumn, DerivativeIndexPatternColumn, MovingAverageIndexPatternColumn, + FormulaIndexPatternColumn, + MathIndexPatternColumn, + OverallSumIndexPatternColumn, } from './indexpattern_datasource/types'; export type { LensEmbeddableInput } from './editor_frame_service/embeddable'; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts index 246959913c39e2..897777a05efc6d 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts @@ -118,6 +118,7 @@ export { export { CountIndexPatternColumn } from './count'; export { LastValueIndexPatternColumn } from './last_value'; export { RangeIndexPatternColumn } from './ranges'; +export { FormulaIndexPatternColumn, MathIndexPatternColumn } from './formula'; // List of all operation definitions registered to this data source. // If you want to implement a new operation, add the definition to this array and diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/index.ts index d55c5d3c00f179..7899ce9efcedf0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/index.ts @@ -35,4 +35,6 @@ export { OverallMinIndexPatternColumn, OverallMaxIndexPatternColumn, OverallAverageIndexPatternColumn, + FormulaIndexPatternColumn, + MathIndexPatternColumn, } from './definitions'; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/types.ts b/x-pack/plugins/lens/public/indexpattern_datasource/types.ts index f24c39f810b214..1a3451bdb403b4 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/types.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/types.ts @@ -32,6 +32,9 @@ export { CounterRateIndexPatternColumn, DerivativeIndexPatternColumn, MovingAverageIndexPatternColumn, + FormulaIndexPatternColumn, + MathIndexPatternColumn, + OverallSumIndexPatternColumn, } from './operations'; export type DraggedField = DragDropIdentifier & { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts index 52faa2dccaeac7..dd48cf3f7eeb8d 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/constants.ts @@ -49,6 +49,7 @@ import { export const DEFAULT_TIME = { from: 'now-1h', to: 'now' }; export const RECORDS_FIELD = 'Records'; +export const RECORDS_PERCENTAGE_FIELD = 'RecordsPercentage'; export const FieldLabels: Record = { 'user_agent.name': BROWSER_FAMILY_LABEL, diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts index 72b4bd7919c3e7..0be64677586c1a 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.test.ts @@ -70,13 +70,23 @@ describe('Lens Attribute', () => { }); it('should return main y axis', function () { - expect(lnsAttr.getMainYAxis(layerConfig)).toEqual({ + expect(lnsAttr.getMainYAxis(layerConfig, 'layer0', '')).toEqual({ dataType: 'number', isBucketed: false, label: 'Pages loaded', - operationType: 'count', + operationType: 'formula', + params: { + format: { + id: 'percent', + params: { + decimals: 0, + }, + }, + formula: 'count() / overall_sum(count())', + isFormulaBroken: false, + }, + references: ['y-axis-column-layer0X4'], scale: 'ratio', - sourceField: 'Records', }); }); @@ -230,7 +240,15 @@ describe('Lens Attribute', () => { it('should return first layer', function () { expect(lnsAttr.getLayers()).toEqual({ layer0: { - columnOrder: ['x-axis-column-layer0', 'y-axis-column-layer0'], + columnOrder: [ + 'x-axis-column-layer0', + 'y-axis-column-layer0', + 'y-axis-column-layer0X0', + 'y-axis-column-layer0X1', + 'y-axis-column-layer0X2', + 'y-axis-column-layer0X3', + 'y-axis-column-layer0X4', + ], columns: { 'x-axis-column-layer0': { dataType: 'number', @@ -253,16 +271,98 @@ describe('Lens Attribute', () => { }, 'y-axis-column-layer0': { dataType: 'number', + filter: { + language: 'kuery', + query: + 'transaction.type: page-load and processor.event: transaction and transaction.type : *', + }, isBucketed: false, label: 'Pages loaded', + operationType: 'formula', + params: { + format: { + id: 'percent', + params: { + decimals: 0, + }, + }, + formula: + "count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *') / overall_sum(count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *'))", + isFormulaBroken: false, + }, + references: ['y-axis-column-layer0X4'], + scale: 'ratio', + }, + 'y-axis-column-layer0X0': { + customLabel: true, + dataType: 'number', + filter: { + language: 'kuery', + query: + 'transaction.type: page-load and processor.event: transaction and transaction.type : *', + }, + isBucketed: false, + label: 'Part of count() / overall_sum(count())', operationType: 'count', scale: 'ratio', sourceField: 'Records', + }, + 'y-axis-column-layer0X1': { + customLabel: true, + dataType: 'number', filter: { language: 'kuery', query: 'transaction.type: page-load and processor.event: transaction and transaction.type : *', }, + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'count', + scale: 'ratio', + sourceField: 'Records', + }, + 'y-axis-column-layer0X2': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'math', + params: { + tinymathAst: 'y-axis-column-layer0X1', + }, + references: ['y-axis-column-layer0X1'], + scale: 'ratio', + }, + 'y-axis-column-layer0X3': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'overall_sum', + references: ['y-axis-column-layer0X2'], + scale: 'ratio', + }, + 'y-axis-column-layer0X4': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'math', + params: { + tinymathAst: { + args: ['y-axis-column-layer0X0', 'y-axis-column-layer0X3'], + location: { + max: 30, + min: 0, + }, + name: 'divide', + text: + "count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *') / overall_sum(count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *'))", + type: 'function', + }, + }, + references: ['y-axis-column-layer0X0', 'y-axis-column-layer0X3'], + scale: 'ratio', }, }, incompleteColumns: {}, @@ -326,7 +426,16 @@ describe('Lens Attribute', () => { ]); expect(lnsAttr.layers.layer0).toEqual({ - columnOrder: ['x-axis-column-layer0', 'breakdown-column-layer0', 'y-axis-column-layer0'], + columnOrder: [ + 'x-axis-column-layer0', + 'breakdown-column-layer0', + 'y-axis-column-layer0', + 'y-axis-column-layer0X0', + 'y-axis-column-layer0X1', + 'y-axis-column-layer0X2', + 'y-axis-column-layer0X3', + 'y-axis-column-layer0X4', + ], columns: { 'breakdown-column-layer0': { dataType: 'string', @@ -353,7 +462,13 @@ describe('Lens Attribute', () => { operationType: 'range', params: { maxBars: 'auto', - ranges: [{ from: 0, label: '', to: 1000 }], + ranges: [ + { + from: 0, + label: '', + to: 1000, + }, + ], type: 'histogram', }, scale: 'interval', @@ -361,16 +476,98 @@ describe('Lens Attribute', () => { }, 'y-axis-column-layer0': { dataType: 'number', + filter: { + language: 'kuery', + query: + 'transaction.type: page-load and processor.event: transaction and transaction.type : *', + }, isBucketed: false, label: 'Pages loaded', + operationType: 'formula', + params: { + format: { + id: 'percent', + params: { + decimals: 0, + }, + }, + formula: + "count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *') / overall_sum(count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *'))", + isFormulaBroken: false, + }, + references: ['y-axis-column-layer0X4'], + scale: 'ratio', + }, + 'y-axis-column-layer0X0': { + customLabel: true, + dataType: 'number', + filter: { + language: 'kuery', + query: + 'transaction.type: page-load and processor.event: transaction and transaction.type : *', + }, + isBucketed: false, + label: 'Part of count() / overall_sum(count())', operationType: 'count', scale: 'ratio', sourceField: 'Records', + }, + 'y-axis-column-layer0X1': { + customLabel: true, + dataType: 'number', filter: { language: 'kuery', query: 'transaction.type: page-load and processor.event: transaction and transaction.type : *', }, + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'count', + scale: 'ratio', + sourceField: 'Records', + }, + 'y-axis-column-layer0X2': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'math', + params: { + tinymathAst: 'y-axis-column-layer0X1', + }, + references: ['y-axis-column-layer0X1'], + scale: 'ratio', + }, + 'y-axis-column-layer0X3': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'overall_sum', + references: ['y-axis-column-layer0X2'], + scale: 'ratio', + }, + 'y-axis-column-layer0X4': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'math', + params: { + tinymathAst: { + args: ['y-axis-column-layer0X0', 'y-axis-column-layer0X3'], + location: { + max: 30, + min: 0, + }, + name: 'divide', + text: + "count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *') / overall_sum(count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *'))", + type: 'function', + }, + }, + references: ['y-axis-column-layer0X0', 'y-axis-column-layer0X3'], + scale: 'ratio', }, }, incompleteColumns: {}, diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts index eaf9c1c884a9d0..5734cd15926921 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_attributes.ts @@ -35,10 +35,13 @@ import { USE_BREAK_DOWN_COLUMN, TERMS_COLUMN, REPORT_METRIC_FIELD, + RECORDS_FIELD, + RECORDS_PERCENTAGE_FIELD, } from './constants'; import { ColumnFilter, SeriesConfig, UrlFilter, URLReportDefinition } from '../types'; import { PersistableFilter } from '../../../../../../lens/common'; import { parseAbsoluteDate } from '../series_date_picker/date_range_picker'; +import { getDistributionInPercentageColumn } from './lens_columns/overall_column'; function getLayerReferenceName(layerId: string) { return `indexpattern-datasource-layer-${layerId}`; @@ -339,7 +342,7 @@ export class LensAttributes { return this.getTermsColumn(fieldName, columnLabel || label); } - if (fieldName === 'Records' || columnType === FILTER_RECORDS) { + if (fieldName === RECORDS_FIELD || columnType === FILTER_RECORDS) { return this.getRecordsColumn( columnLabel || label, colIndex !== undefined ? columnFilters?.[colIndex] : undefined, @@ -396,10 +399,14 @@ export class LensAttributes { } } - getMainYAxis(layerConfig: LayerConfig) { + getMainYAxis(layerConfig: LayerConfig, layerId: string, columnFilter: string) { const { sourceField, operationType, label } = layerConfig.seriesConfig.yAxisColumns[0]; - if (sourceField === 'Records' || !sourceField) { + if (sourceField === RECORDS_PERCENTAGE_FIELD) { + return getDistributionInPercentageColumn({ label, layerId, columnFilter }).main; + } + + if (sourceField === RECORDS_FIELD || !sourceField) { return this.getRecordsColumn(label); } @@ -412,9 +419,16 @@ export class LensAttributes { }); } - getChildYAxises(layerConfig: LayerConfig) { + getChildYAxises(layerConfig: LayerConfig, layerId?: string, columnFilter?: string) { const lensColumns: Record = {}; const yAxisColumns = layerConfig.seriesConfig.yAxisColumns; + const { sourceField: mainSourceField, label: mainLabel } = yAxisColumns[0]; + + if (mainSourceField === RECORDS_PERCENTAGE_FIELD && layerId) { + return getDistributionInPercentageColumn({ label: mainLabel, layerId, columnFilter }) + .supportingColumns; + } + // 1 means there is only main y axis if (yAxisColumns.length === 1) { return lensColumns; @@ -444,7 +458,7 @@ export class LensAttributes { label: label || 'Count of records', operationType: 'count', scale: 'ratio', - sourceField: 'Records', + sourceField: RECORDS_FIELD, filter: columnFilter, ...(timeScale ? { timeScale } : {}), } as CountIndexPatternColumn; @@ -546,13 +560,13 @@ export class LensAttributes { const layerId = `layer${index}`; const columnFilter = this.getLayerFilters(layerConfig, layerConfigs.length); const timeShift = this.getTimeShift(this.layerConfigs[0], layerConfig, index); - const mainYAxis = this.getMainYAxis(layerConfig); + const mainYAxis = this.getMainYAxis(layerConfig, layerId, columnFilter); layers[layerId] = { columnOrder: [ `x-axis-column-${layerId}`, ...(breakdown ? [`breakdown-column-${layerId}`] : []), `y-axis-column-${layerId}`, - ...Object.keys(this.getChildYAxises(layerConfig)), + ...Object.keys(this.getChildYAxises(layerConfig, layerId, columnFilter)), ], columns: { [`x-axis-column-${layerId}`]: this.getXAxis(layerConfig, layerId), @@ -572,7 +586,7 @@ export class LensAttributes { }), } : {}), - ...this.getChildYAxises(layerConfig), + ...this.getChildYAxises(layerConfig, layerId, columnFilter), }, incompleteColumns: {}, }; @@ -611,13 +625,13 @@ export class LensAttributes { }; } - parseFilters() {} - getJSON(): TypedLensByValueInput['attributes'] { const uniqueIndexPatternsIds = Array.from( new Set([...this.layerConfigs.map(({ indexPattern }) => indexPattern.id)]) ); + const query = this.layerConfigs[0].seriesConfig.query; + return { title: 'Prefilled from exploratory view app', description: '', @@ -641,7 +655,7 @@ export class LensAttributes { }, }, visualization: this.visualization, - query: { query: '', language: 'kuery' }, + query: query || { query: '', language: 'kuery' }, filters: [], }, }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_columns/overall_column.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_columns/overall_column.tsx new file mode 100644 index 00000000000000..05764517bc36f5 --- /dev/null +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/lens_columns/overall_column.tsx @@ -0,0 +1,110 @@ +/* + * 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 type { TinymathAST } from '@kbn/tinymath'; +import { + DataType, + CountIndexPatternColumn, + MathIndexPatternColumn, + FormulaIndexPatternColumn, + OverallSumIndexPatternColumn, +} from '../../../../../../../lens/public'; + +export function getDistributionInPercentageColumn({ + label, + layerId, + columnFilter, +}: { + label?: string; + columnFilter?: string; + layerId: string; +}) { + const yAxisColId = `y-axis-column-${layerId}`; + + let lensFormula = 'count() / overall_sum(count())'; + + if (columnFilter) { + lensFormula = `count(kql='${columnFilter}') / overall_sum(count(kql='${columnFilter}'))`; + } + + const main: FormulaIndexPatternColumn = { + label: label || 'Percentage of records', + dataType: 'number' as DataType, + operationType: 'formula', + isBucketed: false, + scale: 'ratio', + params: { + formula: lensFormula, + isFormulaBroken: false, + format: { id: 'percent', params: { decimals: 0 } }, + }, + references: [`${yAxisColId}X4`], + }; + + const countColumn: CountIndexPatternColumn = { + label: 'Part of count() / overall_sum(count())', + dataType: 'number', + operationType: 'count', + isBucketed: false, + scale: 'ratio', + sourceField: 'Records', + customLabel: true, + filter: { query: columnFilter ?? '', language: 'kuery' }, + }; + + const mathColumn: MathIndexPatternColumn = { + label: 'Part of count() / overall_sum(count())', + dataType: 'number', + operationType: 'math', + isBucketed: false, + scale: 'ratio', + params: { tinymathAst: `${yAxisColId}X1` }, + references: [`${yAxisColId}X1`], + customLabel: true, + }; + + const overAllSumColumn: OverallSumIndexPatternColumn = { + label: 'Part of count() / overall_sum(count())', + dataType: 'number', + operationType: 'overall_sum', + isBucketed: false, + scale: 'ratio', + references: [`${yAxisColId}X2`], + customLabel: true, + }; + + const tinyMathColumn: MathIndexPatternColumn = { + label: 'Part of count() / overall_sum(count())', + dataType: 'number', + operationType: 'math', + isBucketed: false, + scale: 'ratio', + params: { + tinymathAst: ({ + type: 'function', + name: 'divide', + args: [`${yAxisColId}X0`, `${yAxisColId}X3`], + location: { min: 0, max: 30 }, + text: lensFormula, + } as unknown) as TinymathAST, + }, + references: [`${yAxisColId}X0`, `${yAxisColId}X3`], + customLabel: true, + }; + + const supportingColumns: Record< + string, + CountIndexPatternColumn | MathIndexPatternColumn | OverallSumIndexPatternColumn + > = { + [`${yAxisColId}X0`]: countColumn, + [`${yAxisColId}X1`]: countColumn, + [`${yAxisColId}X2`]: mathColumn, + [`${yAxisColId}X3`]: overAllSumColumn, + [`${yAxisColId}X4`]: tinyMathColumn, + }; + + return { main, supportingColumns }; +} diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts index b171edf2901d58..f34c8db6c197d6 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/rum/data_distribution_config.ts @@ -6,7 +6,7 @@ */ import { ConfigProps, SeriesConfig } from '../../types'; -import { FieldLabels, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; +import { FieldLabels, REPORT_METRIC_FIELD, RECORDS_PERCENTAGE_FIELD } from '../constants'; import { buildPhraseFilter } from '../utils'; import { CLIENT_GEO_COUNTRY_NAME, @@ -49,7 +49,7 @@ export function getRumDistributionConfig({ indexPattern }: ConfigProps): SeriesC }, yAxisColumns: [ { - sourceField: RECORDS_FIELD, + sourceField: RECORDS_PERCENTAGE_FIELD, label: PAGES_LOADED_LABEL, }, ], @@ -91,5 +91,7 @@ export function getRumDistributionConfig({ indexPattern }: ConfigProps): SeriesC [SERVICE_NAME]: WEB_APPLICATION_LABEL, [TRANSACTION_DURATION]: PAGE_LOAD_TIME_LABEL, }, + // rum page load transactions are always less then 60 seconds + query: { query: 'transaction.duration.us < 60000000', language: 'kuery' }, }; } diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts index 9783f63f5b9017..2522f0b2c2581d 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts @@ -6,7 +6,7 @@ */ import { ConfigProps, SeriesConfig } from '../../types'; -import { FieldLabels, RECORDS_FIELD, REPORT_METRIC_FIELD } from '../constants'; +import { FieldLabels, REPORT_METRIC_FIELD, RECORDS_PERCENTAGE_FIELD } from '../constants'; import { buildExistsFilter } from '../utils'; import { MONITORS_DURATION_LABEL, PINGS_LABEL } from '../constants/labels'; @@ -23,7 +23,7 @@ export function getSyntheticsDistributionConfig({ }, yAxisColumns: [ { - sourceField: RECORDS_FIELD, + sourceField: RECORDS_PERCENTAGE_FIELD, label: PINGS_LABEL, }, ], diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute.ts index edf2a424158205..569d68ad4ebffd 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/test_data/sample_attribute.ts @@ -17,7 +17,15 @@ export const sampleAttribute = { indexpattern: { layers: { layer0: { - columnOrder: ['x-axis-column-layer0', 'y-axis-column-layer0'], + columnOrder: [ + 'x-axis-column-layer0', + 'y-axis-column-layer0', + 'y-axis-column-layer0X0', + 'y-axis-column-layer0X1', + 'y-axis-column-layer0X2', + 'y-axis-column-layer0X3', + 'y-axis-column-layer0X4', + ], columns: { 'x-axis-column-layer0': { sourceField: 'transaction.duration.us', @@ -34,8 +42,47 @@ export const sampleAttribute = { }, 'y-axis-column-layer0': { dataType: 'number', + filter: { + language: 'kuery', + query: + 'transaction.type: page-load and processor.event: transaction and transaction.type : *', + }, isBucketed: false, label: 'Pages loaded', + operationType: 'formula', + params: { + format: { + id: 'percent', + params: { + decimals: 0, + }, + }, + formula: + "count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *') / overall_sum(count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *'))", + isFormulaBroken: false, + }, + references: ['y-axis-column-layer0X4'], + scale: 'ratio', + }, + 'y-axis-column-layer0X0': { + customLabel: true, + dataType: 'number', + filter: { + language: 'kuery', + query: + 'transaction.type: page-load and processor.event: transaction and transaction.type : *', + }, + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'count', + scale: 'ratio', + sourceField: 'Records', + }, + 'y-axis-column-layer0X1': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', operationType: 'count', scale: 'ratio', sourceField: 'Records', @@ -45,6 +92,49 @@ export const sampleAttribute = { 'transaction.type: page-load and processor.event: transaction and transaction.type : *', }, }, + 'y-axis-column-layer0X2': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'math', + params: { + tinymathAst: 'y-axis-column-layer0X1', + }, + references: ['y-axis-column-layer0X1'], + scale: 'ratio', + }, + 'y-axis-column-layer0X3': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'overall_sum', + references: ['y-axis-column-layer0X2'], + scale: 'ratio', + }, + 'y-axis-column-layer0X4': { + customLabel: true, + dataType: 'number', + isBucketed: false, + label: 'Part of count() / overall_sum(count())', + operationType: 'math', + params: { + tinymathAst: { + args: ['y-axis-column-layer0X0', 'y-axis-column-layer0X3'], + location: { + max: 30, + min: 0, + }, + name: 'divide', + text: + "count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *') / overall_sum(count(kql='transaction.type: page-load and processor.event: transaction and transaction.type : *'))", + type: 'function', + }, + }, + references: ['y-axis-column-layer0X0', 'y-axis-column-layer0X3'], + scale: 'ratio', + }, }, incompleteColumns: {}, }, @@ -70,7 +160,7 @@ export const sampleAttribute = { }, ], }, - query: { query: '', language: 'kuery' }, + query: { query: 'transaction.duration.us < 60000000', language: 'kuery' }, filters: [], }, }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts index ad7c654c9a168d..717d98715453de 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts @@ -63,6 +63,7 @@ export interface SeriesConfig { palette?: PaletteOutput; yTitle?: string; yConfig?: YConfig[]; + query?: { query: string; language: 'kuery' }; } export type URLReportDefinition = Record; From b774e37ea14bb2860a351994b5d69ca5d38d2f4c Mon Sep 17 00:00:00 2001 From: Pete Hampton Date: Tue, 29 Jun 2021 10:22:11 +0100 Subject: [PATCH 072/227] Update security telemetry allowlist. (#103471) --- .../security_solution/server/lib/telemetry/sender.test.ts | 4 ++++ .../plugins/security_solution/server/lib/telemetry/sender.ts | 2 ++ 2 files changed, 6 insertions(+) diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts index f620027409d265..e6a53e520ee011 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender.test.ts @@ -41,6 +41,7 @@ describe('TelemetryEventsSender', () => { version: '100', }, file: { + extension: '.exe', size: 3, created: 0, path: 'X', @@ -72,6 +73,7 @@ describe('TelemetryEventsSender', () => { name: 'foo.exe', nope: 'nope', executable: null, // null fields are never allowlisted + working_directory: '/some/usr/dir', }, Target: { process: { @@ -101,6 +103,7 @@ describe('TelemetryEventsSender', () => { version: '100', }, file: { + extension: '.exe', size: 3, created: 0, path: 'X', @@ -126,6 +129,7 @@ describe('TelemetryEventsSender', () => { }, process: { name: 'foo.exe', + working_directory: '/some/usr/dir', }, Target: { process: { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts index 2b3c002a9b2aeb..4f552b3edcda4a 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts @@ -307,6 +307,7 @@ const allowlistProcessFields: AllowlistFields = { }, }, thread: true, + working_directory: true, }; // Allow list for event-related fields, which can also be nested under events[] @@ -322,6 +323,7 @@ const allowlistBaseEventFields: AllowlistFields = { }, event: true, file: { + extension: true, name: true, path: true, size: true, From 824463ace594b090ff49309ba082fd25ffa48c3c Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Tue, 29 Jun 2021 10:28:51 +0100 Subject: [PATCH 073/227] [ML] Fixing categorization tokens for multi-line messages (#103007) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../models/job_service/new_job/categorization/examples.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts b/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts index 5fecb3d9eb1ec4..abda62097dfb7b 100644 --- a/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts +++ b/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts @@ -145,10 +145,11 @@ export function categorizationExamplesProvider({ for (let g = 0; g < sumLengths.length; g++) { if (t.start_offset <= sumLengths[g] + g) { const offset = g > 0 ? sumLengths[g - 1] + g : 0; + const start = t.start_offset - offset; tokensPerExample[g].push({ ...t, - start_offset: t.start_offset - offset, - end_offset: t.end_offset - offset, + start_offset: start, + end_offset: start + t.token.length, }); break; } From 2e00e9c11bbbde39eaeeda239390c11a6132978d Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Tue, 29 Jun 2021 11:02:17 +0100 Subject: [PATCH 074/227] [ML] Rare anomaly detection job wizard (#100390) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ML] Rare anomaly detection job wizard * fixing fields selection * small improvements * adding event rate chart to summary step * [ML] Changes UI text for rare wizard. * improving detector summary * fixing translations * removing comments * fixing field selection * fixing advanced wizard * updating detector text * fixing bucketspan estimator * bug fixes Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: István Zoltán Szabó --- x-pack/plugins/ml/common/constants/new_job.ts | 2 + .../job_creator/categorization_job_creator.ts | 2 +- .../jobs/new_job/common/job_creator/index.ts | 2 + .../new_job/common/job_creator/job_creator.ts | 3 + .../common/job_creator/job_creator_factory.ts | 4 + .../job_creator/population_job_creator.ts | 24 +-- .../common/job_creator/rare_job_creator.ts | 173 ++++++++++++++++++ .../new_job/common/job_creator/type_guards.ts | 8 +- .../common/job_creator/util/general.ts | 4 + .../advanced_view/metric_selection.tsx | 8 +- .../estimate_bucket_span.ts | 15 +- .../{split_field => by_field}/by_field.tsx | 14 +- .../components/by_field/index.ts | 8 + .../population_field/description.tsx | 32 ++++ .../components/population_field/index.ts | 8 + .../population_field/population_field.tsx | 93 ++++++++++ .../components/population_view/chart_grid.tsx | 2 +- .../population_view/metric_selection.tsx | 22 +-- .../metric_selection_summary.tsx | 12 +- .../rare_detector/detector_cards.tsx | 85 +++++++++ .../components/rare_detector/index.ts | 8 + .../rare_detector/rare_detector.tsx | 90 +++++++++ .../components/rare_field/description.tsx | 32 ++++ .../components/rare_field/index.ts | 8 + .../components/rare_field/rare_field.tsx | 81 ++++++++ .../rare_field/rare_field_select.tsx | 66 +++++++ .../rare_view/detector_description.tsx | 112 ++++++++++++ .../components/rare_view/index.ts | 9 + .../components/rare_view/metric_selection.tsx | 67 +++++++ .../rare_view/metric_selection_summary.tsx | 88 +++++++++ .../components/rare_view/rare_view.tsx | 54 ++++++ .../components/rare_view/settings.tsx | 38 ++++ .../components/split_field/description.tsx | 67 ++----- .../components/split_field/index.ts | 1 - .../components/split_field/split_field.tsx | 53 ++++-- .../components/split_field_select/index.ts | 8 + .../split_field_select.tsx | 0 .../pick_fields_step/pick_fields.tsx | 20 +- .../detector_chart/detector_chart.tsx | 2 + .../components/job_details/job_details.tsx | 6 +- .../preconfigured_job_redirect.ts | 3 + .../jobs/new_job/pages/job_type/page.tsx | 17 ++ .../new_job/pages/job_type/rare_job_icon.tsx | 23 +++ .../jobs/new_job/pages/new_job/page.tsx | 5 + .../routing/routes/new_job/wizard.tsx | 16 ++ 45 files changed, 1276 insertions(+), 119 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts rename x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/{split_field => by_field}/by_field.tsx (85%) create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/index.ts create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/description.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/index.ts create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/detector_cards.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/index.ts create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/description.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/index.ts create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field_select.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/index.ts create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/settings.tsx create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field_select/index.ts rename x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/{split_field => split_field_select}/split_field_select.tsx (100%) create mode 100644 x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/rare_job_icon.tsx diff --git a/x-pack/plugins/ml/common/constants/new_job.ts b/x-pack/plugins/ml/common/constants/new_job.ts index 3a3b31c8e58c1f..800b81d4737263 100644 --- a/x-pack/plugins/ml/common/constants/new_job.ts +++ b/x-pack/plugins/ml/common/constants/new_job.ts @@ -11,6 +11,7 @@ export enum JOB_TYPE { POPULATION = 'population', ADVANCED = 'advanced', CATEGORIZATION = 'categorization', + RARE = 'rare', } export enum CREATED_BY_LABEL { @@ -18,6 +19,7 @@ export enum CREATED_BY_LABEL { MULTI_METRIC = 'multi-metric-wizard', POPULATION = 'population-wizard', CATEGORIZATION = 'categorization-wizard', + RARE = 'rare-wizard', APM_TRANSACTION = 'ml-module-apm-transaction', } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts index eba5a954fadc20..ccea4ddf52ea3a 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/categorization_job_creator.ts @@ -66,7 +66,7 @@ export class CategorizationJobCreator extends JobCreator { eventRate: Field | null ) { if (count === null || rare === null || eventRate === null) { - return; + throw Error('event_rate field or count or rare aggregations missing'); } this._createCountDetector = () => { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/index.ts index 0d4900e80b9f3a..ec4e4c0e0c7eca 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/index.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/index.ts @@ -11,6 +11,7 @@ export { MultiMetricJobCreator } from './multi_metric_job_creator'; export { PopulationJobCreator } from './population_job_creator'; export { AdvancedJobCreator } from './advanced_job_creator'; export { CategorizationJobCreator } from './categorization_job_creator'; +export { RareJobCreator } from './rare_job_creator'; export { JobCreatorType, isSingleMetricJobCreator, @@ -18,5 +19,6 @@ export { isPopulationJobCreator, isAdvancedJobCreator, isCategorizationJobCreator, + isRareJobCreator, } from './type_guards'; export { jobCreatorFactory } from './job_creator_factory'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts index d4a410bcda24cd..45e7247f0bd856 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator.ts @@ -395,6 +395,9 @@ export class JobCreator { // change the detector to be a non-zer or non-null count or sum. // note, the aggregations will always be a standard count or sum and not a non-null or non-zero version this._detectors.forEach((d, i) => { + if (this._aggs[i] === undefined) { + return; + } switch (this._aggs[i].id) { case ML_JOB_AGGREGATION.COUNT: d.function = this._sparseData diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts index e815ddfcd97c32..7b9305e42dfdd8 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/job_creator_factory.ts @@ -12,6 +12,7 @@ import { PopulationJobCreator } from './population_job_creator'; import { AdvancedJobCreator } from './advanced_job_creator'; import { IndexPattern } from '../../../../../../../../../src/plugins/data/public'; import { CategorizationJobCreator } from './categorization_job_creator'; +import { RareJobCreator } from './rare_job_creator'; import { JOB_TYPE } from '../../../../../../common/constants/new_job'; @@ -37,6 +38,9 @@ export const jobCreatorFactory = (jobType: JOB_TYPE) => ( case JOB_TYPE.CATEGORIZATION: jc = CategorizationJobCreator; break; + case JOB_TYPE.RARE: + jc = RareJobCreator; + break; default: jc = SingleMetricJobCreator; break; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts index 14570fa039ccf8..24b31922312113 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts @@ -22,7 +22,7 @@ import { IndexPattern } from '../../../../../../../../../src/plugins/data/public export class PopulationJobCreator extends JobCreator { // a population job has one overall over (split) field, which is the same for all detectors // each detector has an optional by field - private _splitField: SplitField = null; + private _populatonField: SplitField = null; private _byFields: SplitField[] = []; protected _type: JOB_TYPE = JOB_TYPE.POPULATION; @@ -65,27 +65,27 @@ export class PopulationJobCreator extends JobCreator { } // add an over field to all detectors - public setSplitField(field: SplitField) { - this._splitField = field; + public setPopulationField(field: SplitField) { + this._populatonField = field; - if (this._splitField === null) { - this.removeSplitField(); + if (this._populatonField === null) { + this.removePopulationField(); } else { for (let i = 0; i < this._detectors.length; i++) { - this._detectors[i].over_field_name = this._splitField.id; + this._detectors[i].over_field_name = this._populatonField.id; } } } // remove over field from all detectors - public removeSplitField() { + public removePopulationField() { this._detectors.forEach((d) => { delete d.over_field_name; }); } - public get splitField(): SplitField { - return this._splitField; + public get populationField(): SplitField { + return this._populatonField; } public addDetector(agg: Aggregation, field: Field) { @@ -112,8 +112,8 @@ export class PopulationJobCreator extends JobCreator { private _createDetector(agg: Aggregation, field: Field) { const dtr: Detector = createBasicDetector(agg, field); - if (this._splitField !== null) { - dtr.over_field_name = this._splitField.id; + if (this._populatonField !== null) { + dtr.over_field_name = this._populatonField.id; } return dtr; } @@ -143,7 +143,7 @@ export class PopulationJobCreator extends JobCreator { if (detectors.length) { if (detectors[0].overField !== null) { - this.setSplitField(detectors[0].overField); + this.setPopulationField(detectors[0].overField); } } detectors.forEach((d, i) => { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts new file mode 100644 index 00000000000000..73050dc4b78349 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts @@ -0,0 +1,173 @@ +/* + * 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 { SavedSearchSavedObject } from '../../../../../../common/types/kibana'; +import { JobCreator } from './job_creator'; +import { Field, SplitField, Aggregation } from '../../../../../../common/types/fields'; +import { Job, Datafeed, Detector } from '../../../../../../common/types/anomaly_detection_jobs'; +import { JOB_TYPE, CREATED_BY_LABEL } from '../../../../../../common/constants/new_job'; +import { getRichDetectors } from './util/general'; +import { IndexPattern } from '../../../../../../../../../src/plugins/data/public'; +import { isSparseDataJob } from './util/general'; +import { ML_JOB_AGGREGATION } from '../../../../../../common/constants/aggregation_types'; + +export class RareJobCreator extends JobCreator { + private _rareField: Field | null = null; + private _populationField: SplitField = null; + private _splitField: SplitField = null; + + protected _type: JOB_TYPE = JOB_TYPE.RARE; + private _rareInPopulation: boolean = false; + private _frequentlyRare: boolean = false; + private _rareAgg: Aggregation; + private _freqRareAgg: Aggregation; + + constructor( + indexPattern: IndexPattern, + savedSearch: SavedSearchSavedObject | null, + query: object + ) { + super(indexPattern, savedSearch, query); + this.createdBy = CREATED_BY_LABEL.RARE; + this._wizardInitialized$.next(true); + this._rareAgg = {} as Aggregation; + this._freqRareAgg = {} as Aggregation; + } + + public setDefaultDetectorProperties(rare: Aggregation | null, freqRare: Aggregation | null) { + if (rare === null || freqRare === null) { + throw Error('rare or freq_rare aggregations missing'); + } + this._rareAgg = rare; + this._freqRareAgg = freqRare; + } + + public setRareField(field: Field | null) { + this._rareField = field; + + if (field === null) { + this.removePopulationField(); + this.removeSplitField(); + this._removeDetector(0); + this._detectors.length = 0; + this._fields.length = 0; + return; + } + + const agg = this._frequentlyRare ? this._freqRareAgg : this._rareAgg; + + const dtr: Detector = { + function: agg.id, + }; + if (this._detectors.length === 0) { + this._addDetector(dtr, agg, field); + } else { + this._editDetector(dtr, agg, field, 0); + } + + this._detectors[0].by_field_name = field.id; + } + + public get rareField() { + return this._rareField; + } + + public get rareInPopulation() { + return this._rareInPopulation; + } + + public set rareInPopulation(bool: boolean) { + this._rareInPopulation = bool; + if (bool === false) { + this.removePopulationField(); + } + } + + public get frequentlyRare() { + return this._frequentlyRare; + } + + public set frequentlyRare(bool: boolean) { + this._frequentlyRare = bool; + if (this._detectors.length) { + const agg = bool ? this._freqRareAgg : this._rareAgg; + this._detectors[0].function = agg.id; + this._aggs[0] = agg; + } + } + + // set the population field, applying it to each detector + public setPopulationField(field: SplitField) { + this._populationField = field; + + if (this._populationField === null) { + this.removePopulationField(); + } else { + for (let i = 0; i < this._detectors.length; i++) { + this._detectors[i].over_field_name = this._populationField.id; + } + } + } + + public removePopulationField() { + this._populationField = null; + this._detectors.forEach((d) => { + delete d.over_field_name; + }); + } + + public get populationField(): SplitField { + return this._populationField; + } + + // set the split field, applying it to each detector + public setSplitField(field: SplitField) { + this._splitField = field; + + if (this._splitField === null) { + this.removeSplitField(); + } else { + for (let i = 0; i < this._detectors.length; i++) { + this._detectors[i].partition_field_name = this._splitField.id; + } + } + } + + public removeSplitField() { + this._detectors.forEach((d) => { + delete d.partition_field_name; + }); + } + + public get splitField(): SplitField { + return this._splitField; + } + + public cloneFromExistingJob(job: Job, datafeed: Datafeed) { + this._overrideConfigs(job, datafeed); + this.createdBy = CREATED_BY_LABEL.RARE; + this._sparseData = isSparseDataJob(job, datafeed); + const detectors = getRichDetectors(job, datafeed, this.additionalFields, false); + + this.removeSplitField(); + this.removePopulationField(); + this.removeAllDetectors(); + + if (detectors.length) { + this.setRareField(detectors[0].byField); + this.frequentlyRare = detectors[0].agg?.id === ML_JOB_AGGREGATION.FREQ_RARE; + + if (detectors[0].overField !== null) { + this.setPopulationField(detectors[0].overField); + this.rareInPopulation = true; + } + if (detectors[0].partitionField !== null) { + this.setSplitField(detectors[0].partitionField); + } + } + } +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/type_guards.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/type_guards.ts index a3998a00054800..902d67b82a9e31 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/type_guards.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/type_guards.ts @@ -10,6 +10,7 @@ import { MultiMetricJobCreator } from './multi_metric_job_creator'; import { PopulationJobCreator } from './population_job_creator'; import { AdvancedJobCreator } from './advanced_job_creator'; import { CategorizationJobCreator } from './categorization_job_creator'; +import { RareJobCreator } from './rare_job_creator'; import { JOB_TYPE } from '../../../../../../common/constants/new_job'; export type JobCreatorType = @@ -17,7 +18,8 @@ export type JobCreatorType = | MultiMetricJobCreator | PopulationJobCreator | AdvancedJobCreator - | CategorizationJobCreator; + | CategorizationJobCreator + | RareJobCreator; export function isSingleMetricJobCreator( jobCreator: JobCreatorType @@ -46,3 +48,7 @@ export function isCategorizationJobCreator( ): jobCreator is CategorizationJobCreator { return jobCreator.type === JOB_TYPE.CATEGORIZATION; } + +export function isRareJobCreator(jobCreator: JobCreatorType): jobCreator is RareJobCreator { + return jobCreator.type === JOB_TYPE.RARE; +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/general.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/general.ts index bab6800c083353..78903e64686f54 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/general.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/general.ts @@ -311,6 +311,10 @@ export function getJobCreatorTitle(jobCreator: JobCreatorType) { return i18n.translate('xpack.ml.newJob.wizard.jobCreatorTitle.categorization', { defaultMessage: 'Categorization', }); + case JOB_TYPE.RARE: + return i18n.translate('xpack.ml.newJob.wizard.jobCreatorTitle.rare', { + defaultMessage: 'Rare', + }); default: return ''; } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx index 8f53e1283faa0e..36fd27aaba27c9 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { Fragment, FC, useContext, useState } from 'react'; +import React, { Fragment, FC, useContext, useState, useEffect } from 'react'; import { JobCreatorContext } from '../../../job_creator_context'; import { AdvancedJobCreator } from '../../../../../common/job_creator'; @@ -33,12 +33,16 @@ const emptyRichDetector: RichDetector = { }; export const AdvancedDetectors: FC = ({ setIsValid }) => { - const { jobCreator: jc, jobCreatorUpdate } = useContext(JobCreatorContext); + const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); const jobCreator = jc as AdvancedJobCreator; const { fields, aggs } = newJobCapsService; const [modalPayload, setModalPayload] = useState(null); + useEffect(() => { + setIsValid(jobCreator.detectors.length > 0); + }, [jobCreatorUpdated]); + function closeModal() { setModalPayload(null); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts index 85083146c13789..67673901494c7d 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/estimate_bucket_span.ts @@ -14,6 +14,7 @@ import { isMultiMetricJobCreator, isPopulationJobCreator, isAdvancedJobCreator, + isRareJobCreator, } from '../../../../../common/job_creator'; import { ml } from '../../../../../../../services/ml_api_service'; import { useMlContext } from '../../../../../../../contexts/ml'; @@ -45,11 +46,17 @@ export function useEstimateBucketSpan() { indicesOptions: jobCreator.datafeedConfig.indices_options, }; - if ( - (isMultiMetricJobCreator(jobCreator) || isPopulationJobCreator(jobCreator)) && - jobCreator.splitField !== null - ) { + if (isMultiMetricJobCreator(jobCreator) && jobCreator.splitField !== null) { data.splitField = jobCreator.splitField.id; + } else if (isPopulationJobCreator(jobCreator) && jobCreator.populationField !== null) { + data.splitField = jobCreator.populationField.id; + } else if (isRareJobCreator(jobCreator)) { + data.fields = [null]; + if (jobCreator.populationField) { + data.splitField = jobCreator.populationField.id; + } else { + data.splitField = jobCreator.rareField?.id; + } } else if (isAdvancedJobCreator(jobCreator)) { jobCreator.richDetectors.some((d) => { if (d.partitionField !== null) { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/by_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx similarity index 85% rename from x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/by_field.tsx rename to x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx index b197b950bbe285..17577641fe183d 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/by_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx @@ -8,14 +8,14 @@ import React, { FC, useContext, useEffect, useState, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { SplitFieldSelect } from './split_field_select'; +import { SplitFieldSelect } from '../split_field_select'; import { JobCreatorContext } from '../../../job_creator_context'; import { Field } from '../../../../../../../../../common/types/fields'; import { newJobCapsService, filterCategoryFields, } from '../../../../../../../services/new_job_capabilities/new_job_capabilities_service'; -import { MultiMetricJobCreator, PopulationJobCreator } from '../../../../../common/job_creator'; +import { PopulationJobCreator } from '../../../../../common/job_creator'; interface Props { detectorIndex: number; @@ -69,18 +69,18 @@ export const ByFieldSelector: FC = ({ detectorIndex }) => { ); }; -// remove the split (over) field from the by field options +// remove the population (over) field from the by field options function useFilteredCategoryFields( allCategoryFields: Field[], - jobCreator: MultiMetricJobCreator | PopulationJobCreator, + jobCreator: PopulationJobCreator, jobCreatorUpdated: number ) { const [fields, setFields] = useState(allCategoryFields); useEffect(() => { - const sf = jobCreator.splitField; - if (sf !== null) { - setFields(allCategoryFields.filter((f) => f.name !== sf.name)); + const pf = jobCreator.populationField; + if (pf !== null) { + setFields(allCategoryFields.filter(({ name }) => name !== pf.name)); } else { setFields(allCategoryFields); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/index.ts new file mode 100644 index 00000000000000..542a483c374b86 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { ByFieldSelector } from './by_field'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/description.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/description.tsx new file mode 100644 index 00000000000000..6abbe77fc35aa3 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/description.tsx @@ -0,0 +1,32 @@ +/* + * 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, { memo, FC } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; + +export const Description: FC = memo(({ children }) => { + const title = i18n.translate('xpack.ml.newJob.wizard.pickFieldsStep.populationField.title', { + defaultMessage: 'Population field', + }); + return ( + {title}} + description={ + + } + > + + <>{children} + + + ); +}); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/index.ts new file mode 100644 index 00000000000000..02e5236fd54e33 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { PopulationFieldSelector } from './population_field'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx new file mode 100644 index 00000000000000..5b69d5b63b534f --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx @@ -0,0 +1,93 @@ +/* + * 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, { FC, useContext, useEffect, useState, useMemo } from 'react'; + +import { SplitFieldSelect } from '../split_field_select'; +import { JobCreatorContext } from '../../../job_creator_context'; +import { Field } from '../../../../../../../../../common/types/fields'; +import { + newJobCapsService, + filterCategoryFields, +} from '../../../../../../../services/new_job_capabilities/new_job_capabilities_service'; +import { Description } from './description'; +import { + PopulationJobCreator, + RareJobCreator, + isPopulationJobCreator, +} from '../../../../../common/job_creator'; + +export const PopulationFieldSelector: FC = () => { + const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); + const jobCreator = jc as PopulationJobCreator | RareJobCreator; + + const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); + const allCategoryFields = useMemo( + () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields], + [] + ); + const categoryFields = useFilteredCategoryFields( + allCategoryFields, + jobCreator, + jobCreatorUpdated + ); + + const [populationField, setPopulationField] = useState(jobCreator.populationField); + + useEffect(() => { + jobCreator.setPopulationField(populationField); + // add the split field to the influencers + if ( + populationField !== null && + jobCreator.influencers.includes(populationField.name) === false + ) { + jobCreator.addInfluencer(populationField.name); + } + jobCreatorUpdate(); + }, [populationField]); + + useEffect(() => { + setPopulationField(jobCreator.populationField); + }, [jobCreatorUpdated]); + + return ( + + + + ); +}; + +// remove the rare (by) field from the by field options in the rare wizard +function useFilteredCategoryFields( + allCategoryFields: Field[], + jobCreator: PopulationJobCreator | RareJobCreator, + jobCreatorUpdated: number +) { + const [fields, setFields] = useState(allCategoryFields); + + useEffect(() => { + if (isPopulationJobCreator(jobCreator)) { + setFields(allCategoryFields); + } else { + const rf = jobCreator.rareField; + const sf = jobCreator.splitField; + if (rf !== null || sf !== null) { + setFields(allCategoryFields.filter(({ name }) => name !== rf?.name && name !== sf?.name)); + } else { + setFields(allCategoryFields); + } + } + }, [jobCreatorUpdated]); + + return fields; +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/chart_grid.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/chart_grid.tsx index 6fa90fa06a1e53..1e355b0fb2dd9d 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/chart_grid.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/chart_grid.tsx @@ -15,7 +15,7 @@ import { ModelItem, Anomaly } from '../../../../../common/results_loader'; import { JOB_TYPE } from '../../../../../../../../../common/constants/new_job'; import { SplitCards, useAnimateSplit } from '../split_cards'; import { DetectorTitle } from '../detector_title'; -import { ByFieldSelector } from '../split_field'; +import { ByFieldSelector } from '../by_field'; import { AnomalyChart, CHART_TYPE } from '../../../charts/anomaly_chart'; type DetectorFieldValues = Record; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx index 1be487d5b7eec3..1f669fea655b76 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx @@ -17,7 +17,7 @@ import { Field, AggFieldPair } from '../../../../../../../../../common/types/fie import { sortFields } from '../../../../../../../../../common/util/fields_utils'; import { getChartSettings, defaultChartSettings } from '../../../charts/common/settings'; import { MetricSelector } from './metric_selector'; -import { SplitFieldSelector } from '../split_field'; +import { PopulationFieldSelector } from '../population_field'; import { ChartGrid } from './chart_grid'; import { getToastNotificationService } from '../../../../../../../services/toast_notification_service'; @@ -51,7 +51,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { const [end, setEnd] = useState(jobCreator.end); const [bucketSpanMs, setBucketSpanMs] = useState(jobCreator.bucketSpanMs); const [chartSettings, setChartSettings] = useState(defaultChartSettings); - const [splitField, setSplitField] = useState(jobCreator.splitField); + const [populationField, setPopulationField] = useState(jobCreator.populationField); const [fieldValuesPerDetector, setFieldValuesPerDetector] = useState({}); const [byFieldsUpdated, setByFieldsUpdated] = useReducer<(s: number, action: any) => number>( (s) => s + 1, @@ -108,7 +108,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { // if the split field or by fields have changed useEffect(() => { loadCharts(); - }, [JSON.stringify(fieldValuesPerDetector), splitField, pageReady]); + }, [JSON.stringify(fieldValuesPerDetector), populationField, pageReady]); // watch for change in jobCreator useEffect(() => { @@ -123,7 +123,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { loadCharts(); } - setSplitField(jobCreator.splitField); + setPopulationField(jobCreator.populationField); // update by fields and their by fields let update = false; @@ -146,7 +146,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { // changes to fieldValues here will trigger the card effect via setFieldValuesPerDetector useEffect(() => { loadFieldExamples(); - }, [splitField, byFieldsUpdated]); + }, [populationField, byFieldsUpdated]); async function loadCharts() { if (allDataReady()) { @@ -158,7 +158,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { jobCreator.start, jobCreator.end, aggFieldPairList, - jobCreator.splitField, + jobCreator.populationField, cs.intervalMs, jobCreator.runtimeMappings, jobCreator.datafeedConfig.indices_options @@ -225,14 +225,14 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { return ( - - {splitField !== null && } + + {populationField !== null && } - {splitField !== null && ( + {populationField !== null && ( = ({ setIsValid }) => { loading={loadingData} /> )} - {splitField !== null && ( + {populationField !== null && ( { if (allDataReady()) { loadCharts(); } - }, [JSON.stringify(fieldValuesPerDetector), jobCreator.splitField]); + }, [JSON.stringify(fieldValuesPerDetector), jobCreator.populationField]); // watch for changes in split field or by fields. // load example field values // changes to fieldValues here will trigger the card effect via setFieldValuesPerDetector useEffect(() => { loadFieldExamples(); - }, [jobCreator.splitField]); + }, [jobCreator.populationField]); async function loadCharts() { if (allDataReady()) { @@ -76,7 +76,7 @@ export const PopulationDetectorsSummary: FC = () => { jobCreator.start, jobCreator.end, aggFieldPairList, - jobCreator.splitField, + jobCreator.populationField, cs.intervalMs, jobCreator.runtimeMappings, jobCreator.datafeedConfig.indices_options @@ -143,18 +143,18 @@ export const PopulationDetectorsSummary: FC = () => { return ( - {jobCreator.splitField !== null && ( + {jobCreator.populationField !== null && ( void; + isSelected: boolean; +} + +export const RareCard: FC = ({ onClick, isSelected }) => ( + + + + + } + selectable={{ onClick, isSelected }} + /> + +); + +export const RareInPopulationCard: FC = ({ onClick, isSelected }) => ( + + + + + } + selectable={{ onClick, isSelected }} + /> + +); + +export const FrequentlyRareInPopulationCard: FC = ({ onClick, isSelected }) => ( + + + + + } + selectable={{ onClick, isSelected }} + /> + +); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/index.ts new file mode 100644 index 00000000000000..2e5ca95766527a --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { RareDetector } from './rare_detector'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx new file mode 100644 index 00000000000000..a7e5b22d2eac07 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx @@ -0,0 +1,90 @@ +/* + * 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, { FC, useContext, useEffect, useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiFlexGroup, EuiSpacer, EuiTitle } from '@elastic/eui'; + +import { JobCreatorContext } from '../../../job_creator_context'; +import { RareJobCreator } from '../../../../../common/job_creator'; +import { RareCard, RareInPopulationCard, FrequentlyRareInPopulationCard } from './detector_cards'; +import { RARE_DETECTOR_TYPE } from '../rare_view'; + +interface Props { + onChange(d: RARE_DETECTOR_TYPE): void; +} + +export const RareDetector: FC = ({ onChange }) => { + const { jobCreator: jc, jobCreatorUpdate } = useContext(JobCreatorContext); + const jobCreator = jc as RareJobCreator; + const [rareDetectorType, setRareDetectorType] = useState(null); + + useEffect(() => { + if (jobCreator.rareField !== null) { + if (jobCreator.populationField === null) { + setRareDetectorType(RARE_DETECTOR_TYPE.RARE); + } else { + setRareDetectorType( + jobCreator.frequentlyRare + ? RARE_DETECTOR_TYPE.FREQ_RARE_POPULATION + : RARE_DETECTOR_TYPE.RARE_POPULATION + ); + } + } else { + setRareDetectorType(RARE_DETECTOR_TYPE.RARE); + } + }, []); + + useEffect(() => { + if (rareDetectorType !== null) { + onChange(rareDetectorType); + if (rareDetectorType === RARE_DETECTOR_TYPE.RARE && jobCreator.populationField !== null) { + jobCreator.removePopulationField(); + } + jobCreator.frequentlyRare = rareDetectorType === RARE_DETECTOR_TYPE.FREQ_RARE_POPULATION; + jobCreatorUpdate(); + } + }, [rareDetectorType]); + + function onRareSelection() { + setRareDetectorType(RARE_DETECTOR_TYPE.RARE); + } + function onRareInPopulationSelection() { + setRareDetectorType(RARE_DETECTOR_TYPE.RARE_POPULATION); + } + function onFreqRareInPopulationSelection() { + setRareDetectorType(RARE_DETECTOR_TYPE.FREQ_RARE_POPULATION); + } + + return ( + <> + +

+ +

+
+ + + + + + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/description.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/description.tsx new file mode 100644 index 00000000000000..4c3b547d580d71 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/description.tsx @@ -0,0 +1,32 @@ +/* + * 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, { memo, FC } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; + +export const Description: FC = memo(({ children }) => { + const title = i18n.translate('xpack.ml.newJob.wizard.pickFieldsStep.splitRareField.title', { + defaultMessage: 'Rare field', + }); + return ( + {title}} + description={ + + } + > + + <>{children} + + + ); +}); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/index.ts new file mode 100644 index 00000000000000..bd467f22c1c5a4 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { RareFieldSelector } from './rare_field'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx new file mode 100644 index 00000000000000..200d58f3b0171e --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx @@ -0,0 +1,81 @@ +/* + * 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, { FC, useContext, useEffect, useState, useMemo } from 'react'; + +import { RareFieldSelect } from './rare_field_select'; +import { JobCreatorContext } from '../../../job_creator_context'; +import { + newJobCapsService, + filterCategoryFields, +} from '../../../../../../../services/new_job_capabilities/new_job_capabilities_service'; +import { Description } from './description'; +import { Field } from '../../../../../../../../../common/types/fields'; +import { RareJobCreator } from '../../../../../common/job_creator'; + +export const RareFieldSelector: FC = () => { + const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); + const jobCreator = jc as RareJobCreator; + + const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); + const allCategoryFields = useMemo( + () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields], + [] + ); + const categoryFields = useFilteredCategoryFields( + allCategoryFields, + jobCreator, + jobCreatorUpdated + ); + + const [rareField, setRareField] = useState(jobCreator.rareField); + + useEffect(() => { + jobCreator.setRareField(rareField); + // add the split field to the influencers + if (rareField !== null && jobCreator.influencers.includes(rareField.name) === false) { + jobCreator.addInfluencer(rareField.name); + } + jobCreatorUpdate(); + }, [rareField]); + + useEffect(() => { + setRareField(jobCreator.rareField); + }, [jobCreatorUpdated]); + + return ( + + + + ); +}; + +// remove the rare (by) field from the by field options in the rare wizard +function useFilteredCategoryFields( + allCategoryFields: Field[], + jobCreator: RareJobCreator, + jobCreatorUpdated: number +) { + const [fields, setFields] = useState(allCategoryFields); + + useEffect(() => { + const pf = jobCreator.populationField; + const sf = jobCreator.splitField; + if (pf !== null || sf !== null) { + setFields(allCategoryFields.filter(({ name }) => name !== pf?.name && name !== sf?.name)); + } else { + setFields(allCategoryFields); + } + }, [jobCreatorUpdated]); + + return fields; +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field_select.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field_select.tsx new file mode 100644 index 00000000000000..3868554215d897 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field_select.tsx @@ -0,0 +1,66 @@ +/* + * 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, { FC } from 'react'; +import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; + +import { Field, SplitField } from '../../../../../../../../../common/types/fields'; + +interface DropDownLabel { + label: string; + field: Field; +} + +interface Props { + fields: Field[]; + changeHandler(f: SplitField): void; + selectedField: SplitField; + testSubject?: string; + placeholder?: string; +} + +export const RareFieldSelect: FC = ({ + fields, + changeHandler, + selectedField, + testSubject, + placeholder, +}) => { + const options: EuiComboBoxOptionOption[] = fields.map( + (f) => + ({ + label: f.name, + field: f, + } as DropDownLabel) + ); + + const selection: EuiComboBoxOptionOption[] = []; + if (selectedField !== null) { + selection.push({ label: selectedField.name, field: selectedField } as DropDownLabel); + } + + function onChange(selectedOptions: EuiComboBoxOptionOption[]) { + const option = selectedOptions[0] as DropDownLabel; + if (typeof option !== 'undefined') { + changeHandler(option.field); + } else { + changeHandler(null); + } + } + + return ( + + ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx new file mode 100644 index 00000000000000..dcd6d859ff868e --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx @@ -0,0 +1,112 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import React, { FC, useContext, useEffect, useState } from 'react'; +import { EuiCallOut } from '@elastic/eui'; + +import { JobCreatorContext } from '../../../job_creator_context'; +import { RareJobCreator } from '../../../../../common/job_creator'; +import { RARE_DETECTOR_TYPE } from './rare_view'; + +interface Props { + detectorType: RARE_DETECTOR_TYPE; +} + +export const DetectorDescription: FC = ({ detectorType }) => { + const { jobCreator: jc, jobCreatorUpdated } = useContext(JobCreatorContext); + const jobCreator = jc as RareJobCreator; + const [description, setDescription] = useState(null); + + useEffect(() => { + const desc = createDetectorDescription(jobCreator, detectorType); + setDescription(desc); + }, [jobCreatorUpdated]); + + if (description === null) { + return null; + } + + return ( + + +
    + {description.map((d) => ( +
  • {d}
  • + ))} +
+
+ ); +}; + +function createDetectorDescription(jobCreator: RareJobCreator, detectorType: RARE_DETECTOR_TYPE) { + if (jobCreator.rareField === null) { + return null; + } + + const rareFieldName = jobCreator.rareField.id; + const populationFieldName = jobCreator.populationField?.id; + const splitFieldName = jobCreator.splitField?.id; + + const beginningSummary = i18n.translate( + 'xpack.ml.newJob.wizard.pickFieldsStep.rareField.plainText.beginningSummary', + { + defaultMessage: 'detects rare values of {rareFieldName}', + values: { rareFieldName }, + } + ); + + const beginningSummaryFreq = i18n.translate( + 'xpack.ml.newJob.wizard.pickFieldsStep.rareField.plainText.beginningSummaryFreq', + { + defaultMessage: 'detects frequently rare values of {rareFieldName}', + values: { rareFieldName }, + } + ); + + const population = i18n.translate( + 'xpack.ml.newJob.wizard.pickFieldsStep.rareField.plainText.population', + { + defaultMessage: 'compared to the population of {populationFieldName}', + values: { populationFieldName }, + } + ); + + const split = i18n.translate('xpack.ml.newJob.wizard.pickFieldsStep.rareField.plainText.split', { + defaultMessage: 'for each value of {splitFieldName}', + values: { splitFieldName }, + }); + + const desc = []; + + if (detectorType === RARE_DETECTOR_TYPE.FREQ_RARE_POPULATION) { + desc.push(beginningSummaryFreq); + } else { + desc.push(beginningSummary); + } + + if (populationFieldName !== undefined) { + desc.push(population); + } + + if (splitFieldName !== undefined) { + desc.push(split); + } + + return desc; +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/index.ts new file mode 100644 index 00000000000000..285adba0a414a9 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export { RareView } from './rare_view'; +export { RARE_DETECTOR_TYPE } from './rare_view'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx new file mode 100644 index 00000000000000..1c1a8e83c478bd --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx @@ -0,0 +1,67 @@ +/* + * 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, { FC, useContext, useEffect, useState } from 'react'; +import { EuiHorizontalRule, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; + +import { RareFieldSelector } from '../rare_field'; +import { JobCreatorContext } from '../../../job_creator_context'; +import { RareJobCreator } from '../../../../../common/job_creator'; +import { RareDetector } from '../rare_detector'; +import { PopulationFieldSelector } from '../population_field'; +import { DetectorDescription } from './detector_description'; +import { RARE_DETECTOR_TYPE } from './rare_view'; + +interface Props { + setIsValid: (na: boolean) => void; + setRareDetectorType(t: RARE_DETECTOR_TYPE): void; + rareDetectorType: RARE_DETECTOR_TYPE; +} + +export const RareDetectors: FC = ({ setIsValid, rareDetectorType, setRareDetectorType }) => { + const { jobCreator: jc, jobCreatorUpdated } = useContext(JobCreatorContext); + const jobCreator = jc as RareJobCreator; + const [detectorValid, setDetectorValid] = useState(false); + + useEffect(() => { + let valid = false; + if (jobCreator.rareField !== null) { + if (rareDetectorType === RARE_DETECTOR_TYPE.RARE) { + // Rare only requires a rare field to be set + valid = true; + } else if (jobCreator.populationField !== null) { + // all others need a need the population field to be set + valid = true; + } + } + setIsValid(valid); + setDetectorValid(valid); + }, [jobCreatorUpdated]); + + return ( + <> + + <> + + + + + + + {rareDetectorType !== RARE_DETECTOR_TYPE.RARE && } + + + {detectorValid && ( + <> + + + + )} + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx new file mode 100644 index 00000000000000..02566474512ee0 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx @@ -0,0 +1,88 @@ +/* + * 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, { FC, useContext, useEffect, useState } from 'react'; +import { EuiSpacer } from '@elastic/eui'; +import { JobCreatorContext } from '../../../job_creator_context'; +import { RareJobCreator } from '../../../../../common/job_creator'; +import { Results, Anomaly } from '../../../../../common/results_loader'; +import { LineChartPoint } from '../../../../../common/chart_loader'; +import { EventRateChart } from '../../../charts/event_rate_chart'; + +import { RARE_DETECTOR_TYPE } from './rare_view'; +import { DetectorDescription } from './detector_description'; + +const DTR_IDX = 0; +interface Props { + rareDetectorType: RARE_DETECTOR_TYPE; +} + +export const RareDetectorsSummary: FC = ({ rareDetectorType }) => { + const { jobCreator: jc, chartLoader, resultsLoader, chartInterval } = useContext( + JobCreatorContext + ); + const jobCreator = jc as RareJobCreator; + + const [loadingData, setLoadingData] = useState(false); + const [anomalyData, setAnomalyData] = useState([]); + const [eventRateChartData, setEventRateChartData] = useState([]); + const [jobIsRunning, setJobIsRunning] = useState(false); + + function setResultsWrapper(results: Results) { + const anomalies = results.anomalies[DTR_IDX]; + if (anomalies !== undefined) { + setAnomalyData(anomalies); + } + } + + function watchProgress(progress: number) { + setJobIsRunning(progress > 0); + } + + useEffect(() => { + // subscribe to progress and results + const resultsSubscription = resultsLoader.subscribeToResults(setResultsWrapper); + jobCreator.subscribeToProgress(watchProgress); + loadChart(); + return () => { + resultsSubscription.unsubscribe(); + }; + }, []); + + async function loadChart() { + setLoadingData(true); + try { + const resp = await chartLoader.loadEventRateChart( + jobCreator.start, + jobCreator.end, + chartInterval.getInterval().asMilliseconds(), + jobCreator.runtimeMappings ?? undefined, + jobCreator.datafeedConfig.indices_options + ); + setEventRateChartData(resp); + } catch (error) { + setEventRateChartData([]); + } + setLoadingData(false); + } + + return ( + <> + + + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx new file mode 100644 index 00000000000000..d67cac8d0fc5c6 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx @@ -0,0 +1,54 @@ +/* + * 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, { FC, useEffect, useState } from 'react'; +import { EuiHorizontalRule } from '@elastic/eui'; + +import { RareDetectors } from './metric_selection'; +import { RareDetectorsSummary } from './metric_selection_summary'; +import { RareSettings } from './settings'; + +export enum RARE_DETECTOR_TYPE { + RARE, + RARE_POPULATION, + FREQ_RARE_POPULATION, +} + +interface Props { + isActive: boolean; + setCanProceed?: (proceed: boolean) => void; +} + +export const RareView: FC = ({ isActive, setCanProceed }) => { + const [rareFieldValid, setRareFieldValid] = useState(false); + const [settingsValid, setSettingsValid] = useState(false); + const [rareDetectorType, setRareDetectorType] = useState(RARE_DETECTOR_TYPE.RARE); + + useEffect(() => { + if (typeof setCanProceed === 'function') { + setCanProceed(rareFieldValid && settingsValid); + } + }, [rareFieldValid, settingsValid]); + + return isActive === false ? ( + + ) : ( + <> + + {rareFieldValid && ( + <> + + + + )} + + ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/settings.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/settings.tsx new file mode 100644 index 00000000000000..88bf04322d1824 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/settings.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { BucketSpan } from '../bucket_span'; +import { SplitFieldSelector } from '../split_field'; +import { Influencers } from '../influencers'; + +interface Props { + setIsValid: (proceed: boolean) => void; +} + +export const RareSettings: FC = ({ setIsValid }) => { + return ( + <> + + + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/description.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/description.tsx index 9f569de09864b9..0d5cd8bda3d0df 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/description.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/description.tsx @@ -10,52 +10,23 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; -import { JOB_TYPE } from '../../../../../../../../../common/constants/new_job'; - -interface Props { - jobType: JOB_TYPE; -} - -export const Description: FC = memo(({ children, jobType }) => { - if (jobType === JOB_TYPE.MULTI_METRIC) { - const title = i18n.translate('xpack.ml.newJob.wizard.pickFieldsStep.splitField.title', { - defaultMessage: 'Split field', - }); - return ( - {title}} - description={ - - } - > - - <>{children} - - - ); - } else if (jobType === JOB_TYPE.POPULATION) { - const title = i18n.translate('xpack.ml.newJob.wizard.pickFieldsStep.populationField.title', { - defaultMessage: 'Population field', - }); - return ( - {title}} - description={ - - } - > - - <>{children} - - - ); - } else { - return null; - } +export const Description: FC = memo(({ children }) => { + const title = i18n.translate('xpack.ml.newJob.wizard.pickFieldsStep.splitField.title', { + defaultMessage: 'Split field', + }); + return ( + {title}} + description={ + + } + > + + <>{children} + + + ); }); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/index.ts index d8d37e84c2c888..9e1698053f2900 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/index.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/index.ts @@ -5,5 +5,4 @@ * 2.0. */ -export { ByFieldSelector } from './by_field'; export { SplitFieldSelector } from './split_field'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx index 9837fe924fb013..a007a6ee826c4e 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx @@ -7,30 +7,34 @@ import React, { FC, useContext, useEffect, useState, useMemo } from 'react'; -import { SplitFieldSelect } from './split_field_select'; +import { SplitFieldSelect } from '../split_field_select'; import { JobCreatorContext } from '../../../job_creator_context'; import { newJobCapsService, filterCategoryFields, } from '../../../../../../../services/new_job_capabilities/new_job_capabilities_service'; import { Description } from './description'; +import { Field } from '../../../../../../../../../common/types/fields'; import { MultiMetricJobCreator, + RareJobCreator, isMultiMetricJobCreator, - PopulationJobCreator, - isPopulationJobCreator, } from '../../../../../common/job_creator'; export const SplitFieldSelector: FC = () => { const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); - const jobCreator = jc as MultiMetricJobCreator | PopulationJobCreator; - const canClearSelection = isMultiMetricJobCreator(jc); + const jobCreator = jc as MultiMetricJobCreator | RareJobCreator; const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); - const categoryFields = useMemo( + const allCategoryFields = useMemo( () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields], [] ); + const categoryFields = useFilteredCategoryFields( + allCategoryFields, + jobCreator, + jobCreatorUpdated + ); const [splitField, setSplitField] = useState(jobCreator.splitField); useEffect(() => { @@ -47,20 +51,39 @@ export const SplitFieldSelector: FC = () => { }, [jobCreatorUpdated]); return ( - + ); }; + +// remove the rare (by) and population (over) fields from the by field options in the rare wizard +function useFilteredCategoryFields( + allCategoryFields: Field[], + jobCreator: MultiMetricJobCreator | RareJobCreator, + jobCreatorUpdated: number +) { + const [fields, setFields] = useState(allCategoryFields); + + useEffect(() => { + if (isMultiMetricJobCreator(jobCreator)) { + setFields(allCategoryFields); + } else { + const rf = jobCreator.rareField; + const pf = jobCreator.populationField; + if (rf !== null || pf !== null) { + setFields(allCategoryFields.filter(({ name }) => name !== rf?.name && name !== pf?.name)); + } else { + setFields(allCategoryFields); + } + } + }, [jobCreatorUpdated]); + + return fields; +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field_select/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field_select/index.ts new file mode 100644 index 00000000000000..216af994ed065b --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field_select/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { SplitFieldSelect } from './split_field_select'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field_select.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field_select/split_field_select.tsx similarity index 100% rename from x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field_select.tsx rename to x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field_select/split_field_select.tsx diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx index 2d5f5e8a766371..2461cfc9d9d047 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx @@ -15,6 +15,7 @@ import { MultiMetricView } from './components/multi_metric_view'; import { PopulationView } from './components/population_view'; import { AdvancedView } from './components/advanced_view'; import { CategorizationView } from './components/categorization_view'; +import { RareView } from './components/rare_view'; import { JsonEditorFlyout, EDITOR_MODE } from '../common/json_editor_flyout'; import { isSingleMetricJobCreator, @@ -22,34 +23,39 @@ import { isPopulationJobCreator, isCategorizationJobCreator, isAdvancedJobCreator, + isRareJobCreator, } from '../../../common/job_creator'; export const PickFieldsStep: FC = ({ setCurrentStep, isCurrentStep }) => { const { jobCreator, jobValidator, jobValidatorUpdated } = useContext(JobCreatorContext); const [nextActive, setNextActive] = useState(false); + const [selectionValid, setSelectionValid] = useState(false); useEffect(() => { - setNextActive(jobValidator.isPickFieldsStepValid); - }, [jobValidatorUpdated]); + setNextActive(selectionValid && jobValidator.isPickFieldsStepValid); + }, [jobValidatorUpdated, selectionValid]); return ( {isCurrentStep && ( {isSingleMetricJobCreator(jobCreator) && ( - + )} {isMultiMetricJobCreator(jobCreator) && ( - + )} {isPopulationJobCreator(jobCreator) && ( - + )} {isAdvancedJobCreator(jobCreator) && ( - + )} {isCategorizationJobCreator(jobCreator) && ( - + + )} + {isRareJobCreator(jobCreator) && ( + )} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/detector_chart/detector_chart.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/detector_chart/detector_chart.tsx index c1c8c594969290..266c779e1e644f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/detector_chart/detector_chart.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/detector_chart/detector_chart.tsx @@ -13,6 +13,7 @@ import { MultiMetricView } from '../../../pick_fields_step/components/multi_metr import { PopulationView } from '../../../pick_fields_step/components/population_view'; import { AdvancedView } from '../../../pick_fields_step/components/advanced_view'; import { CategorizationView } from '../../../pick_fields_step/components/categorization_view'; +import { RareView } from '../../../pick_fields_step/components/rare_view'; export const DetectorChart: FC = () => { const { jobCreator } = useContext(JobCreatorContext); @@ -24,6 +25,7 @@ export const DetectorChart: FC = () => { {jobCreator.type === JOB_TYPE.POPULATION && } {jobCreator.type === JOB_TYPE.ADVANCED && } {jobCreator.type === JOB_TYPE.CATEGORIZATION && } + {jobCreator.type === JOB_TYPE.RARE && } ); }; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/job_details/job_details.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/job_details/job_details.tsx index 64f419be7979cf..f6145ef812987f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/job_details/job_details.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/components/job_details/job_details.tsx @@ -111,10 +111,10 @@ export const JobDetails: FC = () => { defaultMessage: 'Population field', }), description: - isPopulationJobCreator(jobCreator) && jobCreator.splitField !== null ? ( - jobCreator.splitField.name + isPopulationJobCreator(jobCreator) && jobCreator.populationField !== null ? ( + jobCreator.populationField.name ) : ( - + { }), id: 'mlJobTypeLinkCategorizationJob', }, + { + onClick: () => navigateToPath(`/jobs/new_job/rare${getUrlParams()}`), + icon: { + type: RareIcon, + ariaLabel: i18n.translate('xpack.ml.newJob.wizard.jobType.rareAriaLabel', { + defaultMessage: 'Rare job', + }), + }, + title: i18n.translate('xpack.ml.newJob.wizard.jobType.rareTitle', { + defaultMessage: 'Rare', + }), + description: i18n.translate('xpack.ml.newJob.wizard.jobType.rareDescription', { + defaultMessage: 'Detect rare values in time series data.', + }), + id: 'mlJobTypeLinkrareJob', + }, ]; return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/rare_job_icon.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/rare_job_icon.tsx new file mode 100644 index 00000000000000..f7ab7ff14d09b2 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/rare_job_icon.tsx @@ -0,0 +1,23 @@ +/* + * 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'; + +export const RareIcon = ( + + + + +); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx index 442bdba717f281..c5d9acce1ee934 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx @@ -24,6 +24,7 @@ import { jobCreatorFactory, isAdvancedJobCreator, isCategorizationJobCreator, + isRareJobCreator, } from '../../common/job_creator'; import { JOB_TYPE, @@ -171,6 +172,10 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { const { anomaly_detectors: anomalyDetectors } = getNewJobDefaults(); jobCreator.categorizationAnalyzer = anomalyDetectors.categorization_analyzer!; + } else if (isRareJobCreator(jobCreator)) { + const rare = newJobCapsService.getAggById('rare'); + const freqRare = newJobCapsService.getAggById('freq_rare'); + jobCreator.setDefaultDetectorProperties(rare, freqRare); } } diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx index 726ec328d1cb20..56554e79fe95d9 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/wizard.tsx @@ -86,6 +86,16 @@ const getCategorizationBreadcrumbs = (navigateToPath: NavigateToPath, basePath: }, ]; +const getRareBreadcrumbs = (navigateToPath: NavigateToPath, basePath: string) => [ + ...getBaseBreadcrumbs(navigateToPath, basePath), + { + text: i18n.translate('xpack.ml.jobsBreadcrumbs.rareLabel', { + defaultMessage: 'Rare', + }), + href: '', + }, +]; + export const singleMetricRouteFactory = ( navigateToPath: NavigateToPath, basePath: string @@ -131,6 +141,12 @@ export const categorizationRouteFactory = ( breadcrumbs: getCategorizationBreadcrumbs(navigateToPath, basePath), }); +export const rareRouteFactory = (navigateToPath: NavigateToPath, basePath: string): MlRoute => ({ + path: '/jobs/new_job/rare', + render: (props, deps) => , + breadcrumbs: getRareBreadcrumbs(navigateToPath, basePath), +}); + const PageWrapper: FC = ({ location, jobType, deps }) => { const redirectToJobsManagementPage = useCreateAndNavigateToMlLink( ML_PAGES.ANOMALY_DETECTION_JOBS_MANAGE From 6e308a2a1e2c531557e6c2bcd1c85d62d18b10b9 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 29 Jun 2021 13:28:40 +0300 Subject: [PATCH 075/227] [Migrations V2] Unskip migration_7.7.2_xpack_100k (#103435) --- .../migration_7.7.2_xpack_100k.test.ts | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts index cb7f5a000cefb1..ea807beb83cead 100644 --- a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts +++ b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7.7.2_xpack_100k.test.ts @@ -6,9 +6,8 @@ * Side Public License, v 1. */ -import Path from 'path'; -import Fs from 'fs'; -import Util from 'util'; +import path from 'path'; +import { unlink } from 'fs/promises'; import { REPO_ROOT } from '@kbn/dev-utils'; import { Env } from '@kbn/config'; import { getEnvOptions } from '@kbn/config/target/mocks'; @@ -18,16 +17,14 @@ import { InternalCoreStart } from '../../../internal_types'; import { Root } from '../../../root'; const kibanaVersion = Env.createDefault(REPO_ROOT, getEnvOptions()).packageInfo.version; -const logFilePath = Path.join(__dirname, 'migration_test_kibana.log'); +const logFilePath = path.join(__dirname, 'migration_test_kibana.log'); -const asyncUnlink = Util.promisify(Fs.unlink); async function removeLogFile() { // ignore errors if it doesn't exist - await asyncUnlink(logFilePath).catch(() => void 0); + await unlink(logFilePath).catch(() => void 0); } -// FAILING on 7.13: https://github.com/elastic/kibana/issues/96895 -describe.skip('migration from 7.7.2-xpack with 100k objects', () => { +describe('migration from 7.7.2-xpack with 100k objects', () => { let esServer: kbnTestServer.TestElasticsearchUtils; let root: Root; let coreStart: InternalCoreStart; @@ -64,12 +61,9 @@ describe.skip('migration from 7.7.2-xpack with 100k objects', () => { }, }, }, - loggers: [ - { - name: 'root', - appenders: ['file'], - }, - ], + root: { + appenders: ['default', 'file'], + }, }, }, { @@ -106,7 +100,7 @@ describe.skip('migration from 7.7.2-xpack with 100k objects', () => { await removeLogFile(); await startServers({ oss: false, - dataArchive: Path.join(__dirname, 'archives', '7.7.2_xpack_100k_obj.zip'), + dataArchive: path.join(__dirname, 'archives', '7.7.2_xpack_100k_obj.zip'), }); }); From 436ddef784f7ba960faca587fcefa2c7f0cd2f24 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Tue, 29 Jun 2021 04:43:58 -0600 Subject: [PATCH 076/227] [Maps] Only allow feature deletion when in delete-mode --- .../draw_control/draw_feature_control/draw_feature_control.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/draw_control/draw_feature_control/draw_feature_control.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/draw_control/draw_feature_control/draw_feature_control.tsx index eb5ea9b5ddba53..9f2b99b9c41ab4 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/draw_control/draw_feature_control/draw_feature_control.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/draw_control/draw_feature_control/draw_feature_control.tsx @@ -85,7 +85,8 @@ export class DrawFeatureControl extends Component { _onClick = async (event: MapMouseEvent, drawControl?: MapboxDraw) => { const mbLngLatPoint: MbPoint = event.point; - if (!this.props.editLayer) { + // Currently feature deletion is the only onClick handling + if (!this.props.editLayer || this.props.drawShape !== DRAW_SHAPE.DELETE) { return; } const mbEditLayerIds = this.props.editLayer From 39ba74772896a24cebf7b9adb55aabd5b4dadddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Tue, 29 Jun 2021 13:01:36 +0200 Subject: [PATCH 077/227] [ILM] Add missing a11y tests (#102887) * [ILM] Added missing a11y tests * Fixed ILM functional tests, added after tests cleanup * Added review suggestions * Fixed section header renaming * Fixed section header renaming Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../policy_table/components/table_content.tsx | 2 + .../sections/policy_table/policy_table.tsx | 2 +- .../apps/index_lifecycle_management.ts | 130 +++++++++++++----- .../index_lifecycle_management/home_page.ts | 31 +++-- .../index_lifecycle_management_page.ts | 65 +++++---- 5 files changed, 155 insertions(+), 75 deletions(-) diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx index 2c653ee5f76f66..ffc21ac4187fe2 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/components/table_content.tsx @@ -205,6 +205,7 @@ export const TableContent: React.FunctionComponent = ({ onClick: () => { setConfirmModal(renderAddPolicyToTemplateConfirmModal(policy)); }, + 'data-test-subj': 'addPolicyToTemplate', }); items.push({ name: deletePolicyLabel, @@ -214,6 +215,7 @@ export const TableContent: React.FunctionComponent = ({ onClick: () => { setConfirmModal(renderDeleteConfirmModal(policy)); }, + 'data-test-subj': 'deletePolicy', }); const panelTree = { id: 0, diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx index 6ed7d42a694cc7..30a2b9e68d69da 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/policy_table/policy_table.tsx @@ -152,7 +152,7 @@ export const PolicyTable: React.FunctionComponent = ({ + { + const actionsCell = await testSubjects.find(`policyTableCell-actions-${policyName}`); + const actionsButton = await actionsCell.findByTestSubject('policyActionsContextMenuButton'); + + await actionsButton.click(); + }; + describe('Index Lifecycle Management', async () => { before(async () => { - await esClient.ilm.putLifecycle({ policy: TEST_POLICY_NAME, body: TEST_POLICY_ALL_PHASES }); - await common.navigateToApp('indexLifecycleManagement'); + await esClient.ilm.putLifecycle({ policy: POLICY_NAME, body: POLICY_ALL_PHASES }); }); after(async () => { // @ts-expect-error @elastic/elasticsearch DeleteSnapshotLifecycleRequest.policy_id is required - await esClient.ilm.deleteLifecycle({ policy: TEST_POLICY_NAME }); + await esClient.ilm.deleteLifecycle({ policy: POLICY_NAME }); }); - it('Create Policy Form', async () => { - await retry.waitFor('Index Lifecycle Policy create/edit view to be present', async () => { - return testSubjects.isDisplayed('createPolicyButton'); + beforeEach(async () => { + await retry.waitFor('ILM app', async () => { + await common.navigateToApp('indexLifecycleManagement'); + return testSubjects.exists('ilmPageHeader'); }); + }); + + describe('Edit policy form', () => { + it('Create policy', async () => { + const createButtonTestSubject = 'createPolicyButton'; + await retry.waitFor('ILM create policy button', async () => { + return testSubjects.isDisplayed(createButtonTestSubject); + }); - // Navigate to create policy page and take snapshot - await testSubjects.click('createPolicyButton'); - await retry.waitFor('Index Lifecycle Policy create/edit view to be present', async () => { - return (await testSubjects.getVisibleText('policyTitle')) === 'Create policy'; + // Navigate to create policy page and take snapshot + await testSubjects.click(createButtonTestSubject); + await retry.waitFor('ILM create policy form', async () => { + return (await testSubjects.getVisibleText('policyTitle')) === 'Create policy'; + }); + + // Fill out form after enabling all phases and take snapshot. + await indexLifecycleManagement.fillNewPolicyForm({ + policyName: 'testPolicy', + warmEnabled: true, + coldEnabled: true, + frozenEnabled: true, + deleteEnabled: true, + }); + await a11y.testAppSnapshot(); }); - // Fill out form after enabling all phases and take snapshot. - await indexLifecycleManagement.fillNewPolicyForm('testPolicy', true, true, false); - await a11y.testAppSnapshot(); - }); + it('Edit policy', async () => { + const link = await findPolicyLinkInListView(POLICY_NAME); + await link.click(); + await retry.waitFor('ILM edit form', async () => { + return ( + (await testSubjects.getVisibleText('policyTitle')) === `Edit policy ${POLICY_NAME}` + ); + }); + await a11y.testAppSnapshot(); + }); - it('Send Request Flyout on New Policy Page', async () => { - // Take snapshot of the show request panel - await testSubjects.click('requestButton'); - await a11y.testAppSnapshot(); + it('Request flyout', async () => { + const link = await findPolicyLinkInListView(POLICY_NAME); + await link.click(); + await retry.waitFor('ILM request button', async () => { + return testSubjects.exists('requestButton'); + }); + // Take snapshot of the show request panel + await testSubjects.click('requestButton'); + await a11y.testAppSnapshot(); + }); + }); - // Close panel and save policy - await testSubjects.click('euiFlyoutCloseButton'); - await indexLifecycleManagement.saveNewPolicy(); + describe('Policies list', () => { + it('List policies view', async () => { + await a11y.testAppSnapshot(); + }); }); - it('List policies view', async () => { - await retry.waitFor('Index Lifecycle Policy create/edit view to be present', async () => { - await common.navigateToApp('indexLifecycleManagement'); - return testSubjects.exists('policyTablePolicyNameLink') ? true : false; + it('Add policy to index template modal', async () => { + await clickPolicyActionsButton(POLICY_NAME); + + const buttonSelector = 'addPolicyToTemplate'; + + await retry.waitFor('ILM add policy to index template button', async () => { + return testSubjects.isDisplayed(buttonSelector); + }); + await testSubjects.click(buttonSelector); + + await retry.waitFor('ILM add policy to index template modal to be present', async () => { + return testSubjects.isDisplayed('confirmModalTitleText'); }); + await a11y.testAppSnapshot(); }); - it('Edit policy with all phases view', async () => { - await retry.waitFor('Index Lifecycle Policy create/edit view to be present', async () => { - await common.navigateToApp('indexLifecycleManagement'); - return testSubjects.exists('policyTablePolicyNameLink'); + it('Delete policy modal', async () => { + await clickPolicyActionsButton(POLICY_NAME); + + const buttonSelector = 'deletePolicy'; + + await retry.waitFor('ILM delete policy button', async () => { + return testSubjects.isDisplayed(buttonSelector); }); - const link = await findPolicyLinkInListView(TEST_POLICY_NAME); - await link.click(); - await retry.waitFor('Index Lifecycle Policy create/edit view to be present', async () => { - return testSubjects.exists('policyTitle'); + await testSubjects.click(buttonSelector); + + await retry.waitFor('ILM delete policy modal to be present', async () => { + return testSubjects.isDisplayed('confirmModalTitleText'); }); + await a11y.testAppSnapshot(); }); }); diff --git a/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts b/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts index 50194552aec0a7..bd70a50724a9ce 100644 --- a/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts +++ b/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts @@ -8,37 +8,46 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; +const policyName = 'testPolicy1'; + export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'indexLifecycleManagement']); const log = getService('log'); const retry = getService('retry'); - const testSubjects = getService('testSubjects'); + const esClient = getService('es'); describe('Home page', function () { before(async () => { await pageObjects.common.navigateToApp('indexLifecycleManagement'); }); + after(async () => { + // @ts-expect-error @elastic/elasticsearch DeleteSnapshotLifecycleRequest.policy_id is required + await esClient.ilm.deleteLifecycle({ policy: policyName }); + }); it('Loads the app', async () => { - await log.debug('Checking for section header'); - const headerText = await pageObjects.indexLifecycleManagement.sectionHeadingText(); + await log.debug('Checking for page header'); + const headerText = await pageObjects.indexLifecycleManagement.pageHeaderText(); expect(headerText).to.be('Index Lifecycle Policies'); const createPolicyButton = await pageObjects.indexLifecycleManagement.createPolicyButton(); expect(await createPolicyButton.isDisplayed()).to.be(true); }); - it('Create new policy with Warm and Cold Phases', async () => { - const policyName = 'testPolicy1'; - await pageObjects.indexLifecycleManagement.createNewPolicyAndSave( + it('Create new policy with all Phases', async () => { + await pageObjects.indexLifecycleManagement.createNewPolicyAndSave({ policyName, - true, - true, - false - ); + warmEnabled: true, + coldEnabled: true, + frozenEnabled: true, + deleteEnabled: true, + }); await retry.waitFor('navigation back to home page.', async () => { - return (await testSubjects.getVisibleText('sectionHeading')) === 'Index Lifecycle Policies'; + return ( + (await pageObjects.indexLifecycleManagement.pageHeaderText()) === + 'Index Lifecycle Policies' + ); }); await pageObjects.indexLifecycleManagement.increasePolicyListPageSize(); diff --git a/x-pack/test/functional/page_objects/index_lifecycle_management_page.ts b/x-pack/test/functional/page_objects/index_lifecycle_management_page.ts index 2dd70f8a95717e..0c913683a1628c 100644 --- a/x-pack/test/functional/page_objects/index_lifecycle_management_page.ts +++ b/x-pack/test/functional/page_objects/index_lifecycle_management_page.ts @@ -7,28 +7,42 @@ import { map as mapAsync } from 'bluebird'; import { FtrProviderContext } from '../ftr_provider_context'; +interface Policy { + policyName: string; + warmEnabled?: boolean; + coldEnabled?: boolean; + frozenEnabled?: boolean; + deleteEnabled?: boolean; + snapshotRepository?: string; + minAges?: { [key: string]: { value: string; unit: string } }; +} + export function IndexLifecycleManagementPageProvider({ getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const retry = getService('retry'); return { - async sectionHeadingText() { - return await testSubjects.getVisibleText('sectionHeading'); + async pageHeaderText() { + return await testSubjects.getVisibleText('ilmPageHeader'); }, async createPolicyButton() { return await testSubjects.find('createPolicyButton'); }, - async fillNewPolicyForm( - policyName: string, - warmEnabled: boolean = false, - coldEnabled: boolean = false, - deletePhaseEnabled: boolean = false, - minAges: { [key: string]: { value: string; unit: string } } = { - warm: { value: '10', unit: 'd' }, - cold: { value: '15', unit: 'd' }, - frozen: { value: '20', unit: 'd' }, - } - ) { + async fillNewPolicyForm(policy: Policy) { + const { + policyName, + warmEnabled = false, + coldEnabled = false, + frozenEnabled = false, + deleteEnabled = false, + snapshotRepository = 'test', + minAges = { + warm: { value: '10', unit: 'd' }, + cold: { value: '15', unit: 'd' }, + frozen: { value: '20', unit: 'd' }, + }, + } = policy; + await testSubjects.setValue('policyNameField', policyName); if (warmEnabled) { await retry.try(async () => { @@ -42,7 +56,14 @@ export function IndexLifecycleManagementPageProvider({ getService }: FtrProvider }); await testSubjects.setValue('cold-selectedMinimumAge', minAges.cold.value); } - if (deletePhaseEnabled) { + if (frozenEnabled) { + await retry.try(async () => { + await testSubjects.click('enablePhaseSwitch-frozen'); + }); + await testSubjects.setValue('frozen-selectedMinimumAge', minAges.frozen.value); + await testSubjects.setValue('searchableSnapshotCombobox', snapshotRepository); + } + if (deleteEnabled) { await retry.try(async () => { await testSubjects.click('enableDeletePhaseButton'); }); @@ -51,21 +72,9 @@ export function IndexLifecycleManagementPageProvider({ getService }: FtrProvider async saveNewPolicy() { await testSubjects.click('savePolicyButton'); }, - async createNewPolicyAndSave( - policyName: string, - warmEnabled: boolean = false, - coldEnabled: boolean = false, - deletePhaseEnabled: boolean = false, - minAges?: { [key: string]: { value: string; unit: string } } - ) { + async createNewPolicyAndSave(policy: Policy) { await testSubjects.click('createPolicyButton'); - await this.fillNewPolicyForm( - policyName, - warmEnabled, - coldEnabled, - deletePhaseEnabled, - minAges - ); + await this.fillNewPolicyForm(policy); await this.saveNewPolicy(); }, From 0c8d5e8f89df135f42ab82079c07e02c7f171d49 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Tue, 29 Jun 2021 08:08:52 -0400 Subject: [PATCH 078/227] [Synthetics] Support synthetics dedupe strategy in Uptime app (#101678) * Add new runtime types for parsing on client/server. * Add more runtime types. * Remove dead code. * Mark parameter as unused. * Improve typing for failed journey request function. * Add new API functions, improve typing in a few others. * Modify API calls to work with new screenshot_ref data. * Fix untested refactor error. * Add required fields to runtime type. * Update typing in failed steps component. * Adapt client to work with old screenshots as well as new screenshot_ref. * Refactor composite code to reusable hook. * Implement screenshot blocks endpoint. * Define runtime types for full-size screenshots. * Delete dedicated screenshot and ref queries. * Optimize screenshot endpoint by combining queries. * Handle parsing error. * Clean up screenshot/ref typings. * Remove dead types. DRY a type out. * Simplify types. * Improve typing in step screenshot components. * Prefer PNG to JPG for canvas composite op. * Simplify and clean up some code. * Remove reliance on `Ping` type, clean up types. * Add a comment. * Add a comment. * Fix typing for `FailedStep` component. * Standardize loading spinner sizes. * Add comments to composite code. * Remove unnecessary optional chaining. * Reformat error string. * Remove unneeded key from request return object. * Add a comment to a return object explaining very large cache value. * Make type annotation more accurate. * Resolve some type and test errors. * Clean up remaining type errors. * Move type definitions to simplify imports. * Simplify `PingTimestamp` interface. * Refactor failing unit test to use RTL and actually test things. * Add tests for new helper functions. * Add a comment. * Test `PingTimestamp` for screenshot ref data. * Test `StepImageCaption` for ref data. * Improve typing for step list column definitions. * Harden a test. * Extract code to avoid repeated declarations. * Create centralized mock for `useCompositeImage`. * Add test for ref to `StepScreenshotDisplay`. * Add tests for `getJourneyDetails`. * Extract search results wrapper to helper lib. * Add tests for `getJourneyFailedSteps`. * Add support for aggs to result helper wrapper. * Write tests for `getJourneyScreenshot` and simplify type checking. * Write tests for `getJourneyScreenshotBlocks`. * Simplify prop types for `FailedStep`. * Remove unused type. * Fix regression in step navigating for new style screenshots. * Implement PR feedback. * Implement PR feedback. * Implement PR feedback. * Reduce limit of screenshot block queries from 10k to 1k. * Remove redundant field selection from ES query. * Implement PR feedback. * Fix regression that caused "Last successful step" to not show an image. * Delete unused props from `Ping` runtime type. * More precise naming. * Naming improvements. Add `useCallback` to prevent callback re-declaration. * Prefer explicit props to `{...spread}` syntax. * Remove redundant type checking. * Delete obsolete unit tests. * Fix a regression. * Add effect to `useEffect`. --- .../common/runtime_types/monitor/details.ts | 31 --- .../common/runtime_types/monitor/index.ts | 1 - .../uptime/common/runtime_types/ping/index.ts | 1 + .../uptime/common/runtime_types/ping/ping.ts | 58 ++--- .../runtime_types/ping/synthetics.test.ts | 150 ++++++++++++ .../common/runtime_types/ping/synthetics.ts | 207 ++++++++++++++++ .../monitor/ping_list/columns/failed_step.tsx | 10 +- .../ping_timestamp/nav_buttons.test.tsx | 89 ------- .../columns/ping_timestamp/nav_buttons.tsx | 59 ----- .../ping_timestamp/no_image_display.tsx | 2 +- .../ping_timestamp/ping_timestamp.test.tsx | 76 +++--- .../columns/ping_timestamp/ping_timestamp.tsx | 29 ++- .../step_image_caption.test.tsx | 9 + .../ping_timestamp/step_image_caption.tsx | 5 +- .../ping_timestamp/step_image_popover.tsx | 151 ++++++++++-- .../monitor/ping_list/ping_list.test.tsx | 6 +- .../monitor/ping_list/ping_list.tsx | 9 +- .../step_detail/use_monitor_breadcrumb.tsx | 10 +- .../step_expanded_row/screenshot_link.tsx | 4 +- .../step_expanded_row/step_screenshots.tsx | 21 +- .../synthetics/check_steps/step_image.tsx | 9 +- ...step_list.test.tsx => steps_list.test.tsx} | 16 +- .../synthetics/check_steps/steps_list.tsx | 40 +-- .../check_steps/use_expanded_row.test.tsx | 24 +- .../check_steps/use_expanded_row.tsx | 20 +- .../synthetics/console_event.test.tsx | 10 +- .../components/synthetics/console_event.tsx | 6 +- .../console_output_event_list.test.tsx | 228 +++++++----------- .../synthetics/console_output_event_list.tsx | 12 +- .../synthetics/executed_step.test.tsx | 12 +- .../components/synthetics/executed_step.tsx | 4 +- .../step_screenshot_display.test.tsx | 45 +++- .../synthetics/step_screenshot_display.tsx | 161 +++++++++---- x-pack/plugins/uptime/public/hooks/index.ts | 9 +- .../public/hooks/use_composite_image.ts | 55 +++++ .../lib/__mocks__/screenshot_ref.mock.ts | 62 +++++ .../lib/__mocks__/use_composite_image.mock.ts | 23 ++ .../lib/helper/compose_screenshot_images.ts | 56 +++++ .../uptime/public/state/api/journey.ts | 63 +++-- .../uptime/public/state/reducers/journey.ts | 4 +- .../lib/requests/get_journey_details.test.ts | 104 ++++++++ .../lib/requests/get_journey_details.ts | 10 +- .../requests/get_journey_failed_steps.test.ts | 90 +++++++ .../lib/requests/get_journey_failed_steps.ts | 21 +- .../requests/get_journey_screenshot.test.ts | 133 ++++++++++ .../lib/requests/get_journey_screenshot.ts | 51 ++-- .../get_journey_screenshot_blocks.test.ts | 56 +++++ .../requests/get_journey_screenshot_blocks.ts | 51 ++++ .../lib/requests/get_journey_steps.test.ts | 31 ++- .../server/lib/requests/get_journey_steps.ts | 73 ++++-- .../lib/requests/get_last_successful_step.ts | 8 +- .../uptime/server/lib/requests/helper.ts | 33 ++- .../uptime/server/lib/requests/index.ts | 2 + .../plugins/uptime/server/rest_api/index.ts | 2 + .../uptime/server/rest_api/pings/index.ts | 1 + .../pings/journey_screenshot_blocks.ts | 53 ++++ .../rest_api/pings/journey_screenshots.ts | 72 ++++-- .../uptime/server/rest_api/pings/journeys.ts | 61 ++--- .../synthetics/last_successful_step.ts | 32 ++- 59 files changed, 1936 insertions(+), 735 deletions(-) delete mode 100644 x-pack/plugins/uptime/common/runtime_types/monitor/details.ts create mode 100644 x-pack/plugins/uptime/common/runtime_types/ping/synthetics.test.ts create mode 100644 x-pack/plugins/uptime/common/runtime_types/ping/synthetics.ts delete mode 100644 x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.test.tsx delete mode 100644 x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.tsx rename x-pack/plugins/uptime/public/components/synthetics/check_steps/{step_list.test.tsx => steps_list.test.tsx} (94%) create mode 100644 x-pack/plugins/uptime/public/hooks/use_composite_image.ts create mode 100644 x-pack/plugins/uptime/public/lib/__mocks__/screenshot_ref.mock.ts create mode 100644 x-pack/plugins/uptime/public/lib/__mocks__/use_composite_image.mock.ts create mode 100644 x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.ts create mode 100644 x-pack/plugins/uptime/server/lib/requests/get_journey_details.test.ts create mode 100644 x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.test.ts create mode 100644 x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.test.ts create mode 100644 x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.test.ts create mode 100644 x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.ts create mode 100644 x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/details.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/details.ts deleted file mode 100644 index 6910a3091b67f6..00000000000000 --- a/x-pack/plugins/uptime/common/runtime_types/monitor/details.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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 * as t from 'io-ts'; - -// IO type for validation -export const PingErrorType = t.intersection([ - t.partial({ - code: t.string, - id: t.string, - stack_trace: t.string, - type: t.string, - }), - t.type({ - // this is _always_ on the error field - message: t.string, - }), -]); - -// Typescript type for type checking -export type PingError = t.TypeOf; - -export const MonitorDetailsType = t.intersection([ - t.type({ monitorId: t.string }), - t.partial({ error: PingErrorType, timestamp: t.string, alerts: t.unknown }), -]); -export type MonitorDetails = t.TypeOf; diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/index.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/index.ts index b8c6b2910bd087..41daa9d2148ad0 100644 --- a/x-pack/plugins/uptime/common/runtime_types/monitor/index.ts +++ b/x-pack/plugins/uptime/common/runtime_types/monitor/index.ts @@ -5,6 +5,5 @@ * 2.0. */ -export * from './details'; export * from './locations'; export * from './state'; diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/index.ts b/x-pack/plugins/uptime/common/runtime_types/ping/index.ts index 51addd76bee160..38ef0c7a835ad7 100644 --- a/x-pack/plugins/uptime/common/runtime_types/ping/index.ts +++ b/x-pack/plugins/uptime/common/runtime_types/ping/index.ts @@ -7,3 +7,4 @@ export * from './histogram'; export * from './ping'; +export * from './synthetics'; diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts index 77b9473f2912e9..d6875840a138cc 100644 --- a/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts +++ b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts @@ -7,7 +7,29 @@ import * as t from 'io-ts'; import { DateRangeType } from '../common'; -import { PingErrorType } from '../monitor'; + +// IO type for validation +export const PingErrorType = t.intersection([ + t.partial({ + code: t.string, + id: t.string, + stack_trace: t.string, + type: t.string, + }), + t.type({ + // this is _always_ on the error field + message: t.string, + }), +]); + +// Typescript type for type checking +export type PingError = t.TypeOf; + +export const MonitorDetailsType = t.intersection([ + t.type({ monitorId: t.string }), + t.partial({ error: PingErrorType, timestamp: t.string, alerts: t.unknown }), +]); +export type MonitorDetails = t.TypeOf; export const HttpResponseBodyType = t.partial({ bytes: t.number, @@ -193,10 +215,6 @@ export const PingType = t.intersection([ name: t.string, }), type: t.string, - // ui-related field - screenshotLoading: t.boolean, - // ui-related field - screenshotExists: t.boolean, blob: t.string, blob_mime: t.string, payload: t.partial({ @@ -242,36 +260,6 @@ export const PingType = t.intersection([ }), ]); -export const SyntheticsJourneyApiResponseType = t.intersection([ - t.type({ - checkGroup: t.string, - steps: t.array(PingType), - }), - t.partial({ - details: t.union([ - t.intersection([ - t.type({ - timestamp: t.string, - journey: PingType, - }), - t.partial({ - next: t.type({ - timestamp: t.string, - checkGroup: t.string, - }), - previous: t.type({ - timestamp: t.string, - checkGroup: t.string, - }), - }), - ]), - t.null, - ]), - }), -]); - -export type SyntheticsJourneyApiResponse = t.TypeOf; - export type Ping = t.TypeOf; // Convenience function for tests etc that makes an empty ping diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.test.ts b/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.test.ts new file mode 100644 index 00000000000000..de92cfeb29e085 --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.test.ts @@ -0,0 +1,150 @@ +/* + * 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 { + isRefResult, + isFullScreenshot, + isScreenshotRef, + isScreenshotImageBlob, + RefResult, + FullScreenshot, + ScreenshotImageBlob, + ScreenshotRefImageData, +} from './synthetics'; + +describe('synthetics runtime types', () => { + let refResult: RefResult; + let fullScreenshot: FullScreenshot; + let screenshotImageBlob: ScreenshotImageBlob; + let screenshotRef: ScreenshotRefImageData; + + beforeEach(() => { + refResult = { + '@timestamp': '123', + monitor: { + check_group: 'check-group', + }, + screenshot_ref: { + width: 1200, + height: 900, + blocks: [ + { + hash: 'hash1', + top: 0, + left: 0, + height: 120, + width: 90, + }, + { + hash: 'hash2', + top: 0, + left: 90, + height: 120, + width: 90, + }, + ], + }, + synthetics: { + package_version: 'v1', + step: { + name: 'step name', + index: 0, + }, + type: 'step/screenshot_ref', + }, + }; + + fullScreenshot = { + synthetics: { + blob: 'image data', + blob_mime: 'image/jpeg', + step: { + name: 'step name', + }, + type: 'step/screenshot', + }, + }; + + screenshotImageBlob = { + stepName: null, + maxSteps: 1, + src: 'image data', + }; + + screenshotRef = { + stepName: null, + maxSteps: 1, + ref: { + screenshotRef: refResult, + blocks: [ + { + id: 'hash1', + synthetics: { + blob: 'image data', + blob_mime: 'image/jpeg', + }, + }, + { + id: 'hash2', + synthetics: { + blob: 'image data', + blob_mime: 'image/jpeg', + }, + }, + ], + }, + }; + }); + + describe('isRefResult', () => { + it('identifies refs correctly', () => { + expect(isRefResult(refResult)).toBe(true); + }); + + it('fails objects that do not correspond to the type', () => { + expect(isRefResult(fullScreenshot)).toBe(false); + expect(isRefResult(screenshotRef)).toBe(false); + expect(isRefResult(screenshotImageBlob)).toBe(false); + }); + }); + + describe('isScreenshot', () => { + it('identifies screenshot objects correctly', () => { + expect(isFullScreenshot(fullScreenshot)).toBe(true); + }); + + it('fails objects that do not correspond to the type', () => { + expect(isFullScreenshot(refResult)).toBe(false); + expect(isFullScreenshot(screenshotRef)).toBe(false); + expect(isFullScreenshot(screenshotImageBlob)).toBe(false); + }); + }); + + describe('isScreenshotImageBlob', () => { + it('identifies screenshot image blob objects correctly', () => { + expect(isScreenshotImageBlob(screenshotImageBlob)).toBe(true); + }); + + it('fails objects that do not correspond to the type', () => { + expect(isScreenshotImageBlob(refResult)).toBe(false); + expect(isScreenshotImageBlob(screenshotRef)).toBe(false); + expect(isScreenshotImageBlob(fullScreenshot)).toBe(false); + }); + }); + + describe('isScreenshotRef', () => { + it('identifies screenshot ref objects correctly', () => { + expect(isScreenshotRef(screenshotRef)).toBe(true); + }); + + it('fails objects that do not correspond to the type', () => { + expect(isScreenshotRef(refResult)).toBe(false); + expect(isScreenshotRef(fullScreenshot)).toBe(false); + expect(isScreenshotRef(screenshotImageBlob)).toBe(false); + }); + }); +}); diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.ts b/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.ts new file mode 100644 index 00000000000000..cd6be645c7a628 --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/ping/synthetics.ts @@ -0,0 +1,207 @@ +/* + * 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 { isRight } from 'fp-ts/lib/Either'; +import * as t from 'io-ts'; + +/** + * This type has some overlap with the Ping type, but it helps avoid runtime type + * check failures and removes a lot of unnecessary fields that our Synthetics UI code + * does not care about. + */ +export const JourneyStepType = t.intersection([ + t.partial({ + monitor: t.partial({ + duration: t.type({ + us: t.number, + }), + name: t.string, + status: t.string, + type: t.string, + }), + synthetics: t.partial({ + error: t.partial({ + message: t.string, + stack: t.string, + }), + payload: t.partial({ + message: t.string, + source: t.string, + status: t.string, + text: t.string, + }), + step: t.type({ + index: t.number, + name: t.string, + }), + isFullScreenshot: t.boolean, + isScreenshotRef: t.boolean, + }), + }), + t.type({ + _id: t.string, + '@timestamp': t.string, + monitor: t.type({ + id: t.string, + check_group: t.string, + }), + synthetics: t.type({ + type: t.string, + }), + }), +]); + +export type JourneyStep = t.TypeOf; + +export const FailedStepsApiResponseType = t.type({ + checkGroups: t.array(t.string), + steps: t.array(JourneyStepType), +}); + +export type FailedStepsApiResponse = t.TypeOf; + +/** + * The individual screenshot blocks Synthetics uses to reduce disk footprint. + */ +export const ScreenshotBlockType = t.type({ + hash: t.string, + top: t.number, + left: t.number, + height: t.number, + width: t.number, +}); + +/** + * The old style of screenshot document that contains a full screenshot blob. + */ +export const FullScreenshotType = t.type({ + synthetics: t.intersection([ + t.partial({ + blob: t.string, + }), + t.type({ + blob: t.string, + blob_mime: t.string, + step: t.type({ + name: t.string, + }), + type: t.literal('step/screenshot'), + }), + ]), +}); + +export type FullScreenshot = t.TypeOf; + +export function isFullScreenshot(data: unknown): data is FullScreenshot { + return isRight(FullScreenshotType.decode(data)); +} + +/** + * The ref used by synthetics to organize the blocks needed to recompose a + * fragmented image. + */ +export const RefResultType = t.type({ + '@timestamp': t.string, + monitor: t.type({ + check_group: t.string, + }), + screenshot_ref: t.type({ + width: t.number, + height: t.number, + blocks: t.array(ScreenshotBlockType), + }), + synthetics: t.type({ + package_version: t.string, + step: t.type({ + name: t.string, + index: t.number, + }), + type: t.literal('step/screenshot_ref'), + }), +}); + +export type RefResult = t.TypeOf; + +export function isRefResult(data: unknown): data is RefResult { + return isRight(RefResultType.decode(data)); +} + +/** + * Represents the result of querying for the legacy-style full screenshot blob. + */ +export const ScreenshotImageBlobType = t.type({ + stepName: t.union([t.null, t.string]), + maxSteps: t.number, + src: t.string, +}); + +export type ScreenshotImageBlob = t.TypeOf; + +export function isScreenshotImageBlob(data: unknown): data is ScreenshotImageBlob { + return isRight(ScreenshotImageBlobType.decode(data)); +} + +/** + * Represents the block blobs stored by hash. These documents are used to recompose synthetics images. + */ +export const ScreenshotBlockDocType = t.type({ + id: t.string, + synthetics: t.type({ + blob: t.string, + blob_mime: t.string, + }), +}); + +export type ScreenshotBlockDoc = t.TypeOf; + +/** + * Contains the fields requried by the Synthetics UI when utilizing screenshot refs. + */ +export const ScreenshotRefImageDataType = t.type({ + stepName: t.union([t.null, t.string]), + maxSteps: t.number, + ref: t.type({ + screenshotRef: RefResultType, + blocks: t.array(ScreenshotBlockDocType), + }), +}); + +export type ScreenshotRefImageData = t.TypeOf; + +export function isScreenshotRef(data: unknown): data is ScreenshotRefImageData { + return isRight(ScreenshotRefImageDataType.decode(data)); +} + +export const SyntheticsJourneyApiResponseType = t.intersection([ + t.type({ + checkGroup: t.string, + steps: t.array(JourneyStepType), + }), + t.partial({ + details: t.union([ + t.intersection([ + t.type({ + timestamp: t.string, + journey: JourneyStepType, + }), + t.partial({ + next: t.type({ + timestamp: t.string, + checkGroup: t.string, + }), + previous: t.type({ + timestamp: t.string, + checkGroup: t.string, + }), + }), + ]), + t.null, + ]), + }), +]); + +export type SyntheticsJourneyApiResponse = t.TypeOf; diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/failed_step.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/failed_step.tsx index 7de3a09c5c1605..38f51a2bafebb3 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/failed_step.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/failed_step.tsx @@ -6,16 +6,16 @@ */ import React from 'react'; -import { Ping, SyntheticsJourneyApiResponse } from '../../../../../common/runtime_types/ping'; +import { FailedStepsApiResponse } from '../../../../../common/runtime_types/ping/synthetics'; interface Props { - ping: Ping; - failedSteps?: SyntheticsJourneyApiResponse; + checkGroup?: string; + failedSteps?: FailedStepsApiResponse; } -export const FailedStep = ({ ping, failedSteps }: Props) => { +export const FailedStep = ({ checkGroup, failedSteps }: Props) => { const thisFailedStep = failedSteps?.steps?.find( - (fs) => fs.monitor.check_group === ping.monitor.check_group + (fs) => !!checkGroup && fs.monitor.check_group === checkGroup ); if (!thisFailedStep) { diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.test.tsx deleted file mode 100644 index 30e46b1a3d638b..00000000000000 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.test.tsx +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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 { fireEvent, waitFor } from '@testing-library/react'; -import React from 'react'; -import { render } from '../../../../../lib/helper/rtl_helpers'; -import { NavButtons, NavButtonsProps } from './nav_buttons'; - -describe('NavButtons', () => { - let defaultProps: NavButtonsProps; - - beforeEach(() => { - defaultProps = { - maxSteps: 3, - stepNumber: 2, - setStepNumber: jest.fn(), - setIsImagePopoverOpen: jest.fn(), - }; - }); - - it('labels prev and next buttons', () => { - const { getByLabelText } = render(); - - expect(getByLabelText('Previous step')); - expect(getByLabelText('Next step')); - }); - - it('increments step number on next click', async () => { - const { getByLabelText } = render(); - - const nextButton = getByLabelText('Next step'); - - fireEvent.click(nextButton); - - await waitFor(() => { - expect(defaultProps.setStepNumber).toHaveBeenCalledTimes(1); - expect(defaultProps.setStepNumber).toHaveBeenCalledWith(3); - }); - }); - - it('decrements step number on prev click', async () => { - const { getByLabelText } = render(); - - const nextButton = getByLabelText('Previous step'); - - fireEvent.click(nextButton); - - await waitFor(() => { - expect(defaultProps.setStepNumber).toHaveBeenCalledTimes(1); - expect(defaultProps.setStepNumber).toHaveBeenCalledWith(1); - }); - }); - - it('disables `next` button on final step', () => { - defaultProps.stepNumber = 3; - - const { getByLabelText } = render(); - - // getByLabelText('Next step'); - expect(getByLabelText('Next step')).toHaveAttribute('disabled'); - expect(getByLabelText('Previous step')).not.toHaveAttribute('disabled'); - }); - - it('disables `prev` button on final step', () => { - defaultProps.stepNumber = 1; - - const { getByLabelText } = render(); - - expect(getByLabelText('Next step')).not.toHaveAttribute('disabled'); - expect(getByLabelText('Previous step')).toHaveAttribute('disabled'); - }); - - it('opens popover when mouse enters', async () => { - const { getByLabelText } = render(); - - const nextButton = getByLabelText('Next step'); - - fireEvent.mouseEnter(nextButton); - - await waitFor(() => { - expect(defaultProps.setIsImagePopoverOpen).toHaveBeenCalledTimes(1); - expect(defaultProps.setIsImagePopoverOpen).toHaveBeenCalledWith(true); - }); - }); -}); diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.tsx deleted file mode 100644 index 3b0aad721be8a9..00000000000000 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/nav_buttons.tsx +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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 { EuiButtonIcon, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; -import React, { MouseEvent } from 'react'; -import { nextAriaLabel, prevAriaLabel } from './translations'; - -export interface NavButtonsProps { - maxSteps?: number; - setIsImagePopoverOpen: React.Dispatch>; - setStepNumber: React.Dispatch>; - stepNumber: number; -} - -export const NavButtons: React.FC = ({ - maxSteps, - setIsImagePopoverOpen, - setStepNumber, - stepNumber, -}) => ( - setIsImagePopoverOpen(true)} - style={{ position: 'absolute', bottom: 0, left: 30 }} - > - - ) => { - setStepNumber(stepNumber - 1); - evt.stopPropagation(); - }} - iconType="arrowLeft" - aria-label={prevAriaLabel} - /> - - - ) => { - setStepNumber(stepNumber + 1); - evt.stopPropagation(); - }} - iconType="arrowRight" - aria-label={nextAriaLabel} - /> - - -); diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx index 827131d64f5005..6c341e7cb25ac3 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/no_image_display.tsx @@ -27,7 +27,7 @@ export const NoImageDisplay: React.FC = ({ {isLoading || isPending ? ( ) : ( diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx index d628b2d8388f92..ed74b502add112 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.test.tsx @@ -10,10 +10,11 @@ import { fireEvent, waitFor } from '@testing-library/react'; import { PingTimestamp } from './ping_timestamp'; import { mockReduxHooks } from '../../../../../lib/helper/test_helpers'; import { render } from '../../../../../lib/helper/rtl_helpers'; -import { Ping } from '../../../../../../common/runtime_types/ping'; import * as observabilityPublic from '../../../../../../../observability/public'; import { getShortTimeStamp } from '../../../../overview/monitor_list/columns/monitor_status_column'; import moment from 'moment'; +import '../../../../../lib/__mocks__/use_composite_image.mock'; +import { mockRef } from '../../../../../lib/__mocks__/screenshot_ref.mock'; mockReduxHooks(); @@ -27,40 +28,13 @@ jest.mock('../../../../../../../observability/public', () => { }); describe('Ping Timestamp component', () => { - let response: Ping; + let checkGroup: string; + let timestamp: string; const { FETCH_STATUS } = observabilityPublic; beforeAll(() => { - response = { - ecs: { version: '1.6.0' }, - agent: { - ephemeral_id: '52ce1110-464f-4d74-b94c-3c051bf12589', - id: '3ebcd3c2-f5c3-499e-8d86-80f98e5f4c08', - name: 'docker-desktop', - type: 'heartbeat', - version: '7.10.0', - hostname: 'docker-desktop', - }, - monitor: { - status: 'up', - check_group: 'f58a484f-2ffb-11eb-9b35-025000000001', - duration: { us: 1528598 }, - id: 'basic addition and completion of single task', - name: 'basic addition and completion of single task', - type: 'browser', - timespan: { lt: '2020-11-26T15:29:56.820Z', gte: '2020-11-26T15:28:56.820Z' }, - }, - url: { - full: 'file:///opt/elastic-synthetics/examples/todos/app/index.html', - scheme: 'file', - domain: '', - path: '/opt/elastic-synthetics/examples/todos/app/index.html', - }, - synthetics: { type: 'heartbeat/summary' }, - summary: { up: 1, down: 0 }, - timestamp: '2020-11-26T15:28:56.896Z', - docId: '0WErBXYB0mvWTKLO-yQm', - }; + checkGroup = 'f58a484f-2ffb-11eb-9b35-025000000001'; + timestamp = '2020-11-26T15:28:56.896Z'; }); it.each([[FETCH_STATUS.PENDING], [FETCH_STATUS.LOADING]])( @@ -70,7 +44,7 @@ describe('Ping Timestamp component', () => { .spyOn(observabilityPublic, 'useFetcher') .mockReturnValue({ status: fetchStatus, data: null, refetch: () => null }); const { getByTestId } = render( - + ); expect(getByTestId('pingTimestampSpinner')).toBeInTheDocument(); } @@ -81,7 +55,7 @@ describe('Ping Timestamp component', () => { .spyOn(observabilityPublic, 'useFetcher') .mockReturnValue({ status: FETCH_STATUS.SUCCESS, data: null, refetch: () => null }); const { getByTestId } = render( - + ); expect(getByTestId('pingTimestampNoImageAvailable')).toBeInTheDocument(); }); @@ -90,11 +64,11 @@ describe('Ping Timestamp component', () => { const src = 'http://sample.com/sampleImageSrc.png'; jest.spyOn(observabilityPublic, 'useFetcher').mockReturnValue({ status: FETCH_STATUS.SUCCESS, - data: { src }, + data: { maxSteps: 2, stepName: 'test', src }, refetch: () => null, }); const { container } = render( - + ); expect(container.querySelector('img')?.src).toBe(src); }); @@ -103,12 +77,37 @@ describe('Ping Timestamp component', () => { const src = 'http://sample.com/sampleImageSrc.png'; jest.spyOn(observabilityPublic, 'useFetcher').mockReturnValue({ status: FETCH_STATUS.SUCCESS, - data: { src }, + data: { maxSteps: 1, stepName: null, src }, refetch: () => null, }); const { getByAltText, getAllByText, queryByAltText } = render( - + ); + + const caption = getAllByText('Nov 26, 2020 10:28:56 AM'); + fireEvent.mouseEnter(caption[0]); + + const altText = `A larger version of the screenshot for this journey step's thumbnail.`; + + await waitFor(() => getByAltText(altText)); + + fireEvent.mouseLeave(caption[0]); + + await waitFor(() => expect(queryByAltText(altText)).toBeNull()); + }); + + it('handles screenshot ref data', async () => { + jest.spyOn(observabilityPublic, 'useFetcher').mockReturnValue({ + status: FETCH_STATUS.SUCCESS, + data: mockRef, + refetch: () => null, + }); + + const { getByAltText, getByText, getByRole, getAllByText, queryByAltText } = render( + + ); + + await waitFor(() => getByRole('img')); const caption = getAllByText('Nov 26, 2020 10:28:56 AM'); fireEvent.mouseEnter(caption[0]); @@ -119,5 +118,6 @@ describe('Ping Timestamp component', () => { fireEvent.mouseLeave(caption[0]); await waitFor(() => expect(queryByAltText(altText)).toBeNull()); + expect(getByText('Step: 1 of 1')); }); }); diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx index 16553e9de8604f..8e2dc1b4c24e0d 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/ping_timestamp.tsx @@ -9,7 +9,11 @@ import React, { useContext, useEffect, useState } from 'react'; import useIntersection from 'react-use/lib/useIntersection'; import styled from 'styled-components'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { Ping } from '../../../../../../common/runtime_types/ping'; +import { + isScreenshotImageBlob, + isScreenshotRef, + ScreenshotRefImageData, +} from '../../../../../../common/runtime_types/ping'; import { useFetcher, FETCH_STATUS } from '../../../../../../../observability/public'; import { getJourneyScreenshot } from '../../../../../state/api/journey'; import { UptimeSettingsContext } from '../../../../../contexts'; @@ -27,12 +31,12 @@ const StepDiv = styled.div` `; interface Props { + checkGroup?: string; label?: string; - ping: Ping; initialStepNo?: number; } -export const PingTimestamp = ({ label, ping, initialStepNo = 1 }: Props) => { +export const PingTimestamp = ({ label, checkGroup, initialStepNo = 1 }: Props) => { const [stepNumber, setStepNumber] = useState(initialStepNo); const [isImagePopoverOpen, setIsImagePopoverOpen] = useState(false); @@ -42,7 +46,7 @@ export const PingTimestamp = ({ label, ping, initialStepNo = 1 }: Props) => { const { basePath } = useContext(UptimeSettingsContext); - const imgPath = `${basePath}/api/uptime/journey/screenshot/${ping.monitor.check_group}/${stepNumber}`; + const imgPath = `${basePath}/api/uptime/journey/screenshot/${checkGroup}/${stepNumber}`; const intersection = useIntersection(intersectionRef, { root: null, @@ -55,13 +59,19 @@ export const PingTimestamp = ({ label, ping, initialStepNo = 1 }: Props) => { return getJourneyScreenshot(imgPath); }, [intersection?.intersectionRatio, stepNumber]); + const [screenshotRef, setScreenshotRef] = useState(undefined); useEffect(() => { - if (data) { + if (isScreenshotRef(data)) { + setScreenshotRef(data); + } else if (isScreenshotImageBlob(data)) { setStepImages((prevState) => [...prevState, data?.src]); } }, [data]); - const imgSrc = stepImages?.[stepNumber - 1] ?? data?.src; + let imgSrc; + if (isScreenshotImageBlob(data)) { + imgSrc = stepImages?.[stepNumber - 1] ?? data.src; + } const captionContent = formatCaptionContent(stepNumber, data?.maxSteps); @@ -71,6 +81,7 @@ export const PingTimestamp = ({ label, ping, initialStepNo = 1 }: Props) => { { onMouseLeave={() => setIsImagePopoverOpen(false)} ref={intersectionRef} > - {imgSrc ? ( + {(imgSrc || screenshotRef) && ( - ) : ( + )} + {!imgSrc && !screenshotRef && ( { let defaultProps: StepImageCaptionProps; @@ -91,4 +92,12 @@ describe('StepImageCaption', () => { getByText('test caption content'); }); + + it('renders caption content for screenshot ref data', async () => { + const { getByText } = render( + + ); + + getByText('test caption content'); + }); }); diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx index 80d41ccc23dc84..a2858348ed59ca 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/columns/ping_timestamp/step_image_caption.tsx @@ -9,10 +9,12 @@ import React, { MouseEvent, useEffect } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { nextAriaLabel, prevAriaLabel } from './translations'; import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; +import { ScreenshotRefImageData } from '../../../../../../common/runtime_types'; export interface StepImageCaptionProps { captionContent: string; imgSrc?: string; + imgRef?: ScreenshotRefImageData; maxSteps?: number; setStepNumber: React.Dispatch>; stepNumber: number; @@ -30,6 +32,7 @@ const ImageCaption = euiStyled.div` export const StepImageCaption: React.FC = ({ captionContent, + imgRef, imgSrc, maxSteps, setStepNumber, @@ -54,7 +57,7 @@ export const StepImageCaption: React.FC = ({ }} >
- {imgSrc && ( + {(imgSrc || imgRef) && ( = ({ + captionContent, + imageCaption, + imageData, +}) => + imageData ? ( + + ) : ( + + ); + +/** + * This component provides an intermediate step for composite images. It causes a loading spinner to appear + * while the image is being re-assembled, then calls the default image component and provides a data URL for the image. + */ +const RecomposedScreenshotImage: React.FC< + ScreenshotImageProps & { + imgRef: ScreenshotRefImageData; + setImageData: React.Dispatch; + imageData: string | undefined; + } +> = ({ captionContent, imageCaption, imageData, imgRef, setImageData }) => { + // initially an undefined URL value is passed to the image display, and a loading spinner is rendered. + // `useCompositeImage` will call `setUrl` when the image is composited, and the updated `url` will display. + useCompositeImage(imgRef, setImageData, imageData); + + return ( + + ); +}; + export interface StepImagePopoverProps { captionContent: string; imageCaption: JSX.Element; - imgSrc: string; + imgSrc?: string; + imgRef?: ScreenshotRefImageData; isImagePopoverOpen: boolean; } +const StepImageComponent: React.FC< + Omit & { + setImageData: React.Dispatch; + imageData: string | undefined; + } +> = ({ captionContent, imageCaption, imageData, imgRef, imgSrc, setImageData }) => { + if (imgSrc) { + return ( + + ); + } else if (imgRef) { + return ( + + ); + } + return null; +}; + export const StepImagePopover: React.FC = ({ captionContent, imageCaption, + imgRef, imgSrc, isImagePopoverOpen, -}) => ( - +}) => { + const [imageData, setImageData] = React.useState(imgSrc || undefined); + + React.useEffect(() => { + // for legacy screenshots, when a new image arrives, we must overwrite it + if (imgSrc && imgSrc !== imageData) { + setImageData(imgSrc); } - isOpen={isImagePopoverOpen} - closePopover={() => {}} - > - - -); + }, [imgSrc, imageData]); + + const setImageDataCallback = React.useCallback( + (newImageData: string | undefined) => setImageData(newImageData), + [setImageData] + ); + return ( + + } + isOpen={isImagePopoverOpen} + closePopover={() => {}} + > + {imageData ? ( + + ) : ( + + )} + + ); +}; diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.test.tsx index bf5b0215e7d7ab..c1853034478549 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.test.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.test.tsx @@ -62,7 +62,7 @@ describe('PingList component', () => { ...response, error: undefined, loading: false, - failedSteps: { steps: [], checkGroup: '1-f-4d-4f' }, + failedSteps: { steps: [], checkGroups: ['1-f-4d-4f'] }, }); }); @@ -72,7 +72,7 @@ describe('PingList component', () => { total: 0, error: undefined, loading: true, - failedSteps: { steps: [], checkGroup: '1-f-4d-4f' }, + failedSteps: { steps: [], checkGroups: ['1-f-4d-4f'] }, }); const { getByText } = render(); expect(getByText('Loading history...')).toBeInTheDocument(); @@ -84,7 +84,7 @@ describe('PingList component', () => { total: 0, error: undefined, loading: false, - failedSteps: { steps: [], checkGroup: '1-f-4d-4f' }, + failedSteps: { steps: [], checkGroups: ['1-f-4d-4f'] }, }); const { getByText } = render(); expect(getByText('No history found')).toBeInTheDocument(); diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx index 65644ce4939060..b9ad176b8ed761 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx @@ -145,7 +145,10 @@ export const PingList = () => { field: 'timestamp', name: TIMESTAMP_LABEL, render: (timestamp: string, item: Ping) => ( - + ), }, ] @@ -185,8 +188,8 @@ export const PingList = () => { name: i18n.translate('xpack.uptime.pingList.columns.failedStep', { defaultMessage: 'Failed step', }), - render: (timestamp: string, item: Ping) => ( - + render: (_timestamp: string, item: Ping) => ( + ), }, ] diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx b/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx index 8b85f05130d0bf..f64d36fa0f789d 100644 --- a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/use_monitor_breadcrumb.tsx @@ -10,13 +10,19 @@ import { i18n } from '@kbn/i18n'; import { useBreadcrumbs } from '../../../../hooks/use_breadcrumbs'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { JourneyState } from '../../../../state/reducers/journey'; -import { Ping } from '../../../../../common/runtime_types/ping'; import { PLUGIN } from '../../../../../common/constants/plugin'; import { getShortTimeStamp } from '../../../overview/monitor_list/columns/monitor_status_column'; +interface ActiveStep { + monitor: { + id: string; + name?: string; + }; +} + interface Props { details: JourneyState['details']; - activeStep?: Ping; + activeStep?: ActiveStep; performanceBreakDownView?: boolean; } diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx index 16068e0d72b460..1ba10da6ceace0 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/screenshot_link.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { ReactRouterEuiLink } from '../../../common/react_router_helpers'; -import { Ping } from '../../../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../../../common/runtime_types/ping/synthetics'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; const LabelLink = euiStyled.div` @@ -17,7 +17,7 @@ const LabelLink = euiStyled.div` `; interface Props { - lastSuccessfulStep: Ping; + lastSuccessfulStep: JourneyStep; } export const ScreenshotLink = ({ lastSuccessfulStep }: Props) => { diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx index eb7bc95751557c..316154929320da 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { StepScreenshotDisplay } from '../../step_screenshot_display'; -import { Ping } from '../../../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../../../common/runtime_types/ping/synthetics'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; import { useFetcher } from '../../../../../../observability/public'; import { fetchLastSuccessfulStep } from '../../../../state/api/journey'; @@ -24,21 +24,22 @@ const Label = euiStyled.div` `; interface Props { - step: Ping; + step: JourneyStep; } export const StepScreenshots = ({ step }: Props) => { const isSucceeded = step.synthetics?.payload?.status === 'succeeded'; - const { data: lastSuccessfulStep } = useFetcher(() => { + const { data } = useFetcher(() => { if (!isSucceeded) { return fetchLastSuccessfulStep({ - timestamp: step.timestamp, + timestamp: step['@timestamp'], monitorId: step.monitor.id, stepIndex: step.synthetics?.step?.index!, }); } - }, [step.docId, step.timestamp]); + }, [step._id, step['@timestamp']]); + const lastSuccessfulStep: JourneyStep | undefined = data; return ( @@ -59,26 +60,28 @@ export const StepScreenshots = ({ step }: Props) => { - + {!isSucceeded && lastSuccessfulStep?.monitor && ( - + )} diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_image.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_image.tsx index 69a5ef91a59259..8fbc26ac256927 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_image.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_image.tsx @@ -7,18 +7,21 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; -import { Ping } from '../../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../../common/runtime_types/ping/synthetics'; import { PingTimestamp } from '../../monitor/ping_list/columns/ping_timestamp'; interface Props { - step: Ping; + step: JourneyStep; } export const StepImage = ({ step }: Props) => { return ( - + {step.synthetics?.step?.name} diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_list.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.test.tsx similarity index 94% rename from x-pack/plugins/uptime/public/components/synthetics/check_steps/step_list.test.tsx rename to x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.test.tsx index 959bf0f6445800..738960eb2af3ef 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/step_list.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.test.tsx @@ -6,18 +6,18 @@ */ import React from 'react'; -import { Ping } from '../../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../../common/runtime_types/ping'; import { StepsList } from './steps_list'; import { render } from '../../../lib/helper/rtl_helpers'; describe('StepList component', () => { - let steps: Ping[]; + let steps: JourneyStep[]; beforeEach(() => { steps = [ { - docId: '1', - timestamp: '123', + _id: '1', + '@timestamp': '123', monitor: { id: 'MON_ID', duration: { @@ -39,8 +39,8 @@ describe('StepList component', () => { }, }, { - docId: '2', - timestamp: '124', + _id: '2', + '@timestamp': '124', monitor: { id: 'MON_ID', duration: { @@ -112,8 +112,8 @@ describe('StepList component', () => { it('uses appropriate count when non-step/end steps are included', () => { steps[0].synthetics!.payload!.status = 'succeeded'; steps.push({ - docId: '3', - timestamp: '125', + _id: '3', + '@timestamp': '125', monitor: { id: 'MON_ID', duration: { diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx index 47bf3ae0a17849..47b89e82dc5c7c 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx @@ -5,11 +5,17 @@ * 2.0. */ -import { EuiBasicTable, EuiButtonIcon, EuiPanel, EuiTitle } from '@elastic/eui'; +import { + EuiBasicTable, + EuiBasicTableColumn, + EuiButtonIcon, + EuiPanel, + EuiTitle, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { MouseEvent } from 'react'; import styled from 'styled-components'; -import { Ping } from '../../../../common/runtime_types'; +import { JourneyStep } from '../../../../common/runtime_types'; import { STATUS_LABEL } from '../../monitor/ping_list/translations'; import { COLLAPSE_LABEL, EXPAND_LABEL, STEP_NAME_LABEL } from '../translations'; import { StatusBadge } from '../status_badge'; @@ -23,7 +29,7 @@ export const SpanWithMargin = styled.span` `; interface Props { - data: Ping[]; + data: JourneyStep[]; error?: Error; loading: boolean; } @@ -34,7 +40,7 @@ interface StepStatusCount { succeeded: number; } -function isStepEnd(step: Ping) { +function isStepEnd(step: JourneyStep) { return step.synthetics?.type === 'step/end'; } @@ -62,7 +68,7 @@ function statusMessage(count: StepStatusCount, loading?: boolean) { }); } -function reduceStepStatus(prev: StepStatusCount, cur: Ping): StepStatusCount { +function reduceStepStatus(prev: StepStatusCount, cur: JourneyStep): StepStatusCount { if (cur.synthetics?.payload?.status === 'succeeded') { prev.succeeded += 1; return prev; @@ -75,15 +81,15 @@ function reduceStepStatus(prev: StepStatusCount, cur: Ping): StepStatusCount { } export const StepsList = ({ data, error, loading }: Props) => { - const steps = data.filter(isStepEnd); + const steps: JourneyStep[] = data.filter(isStepEnd); - const { expandedRows, toggleExpand } = useExpandedRow({ steps, allPings: data, loading }); + const { expandedRows, toggleExpand } = useExpandedRow({ steps, allSteps: data, loading }); - const columns: any[] = [ + const columns: Array> = [ { field: 'synthetics.payload.status', name: STATUS_LABEL, - render: (pingStatus: string, item: Ping) => ( + render: (pingStatus: string, item) => ( ), }, @@ -91,13 +97,13 @@ export const StepsList = ({ data, error, loading }: Props) => { align: 'left', field: 'timestamp', name: STEP_NAME_LABEL, - render: (timestamp: string, item: Ping) => , + render: (_timestamp: string, item) => , }, { align: 'left', field: 'timestamp', name: '', - render: (val: string, item: Ping) => ( + render: (_val: string, item) => ( { align: 'right', width: '24px', isExpander: true, - render: (ping: Ping) => { + render: (journeyStep: JourneyStep) => { return ( toggleExpand({ ping })} - aria-label={expandedRows[ping.docId] ? COLLAPSE_LABEL : EXPAND_LABEL} - iconType={expandedRows[ping.docId] ? 'arrowUp' : 'arrowDown'} + onClick={() => toggleExpand({ journeyStep })} + aria-label={expandedRows[journeyStep._id] ? COLLAPSE_LABEL : EXPAND_LABEL} + iconType={expandedRows[journeyStep._id] ? 'arrowUp' : 'arrowDown'} /> ); }, }, ]; - const getRowProps = (item: Ping) => { + const getRowProps = (item: JourneyStep) => { const { monitor } = item; return { @@ -134,7 +140,7 @@ export const StepsList = ({ data, error, loading }: Props) => { // we dont want to capture image click event if (targetElem.tagName !== 'IMG' && targetElem.tagName !== 'BUTTON') { - toggleExpand({ ping: item }); + toggleExpand({ journeyStep: item }); } }, }; diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx index d94122a7311ca3..a195001903f6cc 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.test.tsx @@ -13,7 +13,7 @@ import { createMemoryHistory } from 'history'; import { useExpandedRow } from './use_expanded_row'; import { render } from '../../../lib/helper/rtl_helpers'; -import { Ping } from '../../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../../common/runtime_types'; import { SYNTHETIC_CHECK_STEPS_ROUTE } from '../../../../common/constants'; import { COLLAPSE_LABEL, EXPAND_LABEL } from '../translations'; import { act } from 'react-dom/test-utils'; @@ -25,17 +25,16 @@ describe('useExpandedROw', () => { const history = createMemoryHistory({ initialEntries: ['/journey/fake-group/steps'], }); - const steps: Ping[] = [ + const steps: JourneyStep[] = [ { - docId: '1', - timestamp: '123', + _id: '1', + '@timestamp': '123', monitor: { id: 'MON_ID', duration: { us: 10, }, status: 'down', - type: 'browser', check_group: 'fake-group', }, synthetics: { @@ -50,15 +49,14 @@ describe('useExpandedROw', () => { }, }, { - docId: '2', - timestamp: '124', + _id: '2', + '@timestamp': '124', monitor: { id: 'MON_ID', duration: { us: 10, }, status: 'down', - type: 'browser', check_group: 'fake-group', }, synthetics: { @@ -77,7 +75,7 @@ describe('useExpandedROw', () => { const Component = () => { const { expandedRows, toggleExpand } = useExpandedRow({ steps, - allPings: steps, + allSteps: steps, loading: false, }); @@ -86,13 +84,13 @@ describe('useExpandedROw', () => { return ( Step list - {steps.map((ping, index) => ( + {steps.map((journeyStep, index) => ( toggleExpand({ ping })} - aria-label={expandedRows[ping.docId] ? COLLAPSE_LABEL : EXPAND_LABEL} - iconType={expandedRows[ping.docId] ? 'arrowUp' : 'arrowDown'} + onClick={() => toggleExpand({ journeyStep })} + aria-label={expandedRows[journeyStep._id] ? COLLAPSE_LABEL : EXPAND_LABEL} + iconType={expandedRows[journeyStep._id] ? 'arrowUp' : 'arrowDown'} /> ))} diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx index bb56b237dfbd20..24ef0d7fb7e8fc 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/use_expanded_row.tsx @@ -8,17 +8,17 @@ import React, { useEffect, useState, useCallback } from 'react'; import { useParams } from 'react-router-dom'; import { ExecutedStep } from '../executed_step'; -import { Ping } from '../../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../../common/runtime_types/ping'; interface HookProps { loading: boolean; - allPings: Ping[]; - steps: Ping[]; + allSteps: JourneyStep[]; + steps: JourneyStep[]; } type ExpandRowType = Record; -export const useExpandedRow = ({ loading, steps, allPings }: HookProps) => { +export const useExpandedRow = ({ loading, steps, allSteps }: HookProps) => { const [expandedRows, setExpandedRows] = useState({}); // eui table uses index from 0, synthetics uses 1 @@ -26,13 +26,13 @@ export const useExpandedRow = ({ loading, steps, allPings }: HookProps) => { const getBrowserConsole = useCallback( (index: number) => { - return allPings.find( + return allSteps.find( (stepF) => stepF.synthetics?.type === 'journey/browserconsole' && stepF.synthetics?.step?.index! === index )?.synthetics?.payload?.text; }, - [allPings] + [allSteps] ); useEffect(() => { @@ -60,9 +60,9 @@ export const useExpandedRow = ({ loading, steps, allPings }: HookProps) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [checkGroupId, loading]); - const toggleExpand = ({ ping }: { ping: Ping }) => { + const toggleExpand = ({ journeyStep }: { journeyStep: JourneyStep }) => { // eui table uses index from 0, synthetics uses 1 - const stepIndex = ping.synthetics?.step?.index! - 1; + const stepIndex = journeyStep.synthetics?.step?.index! - 1; // If already expanded, collapse if (expandedRows[stepIndex]) { @@ -74,9 +74,9 @@ export const useExpandedRow = ({ loading, steps, allPings }: HookProps) => { ...expandedRows, [stepIndex]: ( ), diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_event.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/console_event.test.tsx index 35cad2b8d6b9b8..b80613dbfece50 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/console_event.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/console_event.test.tsx @@ -15,9 +15,10 @@ describe('ConsoleEvent component', () => { shallowWithIntl( { shallowWithIntl( = ({ event }) => { @@ -28,7 +28,7 @@ export const ConsoleEvent: FC = ({ event }) => { return ( - {event.timestamp} + {event['@timestamp']} {event.synthetics?.type} diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.test.tsx index 3821748d4e92b5..d35e526208ae93 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.test.tsx @@ -5,147 +5,101 @@ * 2.0. */ -import { shallowWithIntl } from '@kbn/test/jest'; import React from 'react'; +import { JourneyStep } from '../../../common/runtime_types/ping/synthetics'; +import { render } from '../../lib/helper/rtl_helpers'; import { ConsoleOutputEventList } from './console_output_event_list'; describe('ConsoleOutputEventList component', () => { + let steps: JourneyStep[]; + + beforeEach(() => { + steps = [ + { + '@timestamp': '123', + _id: '1', + monitor: { + check_group: 'check_group', + id: 'MON_ID', + duration: { + us: 10, + }, + status: 'down', + type: 'browser', + }, + synthetics: { + type: 'stderr', + }, + }, + { + '@timestamp': '124', + _id: '2', + monitor: { + check_group: 'check_group', + id: 'MON_ID', + duration: { + us: 10, + }, + status: 'down', + type: 'browser', + }, + synthetics: { + type: 'cmd/status', + }, + }, + { + '@timestamp': '124', + _id: '2', + monitor: { + check_group: 'check_group', + id: 'MON_ID', + duration: { + us: 10, + }, + status: 'down', + type: 'browser', + }, + synthetics: { + type: 'step/end', + }, + }, + { + '@timestamp': '125', + _id: '3', + monitor: { + check_group: 'check_group', + id: 'MON_ID', + duration: { + us: 10, + }, + status: 'down', + type: 'browser', + }, + synthetics: { + type: 'stdout', + }, + }, + ]; + }); + it('renders a component per console event', () => { - expect( - shallowWithIntl( - - ).find('EuiCodeBlock') - ).toMatchInlineSnapshot(` - - - - - - `); + const { getByRole, getByText, queryByText } = render( + + ); + expect(getByRole('heading').innerHTML).toBe('No steps ran'); + steps + .filter((step) => step.synthetics.type !== 'step/end') + .forEach((step) => { + expect(getByText(step['@timestamp'])); + expect(getByText(step.synthetics.type)); + }); + expect(queryByText('step/end')).toBeNull(); }); }); diff --git a/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.tsx b/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.tsx index df4314e5ccf1cc..c34344717e3b44 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/console_output_event_list.tsx @@ -9,17 +9,17 @@ import { EuiCodeBlock, EuiSpacer, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { FC } from 'react'; import { ConsoleEvent } from './console_event'; -import { Ping } from '../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../common/runtime_types/ping'; import { JourneyState } from '../../state/reducers/journey'; interface Props { journey: JourneyState; } -const isConsoleStep = (step: Ping) => - step.synthetics?.type === 'stderr' || - step.synthetics?.type === 'stdout' || - step.synthetics?.type === 'cmd/status'; +const CONSOLE_STEP_TYPES = ['stderr', 'stdout', 'cmd/status']; + +const isConsoleStep = (step: JourneyStep) => + CONSOLE_STEP_TYPES.some((type) => type === step.synthetics.type); export const ConsoleOutputEventList: FC = ({ journey }) => (
@@ -41,7 +41,7 @@ export const ConsoleOutputEventList: FC = ({ journey }) => ( {journey.steps.filter(isConsoleStep).map((consoleEvent) => ( - + ))}
diff --git a/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx index 24b52e09adbf93..04fcf382fd8614 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/executed_step.test.tsx @@ -8,15 +8,16 @@ import React from 'react'; import { ExecutedStep } from './executed_step'; import { render } from '../../lib/helper/rtl_helpers'; -import { Ping } from '../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../common/runtime_types/ping'; describe('ExecutedStep', () => { - let step: Ping; + let step: JourneyStep; beforeEach(() => { step = { - docId: 'docID', + _id: 'docID', monitor: { + check_group: 'check_group', duration: { us: 123, }, @@ -29,8 +30,9 @@ describe('ExecutedStep', () => { index: 4, name: 'STEP_NAME', }, + type: 'step/end', }, - timestamp: 'timestamp', + '@timestamp': 'timestamp', }; }); @@ -43,6 +45,7 @@ describe('ExecutedStep', () => { index: 3, name: 'STEP_NAME', }, + type: 'step/end', }; const { getByText } = render(); @@ -57,6 +60,7 @@ describe('ExecutedStep', () => { message: 'There was an error executing the step.', stack: 'some.stack.trace.string', }, + type: 'an error type', }; const { getByText } = render(); diff --git a/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx b/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx index a77b3dfe3ba21b..c3016864c72a71 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/executed_step.tsx @@ -9,14 +9,14 @@ import { EuiLoadingSpinner, EuiSpacer, EuiText } from '@elastic/eui'; import React, { FC } from 'react'; import { i18n } from '@kbn/i18n'; import { CodeBlockAccordion } from './code_block_accordion'; -import { Ping } from '../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../common/runtime_types/ping'; import { euiStyled } from '../../../../../../src/plugins/kibana_react/common'; import { StepScreenshots } from './check_steps/step_expanded_row/step_screenshots'; const CODE_BLOCK_OVERFLOW_HEIGHT = 360; interface ExecutedStepProps { - step: Ping; + step: JourneyStep; index: number; loading: boolean; browserConsole?: string; diff --git a/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.test.tsx b/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.test.tsx index 52d2eacaf0e523..8d35df51c24211 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.test.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.test.tsx @@ -8,6 +8,18 @@ import React from 'react'; import { StepScreenshotDisplay } from './step_screenshot_display'; import { render } from '../../lib/helper/rtl_helpers'; +import * as observabilityPublic from '../../../../observability/public'; +import '../../lib/__mocks__/use_composite_image.mock'; +import { mockRef } from '../../lib/__mocks__/screenshot_ref.mock'; + +jest.mock('../../../../observability/public', () => { + const originalModule = jest.requireActual('../../../../observability/public'); + + return { + ...originalModule, + useFetcher: jest.fn().mockReturnValue({ data: null, status: 'success' }), + }; +}); jest.mock('react-use/lib/useIntersection', () => () => ({ isIntersecting: true, @@ -18,7 +30,8 @@ describe('StepScreenshotDisplayProps', () => { const { getByAltText } = render( @@ -29,7 +42,12 @@ describe('StepScreenshotDisplayProps', () => { it('uses alternative text when step name not available', () => { const { getByAltText } = render( - + ); expect(getByAltText('Screenshot')).toBeInTheDocument(); @@ -39,11 +57,32 @@ describe('StepScreenshotDisplayProps', () => { const { getByTestId } = render( ); expect(getByTestId('stepScreenshotImageUnavailable')).toBeInTheDocument(); }); + + it('displays screenshot thumbnail for ref', () => { + jest.spyOn(observabilityPublic, 'useFetcher').mockReturnValue({ + status: observabilityPublic.FETCH_STATUS.SUCCESS, + data: { ...mockRef }, + refetch: () => null, + }); + + const { getByAltText } = render( + + ); + + expect(getByAltText('Screenshot for step with name "STEP_NAME"')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.tsx b/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.tsx index 78c65b7d408033..1224a31cfabb40 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/step_screenshot_display.tsx @@ -5,16 +5,31 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiImage, EuiText } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiImage, + EuiLoadingSpinner, + EuiText, +} from '@elastic/eui'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useContext, useEffect, useRef, useState, FC } from 'react'; import useIntersection from 'react-use/lib/useIntersection'; +import { + isScreenshotRef as isAScreenshotRef, + ScreenshotRefImageData, +} from '../../../common/runtime_types'; import { UptimeSettingsContext, UptimeThemeContext } from '../../contexts'; +import { useFetcher } from '../../../../observability/public'; +import { getJourneyScreenshot } from '../../state/api/journey'; +import { useCompositeImage } from '../../hooks'; interface StepScreenshotDisplayProps { - screenshotExists?: boolean; + isScreenshotBlob: boolean; + isScreenshotRef: boolean; checkGroup?: string; stepIndex?: number; stepName?: string; @@ -36,9 +51,56 @@ const StepImage = styled(EuiImage)` } `; +const BaseStepImage = ({ + stepIndex, + stepName, + url, +}: Pick & { url?: string }) => { + if (!url) return ; + return ( + + ); +}; + +type ComposedStepImageProps = Pick & { + url: string | undefined; + imgRef: ScreenshotRefImageData; + setUrl: React.Dispatch; +}; + +const ComposedStepImage = ({ + stepIndex, + stepName, + url, + imgRef, + setUrl, +}: ComposedStepImageProps) => { + useCompositeImage(imgRef, setUrl, url); + if (!url) return ; + return ; +}; + export const StepScreenshotDisplay: FC = ({ checkGroup, - screenshotExists, + isScreenshotBlob: isScreenshotBlob, + isScreenshotRef, stepIndex, stepName, lazyLoad = true, @@ -64,60 +126,59 @@ export const StepScreenshotDisplay: FC = ({ } }, [hasIntersected, isIntersecting, setHasIntersected]); - let content: JSX.Element | null = null; const imgSrc = basePath + `/api/uptime/journey/screenshot/${checkGroup}/${stepIndex}`; - if ((hasIntersected || !lazyLoad) && screenshotExists) { - content = ( - - ); - } else if (screenshotExists === false) { - content = ( - - - - - - - - - - - - - ); - } + // When loading a legacy screenshot, set `url` to full-size screenshot path. + // Otherwise, we first need to composite the image. + const [url, setUrl] = useState(isScreenshotBlob ? imgSrc : undefined); + + // when the image is a composite, we need to fetch the data since we cannot specify a blob URL + const { data: screenshotRef } = useFetcher(() => { + if (isScreenshotRef) { + return getJourneyScreenshot(imgSrc); + } + }, [basePath, checkGroup, stepIndex, isScreenshotRef]); + + const shouldRenderImage = hasIntersected || !lazyLoad; return (
- {content} + {shouldRenderImage && isScreenshotBlob && ( + + )} + {shouldRenderImage && isScreenshotRef && isAScreenshotRef(screenshotRef) && ( + + )} + {!isScreenshotBlob && !isScreenshotRef && ( + + + + + + + + + + + + + )}
); }; diff --git a/x-pack/plugins/uptime/public/hooks/index.ts b/x-pack/plugins/uptime/public/hooks/index.ts index 2850af51bb1ef4..06b525a94600ff 100644 --- a/x-pack/plugins/uptime/public/hooks/index.ts +++ b/x-pack/plugins/uptime/public/hooks/index.ts @@ -5,9 +5,10 @@ * 2.0. */ -export * from './use_monitor'; -export * from './use_url_params'; -export * from './use_telemetry'; +export * from './use_composite_image'; export * from './update_kuery_string'; -export * from './use_cert_status'; +export * from './use_monitor'; export * from './use_search_text'; +export * from './use_cert_status'; +export * from './use_telemetry'; +export * from './use_url_params'; diff --git a/x-pack/plugins/uptime/public/hooks/use_composite_image.ts b/x-pack/plugins/uptime/public/hooks/use_composite_image.ts new file mode 100644 index 00000000000000..6db3d05b8c9689 --- /dev/null +++ b/x-pack/plugins/uptime/public/hooks/use_composite_image.ts @@ -0,0 +1,55 @@ +/* + * 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 { composeScreenshotRef } from '../lib/helper/compose_screenshot_images'; +import { ScreenshotRefImageData } from '../../common/runtime_types/ping/synthetics'; + +/** + * Checks if two refs are the same. If the ref is unchanged, there's no need + * to run the expensive draw procedure. + */ +function isNewRef(a: ScreenshotRefImageData, b: ScreenshotRefImageData): boolean { + if (typeof a === 'undefined' || typeof b === 'undefined') return false; + const stepA = a.ref.screenshotRef.synthetics.step; + const stepB = b.ref.screenshotRef.synthetics.step; + return stepA.index !== stepB.index || stepA.name !== stepB.name; +} + +/** + * Assembles the data for a composite image and returns the composite to a callback. + * @param imgRef the data and dimensions for the composite image. + * @param onComposeImageSuccess sends the composited image to this callback. + * @param imageData this is the composited image value, if it is truthy the function will skip the compositing process + */ +export const useCompositeImage = ( + imgRef: ScreenshotRefImageData, + onComposeImageSuccess: React.Dispatch, + imageData?: string +): void => { + const [curRef, setCurRef] = React.useState(imgRef); + + React.useEffect(() => { + const canvas = document.createElement('canvas'); + + async function compose() { + await composeScreenshotRef(imgRef, canvas); + const imgData = canvas.toDataURL('image/png', 1.0); + onComposeImageSuccess(imgData); + } + + // if the URL is truthy it means it's already been composed, so there + // is no need to call the function + if (typeof imageData === 'undefined' || isNewRef(imgRef, curRef)) { + compose(); + setCurRef(imgRef); + } + return () => { + canvas.parentElement?.removeChild(canvas); + }; + }, [imgRef, onComposeImageSuccess, curRef, imageData]); +}; diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/screenshot_ref.mock.ts b/x-pack/plugins/uptime/public/lib/__mocks__/screenshot_ref.mock.ts new file mode 100644 index 00000000000000..d3a005d9821682 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/__mocks__/screenshot_ref.mock.ts @@ -0,0 +1,62 @@ +/* + * 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 { ScreenshotRefImageData } from '../../../common/runtime_types'; + +export const mockRef: ScreenshotRefImageData = { + maxSteps: 1, + stepName: 'load homepage', + ref: { + screenshotRef: { + '@timestamp': '2021-06-08T19:42:30.257Z', + synthetics: { + package_version: '1.0.0-beta.2', + step: { name: 'load homepage', index: 1 }, + type: 'step/screenshot_ref', + }, + screenshot_ref: { + blocks: [ + { + top: 0, + left: 0, + width: 160, + hash: 'd518801fc523cf02727cd520f556c4113b3098c7', + height: 90, + }, + { + top: 0, + left: 160, + width: 160, + hash: 'fa90345d5d7b05b1601e9ee645e663bc358869e0', + height: 90, + }, + ], + width: 1280, + height: 720, + }, + monitor: { check_group: 'a567cc7a-c891-11eb-bdf9-3e22fb19bf97' }, + }, + blocks: [ + { + id: 'd518801fc523cf02727cd520f556c4113b3098c7', + synthetics: { + blob: + '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', + blob_mime: 'image/jpeg', + }, + }, + { + id: 'fa90345d5d7b05b1601e9ee645e663bc358869e0', + synthetics: { + blob: + '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', + blob_mime: 'image/jpeg', + }, + }, + ], + }, +}; diff --git a/x-pack/plugins/uptime/public/lib/__mocks__/use_composite_image.mock.ts b/x-pack/plugins/uptime/public/lib/__mocks__/use_composite_image.mock.ts new file mode 100644 index 00000000000000..c4ab83ae6ee5d2 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/__mocks__/use_composite_image.mock.ts @@ -0,0 +1,23 @@ +/* + * 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 { ScreenshotRefImageData } from '../../../common/runtime_types/ping/synthetics'; +import * as composeScreenshotImages from '../../hooks/use_composite_image'; + +jest + .spyOn(composeScreenshotImages, 'useCompositeImage') + .mockImplementation( + ( + _imgRef: ScreenshotRefImageData, + callback: React.Dispatch, + url?: string + ) => { + if (!url) { + callback('img src'); + } + } + ); diff --git a/x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.ts b/x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.ts new file mode 100644 index 00000000000000..7481a517d3c9e1 --- /dev/null +++ b/x-pack/plugins/uptime/public/lib/helper/compose_screenshot_images.ts @@ -0,0 +1,56 @@ +/* + * 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 { ScreenshotRefImageData } from '../../../common/runtime_types'; + +/** + * Draws image fragments on a canvas. + * @param data Contains overall image size, fragment dimensions, and the blobs of image data to render. + * @param canvas A canvas to use for the rendering. + * @returns A promise that will resolve when the final draw operation completes. + */ +export async function composeScreenshotRef( + data: ScreenshotRefImageData, + canvas: HTMLCanvasElement +) { + const { + ref: { screenshotRef, blocks }, + } = data; + + canvas.width = screenshotRef.screenshot_ref.width; + canvas.height = screenshotRef.screenshot_ref.height; + + const ctx = canvas.getContext('2d', { alpha: false }); + + /** + * We need to treat each operation as an async task, otherwise we will race between drawing image + * chunks and extracting the final data URL from the canvas; without this, the image could be blank or incomplete. + */ + const drawOperations: Array> = []; + + for (const block of screenshotRef.screenshot_ref.blocks) { + drawOperations.push( + new Promise((resolve, reject) => { + const img = new Image(); + const { top, left, width, height, hash } = block; + const blob = blocks.find((b) => b.id === hash); + if (!blob) { + reject(Error(`Error processing image. Expected image data with hash ${hash} is missing`)); + } else { + img.onload = () => { + ctx?.drawImage(img, left, top, width, height); + resolve(); + }; + img.src = `data:image/jpg;base64,${blob.synthetics.blob}`; + } + }) + ); + } + + // once all `draw` operations finish, caller can extract img string + return Promise.all(drawOperations); +} diff --git a/x-pack/plugins/uptime/public/state/api/journey.ts b/x-pack/plugins/uptime/public/state/api/journey.ts index 63796a66d1c5c9..4e71a07c70b68b 100644 --- a/x-pack/plugins/uptime/public/state/api/journey.ts +++ b/x-pack/plugins/uptime/public/state/api/journey.ts @@ -8,7 +8,12 @@ import { apiService } from './utils'; import { FetchJourneyStepsParams } from '../actions/journey'; import { - Ping, + FailedStepsApiResponse, + FailedStepsApiResponseType, + JourneyStep, + JourneyStepType, + ScreenshotImageBlob, + ScreenshotRefImageData, SyntheticsJourneyApiResponse, SyntheticsJourneyApiResponseType, } from '../../../common/runtime_types'; @@ -16,23 +21,23 @@ import { export async function fetchJourneySteps( params: FetchJourneyStepsParams ): Promise { - return (await apiService.get( + return apiService.get( `/api/uptime/journey/${params.checkGroup}`, { syntheticEventTypes: params.syntheticEventTypes }, SyntheticsJourneyApiResponseType - )) as SyntheticsJourneyApiResponse; + ); } export async function fetchJourneysFailedSteps({ checkGroups, }: { checkGroups: string[]; -}): Promise { - return (await apiService.get( +}): Promise { + return apiService.get( `/api/uptime/journeys/failed_steps`, { checkGroups }, - SyntheticsJourneyApiResponseType - )) as SyntheticsJourneyApiResponse; + FailedStepsApiResponseType + ); } export async function fetchLastSuccessfulStep({ @@ -43,15 +48,21 @@ export async function fetchLastSuccessfulStep({ monitorId: string; timestamp: string; stepIndex: number; -}): Promise { - return (await apiService.get(`/api/uptime/synthetics/step/success/`, { - monitorId, - timestamp, - stepIndex, - })) as Ping; +}): Promise { + return await apiService.get( + `/api/uptime/synthetics/step/success/`, + { + monitorId, + timestamp, + stepIndex, + }, + JourneyStepType + ); } -export async function getJourneyScreenshot(imgSrc: string) { +export async function getJourneyScreenshot( + imgSrc: string +): Promise { try { const imgRequest = new Request(imgSrc); @@ -61,16 +72,22 @@ export async function getJourneyScreenshot(imgSrc: string) { return null; } - const imgBlob = await response.blob(); - + const contentType = response.headers.get('content-type'); const stepName = response.headers.get('caption-name'); - const maxSteps = response.headers.get('max-steps'); - - return { - stepName, - maxSteps: Number(maxSteps ?? 0), - src: URL.createObjectURL(imgBlob), - }; + const maxSteps = Number(response.headers.get('max-steps') ?? 0); + if (contentType?.indexOf('application/json') !== -1) { + return { + stepName, + maxSteps, + ref: await response.json(), + }; + } else { + return { + stepName, + maxSteps, + src: URL.createObjectURL(await response.blob()), + }; + } } catch (e) { return null; } diff --git a/x-pack/plugins/uptime/public/state/reducers/journey.ts b/x-pack/plugins/uptime/public/state/reducers/journey.ts index 361454e1b3fa18..98bbd93a24e0c1 100644 --- a/x-pack/plugins/uptime/public/state/reducers/journey.ts +++ b/x-pack/plugins/uptime/public/state/reducers/journey.ts @@ -6,7 +6,7 @@ */ import { handleActions, Action } from 'redux-actions'; -import { Ping, SyntheticsJourneyApiResponse } from '../../../common/runtime_types'; +import { JourneyStep, SyntheticsJourneyApiResponse } from '../../../common/runtime_types'; import { pruneJourneyState } from '../actions/journey'; import { FetchJourneyStepsParams, @@ -18,7 +18,7 @@ import { export interface JourneyState { checkGroup: string; - steps: Ping[]; + steps: JourneyStep[]; details?: SyntheticsJourneyApiResponse['details']; loading: boolean; error?: Error; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_details.test.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_details.test.ts new file mode 100644 index 00000000000000..4d678021ce7842 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_details.test.ts @@ -0,0 +1,104 @@ +/* + * 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 { getJourneyDetails } from './get_journey_details'; +import { mockSearchResult } from './helper'; + +describe('getJourneyDetails', () => { + let mockData: unknown; + + beforeEach(() => { + mockData = { + _id: 'uTjtNHoBu1okBtVwOgMb', + _source: { + '@timestamp': '2021-06-22T18:13:19.013Z', + synthetics: { + package_version: '1.0.0-beta.2', + journey: { + name: 'inline', + id: 'inline', + }, + payload: { + source: + 'async ({ page, browser, params }) => {\n scriptFn.apply(null, [core_1.step, page, browser, params]);\n }', + params: {}, + }, + index: 0, + type: 'journey/start', + }, + monitor: { + name: 'My Monitor - inline', + timespan: { + lt: '2021-06-22T18:14:19.013Z', + gte: '2021-06-22T18:13:19.013Z', + }, + check_group: '85946468-d385-11eb-8848-acde48001122', + id: 'my-browser-monitor-inline', + type: 'browser', + status: 'up', + }, + }, + }; + }); + + it('formats ref detail data', async () => { + expect( + await getJourneyDetails({ + uptimeEsClient: mockSearchResult(mockData), + checkGroup: '85946468-d385-11eb-8848-acde48001122', + }) + ).toMatchInlineSnapshot(` + Object { + "journey": Object { + "@timestamp": "2021-06-22T18:13:19.013Z", + "_id": "uTjtNHoBu1okBtVwOgMb", + "monitor": Object { + "check_group": "85946468-d385-11eb-8848-acde48001122", + "id": "my-browser-monitor-inline", + "name": "My Monitor - inline", + "status": "up", + "timespan": Object { + "gte": "2021-06-22T18:13:19.013Z", + "lt": "2021-06-22T18:14:19.013Z", + }, + "type": "browser", + }, + "synthetics": Object { + "index": 0, + "journey": Object { + "id": "inline", + "name": "inline", + }, + "package_version": "1.0.0-beta.2", + "payload": Object { + "params": Object {}, + "source": "async ({ page, browser, params }) => { + scriptFn.apply(null, [core_1.step, page, browser, params]); + }", + }, + "type": "journey/start", + }, + }, + "next": Object { + "checkGroup": "85946468-d385-11eb-8848-acde48001122", + "timestamp": "2021-06-22T18:13:19.013Z", + }, + "previous": Object { + "checkGroup": "85946468-d385-11eb-8848-acde48001122", + "timestamp": "2021-06-22T18:13:19.013Z", + }, + "timestamp": "2021-06-22T18:13:19.013Z", + } + `); + }); + + it('returns null for 0 hits', async () => { + expect( + await getJourneyDetails({ uptimeEsClient: mockSearchResult([]), checkGroup: 'check_group' }) + ).toBe(null); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_details.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_details.ts index 6081cc3a7b7c8c..b389699e2074a8 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_journey_details.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_details.ts @@ -7,7 +7,10 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/api/types'; import { UMElasticsearchQueryFn } from '../adapters/framework'; -import { SyntheticsJourneyApiResponse } from '../../../common/runtime_types'; +import { + JourneyStep, + SyntheticsJourneyApiResponse, +} from '../../../common/runtime_types/ping/synthetics'; export interface GetJourneyDetails { checkGroup: string; @@ -39,8 +42,9 @@ export const getJourneyDetails: UMElasticsearchQueryFn< const { body: thisJourney } = await uptimeEsClient.search({ body: baseParams }); - if (thisJourney?.hits?.hits.length > 0) { - const thisJourneySource: any = thisJourney.hits.hits[0]._source; + if (thisJourney.hits.hits.length > 0) { + const { _id, _source } = thisJourney.hits.hits[0]; + const thisJourneySource = Object.assign({ _id }, _source) as JourneyStep; const baseSiblingParams = { query: { diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.test.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.test.ts new file mode 100644 index 00000000000000..58e5202c2bca24 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.test.ts @@ -0,0 +1,90 @@ +/* + * 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 { getJourneyFailedSteps } from './get_journey_failed_steps'; +import { mockSearchResult } from './helper'; + +describe('getJourneyFailedSteps', () => { + let mockData: unknown; + + beforeEach(() => { + mockData = { + _id: 'uTjtNHoBu1okBtVwOgMb', + _source: { + '@timestamp': '2021-06-22T18:13:19.013Z', + synthetics: { + package_version: '1.0.0-beta.2', + journey: { + name: 'inline', + id: 'inline', + }, + payload: { + source: + 'async ({ page, browser, params }) => {\n scriptFn.apply(null, [core_1.step, page, browser, params]);\n }', + params: {}, + }, + index: 0, + type: 'journey/start', + }, + monitor: { + name: 'My Monitor - inline', + timespan: { + lt: '2021-06-22T18:14:19.013Z', + gte: '2021-06-22T18:13:19.013Z', + }, + check_group: '85946468-d385-11eb-8848-acde48001122', + id: 'my-browser-monitor-inline', + type: 'browser', + status: 'up', + }, + }, + }; + }); + + it('formats failed steps', async () => { + expect( + await getJourneyFailedSteps({ + uptimeEsClient: mockSearchResult(mockData), + checkGroups: ['chg1', 'chg2'], + }) + ).toMatchInlineSnapshot(` + Array [ + Object { + "@timestamp": "2021-06-22T18:13:19.013Z", + "_id": "uTjtNHoBu1okBtVwOgMb", + "monitor": Object { + "check_group": "85946468-d385-11eb-8848-acde48001122", + "id": "my-browser-monitor-inline", + "name": "My Monitor - inline", + "status": "up", + "timespan": Object { + "gte": "2021-06-22T18:13:19.013Z", + "lt": "2021-06-22T18:14:19.013Z", + }, + "type": "browser", + }, + "synthetics": Object { + "index": 0, + "journey": Object { + "id": "inline", + "name": "inline", + }, + "package_version": "1.0.0-beta.2", + "payload": Object { + "params": Object {}, + "source": "async ({ page, browser, params }) => { + scriptFn.apply(null, [core_1.step, page, browser, params]); + }", + }, + "type": "journey/start", + }, + "timestamp": "2021-06-22T18:13:19.013Z", + }, + ] + `); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.ts index d98e2354601676..51e4fc671f0486 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_failed_steps.ts @@ -6,19 +6,18 @@ */ import { QueryDslQueryContainer } from '@elastic/elasticsearch/api/types'; -import { SearchHit } from '../../../../../../src/core/types/elasticsearch'; import { asMutableArray } from '../../../common/utils/as_mutable_array'; import { UMElasticsearchQueryFn } from '../adapters/framework'; -import { Ping } from '../../../common/runtime_types'; +import { JourneyStep } from '../../../common/runtime_types/ping/synthetics'; export interface GetJourneyStepsParams { checkGroups: string[]; } -export const getJourneyFailedSteps: UMElasticsearchQueryFn = async ({ - uptimeEsClient, - checkGroups, -}) => { +export const getJourneyFailedSteps: UMElasticsearchQueryFn< + GetJourneyStepsParams, + JourneyStep[] +> = async ({ uptimeEsClient, checkGroups }) => { const params = { query: { bool: { @@ -53,11 +52,11 @@ export const getJourneyFailedSteps: UMElasticsearchQueryFn>).map((h) => { - const source = h._source as Ping & { '@timestamp': string }; + return result.hits.hits.map(({ _id, _source }) => { + const step = Object.assign({ _id }, _source) as JourneyStep; return { - ...source, - timestamp: source['@timestamp'], + ...step, + timestamp: step['@timestamp'], }; - }) as unknown) as Ping; + }); }; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.test.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.test.ts new file mode 100644 index 00000000000000..3d8bc04a105652 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.test.ts @@ -0,0 +1,133 @@ +/* + * 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 { getJourneyScreenshot } from './get_journey_screenshot'; +import { mockSearchResult } from './helper'; + +describe('getJourneyScreenshot', () => { + it('returns screenshot data', async () => { + const screenshotResult = { + _id: 'id', + _source: { + synthetics: { + blob_mime: 'image/jpeg', + blob: 'image data', + step: { + name: 'load homepage', + }, + type: 'step/screenshot', + }, + }, + }; + expect( + await getJourneyScreenshot({ + uptimeEsClient: mockSearchResult([], { + // @ts-expect-error incomplete search result + step: { image: { hits: { hits: [screenshotResult] } } }, + }), + checkGroup: 'checkGroup', + stepIndex: 0, + }) + ).toEqual({ + synthetics: { + blob: 'image data', + blob_mime: 'image/jpeg', + step: { + name: 'load homepage', + }, + type: 'step/screenshot', + }, + totalSteps: 0, + }); + }); + + it('returns ref data', async () => { + const screenshotRefResult = { + _id: 'id', + _source: { + '@timestamp': '123', + monitor: { + check_group: 'check_group', + }, + screenshot_ref: { + width: 10, + height: 20, + blocks: [ + { + hash: 'hash1', + top: 0, + left: 0, + height: 2, + width: 4, + }, + { + hash: 'hash2', + top: 0, + left: 2, + height: 2, + width: 4, + }, + ], + }, + synthetics: { + package_version: 'v1.0.0', + step: { + name: 'name', + index: 0, + }, + type: 'step/screenshot_ref', + }, + }, + }; + expect( + await getJourneyScreenshot({ + uptimeEsClient: mockSearchResult([], { + // @ts-expect-error incomplete search result + step: { image: { hits: { hits: [screenshotRefResult] } } }, + }), + checkGroup: 'checkGroup', + stepIndex: 0, + }) + ).toMatchInlineSnapshot(` + Object { + "@timestamp": "123", + "monitor": Object { + "check_group": "check_group", + }, + "screenshot_ref": Object { + "blocks": Array [ + Object { + "hash": "hash1", + "height": 2, + "left": 0, + "top": 0, + "width": 4, + }, + Object { + "hash": "hash2", + "height": 2, + "left": 2, + "top": 0, + "width": 4, + }, + ], + "height": 20, + "width": 10, + }, + "synthetics": Object { + "package_version": "v1.0.0", + "step": Object { + "index": 0, + "name": "name", + }, + "type": "step/screenshot_ref", + }, + "totalSteps": 0, + } + `); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.ts index 2c56d415071658..3d95d35aa90d09 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot.ts @@ -6,30 +6,22 @@ */ import { QueryDslQueryContainer } from '@elastic/elasticsearch/api/types'; -import { UMElasticsearchQueryFn } from '../adapters/framework'; -import { Ping } from '../../../common/runtime_types/ping'; +import { UMElasticsearchQueryFn } from '../adapters'; +import { RefResult, FullScreenshot } from '../../../common/runtime_types/ping/synthetics'; -export interface GetJourneyScreenshotParams { - checkGroup: string; - stepIndex: number; +interface ResultType { + _source: RefResult | FullScreenshot; } -export interface GetJourneyScreenshotResults { - blob: string | null; - mimeType: string | null; - stepName: string; - totalSteps: number; -} +export type ScreenshotReturnTypesUnion = + | ((FullScreenshot | RefResult) & { totalSteps: number }) + | null; export const getJourneyScreenshot: UMElasticsearchQueryFn< - GetJourneyScreenshotParams, - any -> = async ({ - uptimeEsClient, - checkGroup, - stepIndex, -}): Promise => { - const params = { + { checkGroup: string; stepIndex: number }, + ScreenshotReturnTypesUnion +> = async ({ checkGroup, stepIndex, uptimeEsClient }) => { + const body = { track_total_hits: true, size: 0, query: { @@ -41,8 +33,8 @@ export const getJourneyScreenshot: UMElasticsearchQueryFn< }, }, { - term: { - 'synthetics.type': 'step/screenshot', + terms: { + 'synthetics.type': ['step/screenshot', 'step/screenshot_ref'], }, }, ] as QueryDslQueryContainer[], @@ -59,25 +51,22 @@ export const getJourneyScreenshot: UMElasticsearchQueryFn< image: { top_hits: { size: 1, - _source: ['synthetics.blob', 'synthetics.blob_mime', 'synthetics.step.name'], }, }, }, }, }, }; - const { body: result } = await uptimeEsClient.search({ body: params }); - if (result?.hits?.total.value < 1) { - return null; - } + const result = await uptimeEsClient.search({ body }); + + const screenshotsOrRefs = + (result.body.aggregations?.step.image.hits.hits as ResultType[]) ?? null; - const stepHit = result?.aggregations?.step.image.hits.hits[0]?._source as Ping; + if (screenshotsOrRefs.length === 0) return null; return { - blob: stepHit?.synthetics?.blob ?? null, - mimeType: stepHit?.synthetics?.blob_mime ?? null, - stepName: stepHit?.synthetics?.step?.name ?? '', - totalSteps: result?.hits?.total.value, + ...screenshotsOrRefs[0]._source, + totalSteps: result.body.hits.total.value, }; }; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.test.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.test.ts new file mode 100644 index 00000000000000..32e4b730e80ab9 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.test.ts @@ -0,0 +1,56 @@ +/* + * 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 { getJourneyScreenshotBlocks } from './get_journey_screenshot_blocks'; +import { mockSearchResult } from './helper'; + +describe('getJourneyScreenshotBlocks', () => { + it('returns formatted blocks', async () => { + expect( + await getJourneyScreenshotBlocks({ + uptimeEsClient: mockSearchResult([ + { + _id: 'hash1', + _source: { + synthetics: { + blob: 'image data', + blob_mime: 'image/jpeg', + }, + }, + }, + { + _id: 'hash2', + _source: { + synthetics: { + blob: 'image data', + blob_mime: 'image/jpeg', + }, + }, + }, + ]), + blockIds: ['hash1', 'hash2'], + }) + ).toMatchInlineSnapshot(` + Array [ + Object { + "id": "hash1", + "synthetics": Object { + "blob": "image data", + "blob_mime": "image/jpeg", + }, + }, + Object { + "id": "hash2", + "synthetics": Object { + "blob": "image data", + "blob_mime": "image/jpeg", + }, + }, + ] + `); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.ts new file mode 100644 index 00000000000000..3d904ef47e6020 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_screenshot_blocks.ts @@ -0,0 +1,51 @@ +/* + * 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 { ScreenshotBlockDoc } from '../../../common/runtime_types/ping/synthetics'; +import { UMElasticsearchQueryFn } from '../adapters/framework'; + +interface ScreenshotBlockResultType { + _id: string; + _source: { + synthetics: { + blob: string; + blob_mime: string; + }; + }; +} + +export const getJourneyScreenshotBlocks: UMElasticsearchQueryFn< + { blockIds: string[] }, + ScreenshotBlockDoc[] +> = async ({ blockIds, uptimeEsClient }) => { + const body = { + query: { + bool: { + filter: [ + { + ids: { + values: blockIds, + }, + }, + ], + }, + }, + size: 1000, + }; + + const fetchScreenshotBlocksResult = await uptimeEsClient.search({ body }); + + return (fetchScreenshotBlocksResult.body.hits.hits as ScreenshotBlockResultType[]).map( + ({ _id, _source }) => ({ + id: _id, + synthetics: { + blob: _source.synthetics.blob, + blob_mime: _source.synthetics.blob_mime, + }, + }) + ); +}; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.test.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.test.ts index af7752b05997e6..b14a13b50432d1 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.test.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.test.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { JourneyStep } from '../../../common/runtime_types/ping/synthetics'; import { getJourneySteps, formatSyntheticEvents } from './get_journey_steps'; import { getUptimeESMockClient } from './helper'; @@ -13,10 +14,11 @@ describe('getJourneySteps request module', () => { it('returns default steps if none are provided', () => { expect(formatSyntheticEvents()).toMatchInlineSnapshot(` Array [ - "step/end", "cmd/status", - "step/screenshot", "journey/browserconsole", + "step/end", + "step/screenshot", + "step/screenshot_ref", ] `); }); @@ -107,8 +109,8 @@ describe('getJourneySteps request module', () => { it('formats ES result', async () => { const { esClient: mockEsClient, uptimeEsClient } = getUptimeESMockClient(); - mockEsClient.search.mockResolvedValueOnce(data as any); - const result: any = await getJourneySteps({ + mockEsClient.search.mockResolvedValueOnce(data); + const result: JourneyStep[] = await getJourneySteps({ uptimeEsClient, checkGroup: '2bf952dc-64b5-11eb-8b3b-42010a84000d', }); @@ -120,10 +122,11 @@ describe('getJourneySteps request module', () => { Object { "terms": Object { "synthetics.type": Array [ - "step/end", "cmd/status", - "step/screenshot", "journey/browserconsole", + "step/end", + "step/screenshot", + "step/screenshot_ref", ], }, } @@ -156,10 +159,12 @@ describe('getJourneySteps request module', () => { expect(result).toHaveLength(2); // `getJourneySteps` is responsible for formatting these fields, so we need to check them - result.forEach((step: any) => { - expect(['2021-02-01T17:45:19.001Z', '2021-02-01T17:45:49.944Z']).toContain(step.timestamp); - expect(['o6myXncBFt2V8m6r6z-r', 'IjqzXncBn2sjqrYxYoCG']).toContain(step.docId); - expect(step.synthetics.screenshotExists).toBeDefined(); + result.forEach((step: JourneyStep) => { + expect(['2021-02-01T17:45:19.001Z', '2021-02-01T17:45:49.944Z']).toContain( + step['@timestamp'] + ); + expect(['o6myXncBFt2V8m6r6z-r', 'IjqzXncBn2sjqrYxYoCG']).toContain(step._id); + expect(step.synthetics.isFullScreenshot).toBeDefined(); }); }); @@ -168,9 +173,9 @@ describe('getJourneySteps request module', () => { data.body.hits.hits[0]._source.synthetics.type = 'step/screenshot'; data.body.hits.hits[0]._source.synthetics.step.index = 2; - mockEsClient.search.mockResolvedValueOnce(data as any); + mockEsClient.search.mockResolvedValueOnce(data); - const result: any = await getJourneySteps({ + const result: JourneyStep[] = await getJourneySteps({ uptimeEsClient, checkGroup: '2bf952dc-64b5-11eb-8b3b-42010a84000d', syntheticEventTypes: ['stderr', 'step/end'], @@ -191,7 +196,7 @@ describe('getJourneySteps request module', () => { `); expect(result).toHaveLength(1); - expect(result[0].synthetics.screenshotExists).toBe(true); + expect(result[0].synthetics.isFullScreenshot).toBe(true); }); }); }); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.ts b/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.ts index 95aadc776fa765..fe77e2d63d2f14 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_journey_steps.ts @@ -6,17 +6,22 @@ */ import { QueryDslQueryContainer } from '@elastic/elasticsearch/api/types'; -import { SearchHit } from 'src/core/types/elasticsearch/search'; import { asMutableArray } from '../../../common/utils/as_mutable_array'; import { UMElasticsearchQueryFn } from '../adapters/framework'; -import { Ping } from '../../../common/runtime_types'; +import { JourneyStep } from '../../../common/runtime_types/ping/synthetics'; export interface GetJourneyStepsParams { checkGroup: string; syntheticEventTypes?: string | string[]; } -const defaultEventTypes = ['step/end', 'cmd/status', 'step/screenshot', 'journey/browserconsole']; +const defaultEventTypes = [ + 'cmd/status', + 'journey/browserconsole', + 'step/end', + 'step/screenshot', + 'step/screenshot_ref', +]; export const formatSyntheticEvents = (eventTypes?: string | string[]) => { if (!eventTypes) { @@ -26,11 +31,12 @@ export const formatSyntheticEvents = (eventTypes?: string | string[]) => { } }; -export const getJourneySteps: UMElasticsearchQueryFn = async ({ - uptimeEsClient, - checkGroup, - syntheticEventTypes, -}) => { +type ResultType = JourneyStep & { '@timestamp': string }; + +export const getJourneySteps: UMElasticsearchQueryFn< + GetJourneyStepsParams, + JourneyStep[] +> = async ({ uptimeEsClient, checkGroup, syntheticEventTypes }) => { const params = { query: { bool: { @@ -53,28 +59,43 @@ export const getJourneySteps: UMElasticsearchQueryFn>) - .filter((h) => h._source?.synthetics?.type === 'step/screenshot') - .map((h) => h._source?.synthetics?.step?.index as number); + const steps = result.hits.hits.map( + ({ _id, _source }) => Object.assign({ _id }, _source) as ResultType + ); + + const screenshotIndexList: number[] = []; + const refIndexList: number[] = []; + const stepsWithoutImages: ResultType[] = []; - return ((result.hits.hits as Array>) - .filter((h) => h._source?.synthetics?.type !== 'step/screenshot') - .map((h) => { - const source = h._source as Ping & { '@timestamp': string }; - return { - ...source, - timestamp: source['@timestamp'], - docId: h._id, - synthetics: { - ...source.synthetics, - screenshotExists: screenshotIndexes.some((i) => i === source.synthetics?.step?.index), - }, - }; - }) as unknown) as Ping; + /** + * Store screenshot indexes, we use these to determine if a step has a screenshot below. + * Store steps that are not screenshots, we return these to the client. + */ + for (const step of steps) { + const { synthetics } = step; + if (synthetics.type === 'step/screenshot' && synthetics?.step?.index) { + screenshotIndexList.push(synthetics.step.index); + } else if (synthetics.type === 'step/screenshot_ref' && synthetics?.step?.index) { + refIndexList.push(synthetics.step.index); + } else { + stepsWithoutImages.push(step); + } + } + + return stepsWithoutImages.map(({ _id, ...rest }) => ({ + _id, + ...rest, + timestamp: rest['@timestamp'], + synthetics: { + ...rest.synthetics, + isFullScreenshot: screenshotIndexList.some((i) => i === rest?.synthetics?.step?.index), + isScreenshotRef: refIndexList.some((i) => i === rest?.synthetics?.step?.index), + }, + })); }; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_last_successful_step.ts b/x-pack/plugins/uptime/server/lib/requests/get_last_successful_step.ts index 6f88e7e37e55e6..6d0f72052e5868 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_last_successful_step.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_last_successful_step.ts @@ -7,7 +7,7 @@ import { estypes } from '@elastic/elasticsearch'; import { UMElasticsearchQueryFn } from '../adapters/framework'; -import { Ping } from '../../../common/runtime_types/ping'; +import { JourneyStep } from '../../../common/runtime_types/ping'; export interface GetStepScreenshotParams { monitorId: string; @@ -17,7 +17,7 @@ export interface GetStepScreenshotParams { export const getStepLastSuccessfulStep: UMElasticsearchQueryFn< GetStepScreenshotParams, - any + JourneyStep | null > = async ({ uptimeEsClient, monitorId, stepIndex, timestamp }) => { const lastSuccessCheckParams: estypes.SearchRequest['body'] = { size: 1, @@ -65,11 +65,11 @@ export const getStepLastSuccessfulStep: UMElasticsearchQueryFn< const { body: result } = await uptimeEsClient.search({ body: lastSuccessCheckParams }); - if (result?.hits?.total.value < 1) { + if (result.hits.total.value < 1) { return null; } - const step = result?.hits.hits[0]._source as Ping & { '@timestamp': string }; + const step = result.hits.hits[0]._source as JourneyStep & { '@timestamp': string }; return { ...step, diff --git a/x-pack/plugins/uptime/server/lib/requests/helper.ts b/x-pack/plugins/uptime/server/lib/requests/helper.ts index c637c050946671..c33b15200a7815 100644 --- a/x-pack/plugins/uptime/server/lib/requests/helper.ts +++ b/x-pack/plugins/uptime/server/lib/requests/helper.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SearchResponse } from '@elastic/elasticsearch/api/types'; +import { AggregationsAggregate, SearchResponse } from '@elastic/elasticsearch/api/types'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ElasticsearchClientMock } from 'src/core/server/elasticsearch/client/mocks'; import { @@ -81,3 +81,34 @@ export const getUptimeESMockClient = ( }), }; }; + +export function mockSearchResult( + data: unknown, + aggregations: Record = {} +): UptimeESClient { + const { esClient: mockEsClient, uptimeEsClient } = getUptimeESMockClient(); + + // @ts-expect-error incomplete search response + mockEsClient.search.mockResolvedValue({ + body: { + took: 18, + timed_out: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + hits: Array.isArray(data) ? data : [data], + max_score: 0.0, + total: { + value: Array.isArray(data) ? data.length : 0, + relation: 'gte', + }, + }, + aggregations, + }, + }); + return uptimeEsClient; +} diff --git a/x-pack/plugins/uptime/server/lib/requests/index.ts b/x-pack/plugins/uptime/server/lib/requests/index.ts index 24109245c29021..587a4301ba9e52 100644 --- a/x-pack/plugins/uptime/server/lib/requests/index.ts +++ b/x-pack/plugins/uptime/server/lib/requests/index.ts @@ -25,6 +25,7 @@ import { getJourneyDetails } from './get_journey_details'; import { getNetworkEvents } from './get_network_events'; import { getJourneyFailedSteps } from './get_journey_failed_steps'; import { getStepLastSuccessfulStep } from './get_last_successful_step'; +import { getJourneyScreenshotBlocks } from './get_journey_screenshot_blocks'; export const requests = { getCerts, @@ -45,6 +46,7 @@ export const requests = { getJourneyFailedSteps, getStepLastSuccessfulStep, getJourneyScreenshot, + getJourneyScreenshotBlocks, getJourneyDetails, getNetworkEvents, }; diff --git a/x-pack/plugins/uptime/server/rest_api/index.ts b/x-pack/plugins/uptime/server/rest_api/index.ts index 91b5597321ed0c..d4d0e13bd23dba 100644 --- a/x-pack/plugins/uptime/server/rest_api/index.ts +++ b/x-pack/plugins/uptime/server/rest_api/index.ts @@ -12,6 +12,7 @@ import { createGetPingsRoute, createJourneyRoute, createJourneyScreenshotRoute, + createJourneyScreenshotBlockRoute, } from './pings'; import { createGetDynamicSettingsRoute, createPostDynamicSettingsRoute } from './dynamic_settings'; import { createLogPageViewRoute } from './telemetry'; @@ -51,6 +52,7 @@ export const restApiRoutes: UMRestApiRouteFactory[] = [ createGetMonitorDurationRoute, createJourneyRoute, createJourneyScreenshotRoute, + createJourneyScreenshotBlockRoute, createNetworkEventsRoute, createJourneyFailedStepsRoute, createLastSuccessfulStepRoute, diff --git a/x-pack/plugins/uptime/server/rest_api/pings/index.ts b/x-pack/plugins/uptime/server/rest_api/pings/index.ts index 61e3cea6d02515..45cd23dea42ed6 100644 --- a/x-pack/plugins/uptime/server/rest_api/pings/index.ts +++ b/x-pack/plugins/uptime/server/rest_api/pings/index.ts @@ -9,3 +9,4 @@ export { createGetPingsRoute } from './get_pings'; export { createGetPingHistogramRoute } from './get_ping_histogram'; export { createJourneyRoute } from './journeys'; export { createJourneyScreenshotRoute } from './journey_screenshots'; +export { createJourneyScreenshotBlockRoute } from './journey_screenshot_blocks'; diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.ts b/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.ts new file mode 100644 index 00000000000000..63c2cfe7e2d480 --- /dev/null +++ b/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshot_blocks.ts @@ -0,0 +1,53 @@ +/* + * 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 * as t from 'io-ts'; +import { isRight } from 'fp-ts/lib/Either'; +import { schema } from '@kbn/config-schema'; +import { UMServerLibs } from '../../lib/lib'; +import { UMRestApiRouteFactory } from '../types'; +import { ScreenshotBlockDoc } from '../../../common/runtime_types/ping/synthetics'; + +export const createJourneyScreenshotBlockRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({ + method: 'GET', + path: '/api/uptime/journey/screenshot/block', + validate: { + query: schema.object({ + hash: schema.oneOf([schema.string(), schema.arrayOf(schema.string())]), + _inspect: schema.maybe(schema.boolean()), + }), + }, + handler: async ({ request, response, uptimeEsClient }) => { + const { hash } = request.query; + + const decoded = t.union([t.string, t.array(t.string)]).decode(hash); + if (!isRight(decoded)) { + return response.badRequest(); + } + const { right: data } = decoded; + let result: ScreenshotBlockDoc[]; + try { + result = await libs.requests.getJourneyScreenshotBlocks({ + blockIds: Array.isArray(data) ? data : [data], + uptimeEsClient, + }); + } catch (e: unknown) { + return response.custom({ statusCode: 500, body: { message: e } }); + } + if (result.length === 0) { + return response.notFound(); + } + return response.ok({ + body: result, + headers: { + // we can cache these blocks with extreme prejudice as they are inherently unchanging + // when queried by ID, since the ID is the hash of the data + 'Cache-Control': 'max-age=604800', + }, + }); + }, +}); diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.ts b/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.ts index 4d8c8f86ddf2d1..bd7cf6af4f8439 100644 --- a/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.ts +++ b/x-pack/plugins/uptime/server/rest_api/pings/journey_screenshots.ts @@ -6,9 +6,23 @@ */ import { schema } from '@kbn/config-schema'; +import { + isRefResult, + isFullScreenshot, + ScreenshotBlockDoc, +} from '../../../common/runtime_types/ping/synthetics'; import { UMServerLibs } from '../../lib/lib'; +import { ScreenshotReturnTypesUnion } from '../../lib/requests/get_journey_screenshot'; import { UMRestApiRouteFactory } from '../types'; +function getSharedHeaders(stepName: string, totalSteps: number) { + return { + 'cache-control': 'max-age=600', + 'caption-name': stepName, + 'max-steps': String(totalSteps), + }; +} + export const createJourneyScreenshotRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({ method: 'GET', path: '/api/uptime/journey/screenshot/{checkGroup}/{stepIndex}', @@ -25,23 +39,49 @@ export const createJourneyScreenshotRoute: UMRestApiRouteFactory = (libs: UMServ handler: async ({ uptimeEsClient, request, response }) => { const { checkGroup, stepIndex } = request.params; - const result = await libs.requests.getJourneyScreenshot({ - uptimeEsClient, - checkGroup, - stepIndex, - }); + let result: ScreenshotReturnTypesUnion | null = null; + try { + result = await libs.requests.getJourneyScreenshot({ + uptimeEsClient, + checkGroup, + stepIndex, + }); + } catch (e) { + return response.customError({ body: { message: e }, statusCode: 500 }); + } + + if (isFullScreenshot(result)) { + if (!result.synthetics.blob) { + return response.notFound(); + } - if (result === null || !result.blob) { - return response.notFound(); + return response.ok({ + body: Buffer.from(result.synthetics.blob, 'base64'), + headers: { + 'content-type': result.synthetics.blob_mime || 'image/png', // falls back to 'image/png' for earlier versions of synthetics + ...getSharedHeaders(result.synthetics.step.name, result.totalSteps), + }, + }); + } else if (isRefResult(result)) { + const blockIds = result.screenshot_ref.blocks.map(({ hash }) => hash); + let blocks: ScreenshotBlockDoc[]; + try { + blocks = await libs.requests.getJourneyScreenshotBlocks({ + uptimeEsClient, + blockIds, + }); + } catch (e: unknown) { + return response.custom({ statusCode: 500, body: { message: e } }); + } + return response.ok({ + body: { + screenshotRef: result, + blocks, + }, + headers: getSharedHeaders(result.synthetics.step.name, result.totalSteps ?? 0), + }); } - return response.ok({ - body: Buffer.from(result.blob, 'base64'), - headers: { - 'content-type': result.mimeType || 'image/png', // falls back to 'image/png' for earlier versions of synthetics - 'cache-control': 'max-age=600', - 'caption-name': result.stepName, - 'max-steps': result.totalSteps, - }, - }); + + return response.notFound(); }, }); diff --git a/x-pack/plugins/uptime/server/rest_api/pings/journeys.ts b/x-pack/plugins/uptime/server/rest_api/pings/journeys.ts index 31555be25b2ffe..284feda2c662b6 100644 --- a/x-pack/plugins/uptime/server/rest_api/pings/journeys.ts +++ b/x-pack/plugins/uptime/server/rest_api/pings/journeys.ts @@ -25,27 +25,31 @@ export const createJourneyRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => _inspect: schema.maybe(schema.boolean()), }), }, - handler: async ({ uptimeEsClient, request }): Promise => { + handler: async ({ uptimeEsClient, request, response }): Promise => { const { checkGroup } = request.params; const { syntheticEventTypes } = request.query; - const [result, details] = await Promise.all([ - await libs.requests.getJourneySteps({ - uptimeEsClient, - checkGroup, - syntheticEventTypes, - }), - await libs.requests.getJourneyDetails({ - uptimeEsClient, - checkGroup, - }), - ]); + try { + const [result, details] = await Promise.all([ + await libs.requests.getJourneySteps({ + uptimeEsClient, + checkGroup, + syntheticEventTypes, + }), + await libs.requests.getJourneyDetails({ + uptimeEsClient, + checkGroup, + }), + ]); - return { - checkGroup, - steps: result, - details, - }; + return { + checkGroup, + steps: result, + details, + }; + } catch (e: unknown) { + return response.custom({ statusCode: 500, body: { message: e } }); + } }, }); @@ -58,16 +62,19 @@ export const createJourneyFailedStepsRoute: UMRestApiRouteFactory = (libs: UMSer _inspect: schema.maybe(schema.boolean()), }), }, - handler: async ({ uptimeEsClient, request }): Promise => { + handler: async ({ uptimeEsClient, request, response }): Promise => { const { checkGroups } = request.query; - const result = await libs.requests.getJourneyFailedSteps({ - uptimeEsClient, - checkGroups, - }); - - return { - checkGroups, - steps: result, - }; + try { + const result = await libs.requests.getJourneyFailedSteps({ + uptimeEsClient, + checkGroups, + }); + return { + checkGroups, + steps: result, + }; + } catch (e) { + return response.customError({ statusCode: 500, body: e }); + } }, }); diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics/last_successful_step.ts b/x-pack/plugins/uptime/server/rest_api/synthetics/last_successful_step.ts index c326037b9ecbf1..cb90de50e25108 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics/last_successful_step.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics/last_successful_step.ts @@ -6,6 +6,11 @@ */ import { schema } from '@kbn/config-schema'; +import { + isRefResult, + isFullScreenshot, + JourneyStep, +} from '../../../common/runtime_types/ping/synthetics'; import { UMServerLibs } from '../../lib/lib'; import { UMRestApiRouteFactory } from '../types'; @@ -23,11 +28,36 @@ export const createLastSuccessfulStepRoute: UMRestApiRouteFactory = (libs: UMSer handler: async ({ uptimeEsClient, request, response }) => { const { timestamp, monitorId, stepIndex } = request.query; - return await libs.requests.getStepLastSuccessfulStep({ + const step: JourneyStep | null = await libs.requests.getStepLastSuccessfulStep({ uptimeEsClient, monitorId, stepIndex, timestamp, }); + + if (step === null) { + return response.notFound(); + } + + if (!step.synthetics?.step?.index) { + return response.ok({ body: step }); + } + + const screenshot = await libs.requests.getJourneyScreenshot({ + uptimeEsClient, + checkGroup: step.monitor.check_group, + stepIndex: step.synthetics.step.index, + }); + + if (screenshot === null) { + return response.ok({ body: step }); + } + + step.synthetics.isScreenshotRef = isRefResult(screenshot); + step.synthetics.isFullScreenshot = isFullScreenshot(screenshot); + + return response.ok({ + body: step, + }); }, }); From 5aa83052793790cffe6ae5c0e037527425485c23 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 29 Jun 2021 14:14:18 +0200 Subject: [PATCH 079/227] [Exploratory vie] Added synthetics metrics (#103482) --- .../constants/field_names/synthetics.ts | 5 ++ .../configurations/constants/labels.ts | 11 ++++ .../synthetics/data_distribution_config.ts | 52 +++++++++++++++-- .../synthetics/field_formats.ts | 58 +++++++++++++++++++ .../synthetics/kpi_over_time_config.ts | 55 ++++++++++++++++-- .../hooks/use_lens_attributes.ts | 15 +++-- .../columns/report_definition_field.tsx | 8 ++- .../field_value_combobox.tsx | 25 +++++--- .../shared/field_value_suggestions/index.tsx | 2 + .../shared/field_value_suggestions/types.ts | 1 + 10 files changed, 208 insertions(+), 24 deletions(-) diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/field_names/synthetics.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/field_names/synthetics.ts index edf8b7fb9d741d..eff73d242de75e 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/field_names/synthetics.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/field_names/synthetics.ts @@ -6,3 +6,8 @@ */ export const MONITOR_DURATION_US = 'monitor.duration.us'; +export const SYNTHETICS_CLS = 'browser.experience.cls'; +export const SYNTHETICS_LCP = 'browser.experience.lcp.us'; +export const SYNTHETICS_FCP = 'browser.experience.fcp.us'; +export const SYNTHETICS_DOCUMENT_ONLOAD = 'browser.experience.load.us'; +export const SYNTHETICS_DCL = 'browser.experience.dcl.us'; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/labels.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/labels.ts index eb8af4f26c01af..5a3e773f7d8ee4 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/labels.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/constants/labels.ts @@ -72,6 +72,17 @@ export const CLS_LABEL = i18n.translate('xpack.observability.expView.fieldLabels defaultMessage: 'Cumulative layout shift', }); +export const DCL_LABEL = i18n.translate('xpack.observability.expView.fieldLabels.dcl', { + defaultMessage: 'DOM content loaded', +}); + +export const DOCUMENT_ONLOAD_LABEL = i18n.translate( + 'xpack.observability.expView.fieldLabels.onload', + { + defaultMessage: 'Document complete (onLoad)', + } +); + export const BACKEND_TIME_LABEL = i18n.translate( 'xpack.observability.expView.fieldLabels.backend', { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts index 2522f0b2c2581d..730e742f9d8c56 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/data_distribution_config.ts @@ -7,8 +7,23 @@ import { ConfigProps, SeriesConfig } from '../../types'; import { FieldLabels, REPORT_METRIC_FIELD, RECORDS_PERCENTAGE_FIELD } from '../constants'; -import { buildExistsFilter } from '../utils'; -import { MONITORS_DURATION_LABEL, PINGS_LABEL } from '../constants/labels'; +import { + CLS_LABEL, + DCL_LABEL, + DOCUMENT_ONLOAD_LABEL, + FCP_LABEL, + LCP_LABEL, + MONITORS_DURATION_LABEL, + PINGS_LABEL, +} from '../constants/labels'; +import { + MONITOR_DURATION_US, + SYNTHETICS_CLS, + SYNTHETICS_DCL, + SYNTHETICS_DOCUMENT_ONLOAD, + SYNTHETICS_FCP, + SYNTHETICS_LCP, +} from '../constants/field_names/synthetics'; export function getSyntheticsDistributionConfig({ series, @@ -37,10 +52,39 @@ export function getSyntheticsDistributionConfig({ 'tags', 'url.port', ], - baseFilters: [...buildExistsFilter('summary.up', indexPattern)], + baseFilters: [], definitionFields: ['monitor.name', 'url.full'], metricOptions: [ - { label: 'Monitor duration', id: 'monitor.duration.us', field: 'monitor.duration.us' }, + { + label: MONITORS_DURATION_LABEL, + id: MONITOR_DURATION_US, + field: MONITOR_DURATION_US, + }, + { + label: LCP_LABEL, + field: SYNTHETICS_LCP, + id: SYNTHETICS_LCP, + }, + { + label: FCP_LABEL, + field: SYNTHETICS_FCP, + id: SYNTHETICS_FCP, + }, + { + label: DCL_LABEL, + field: SYNTHETICS_DCL, + id: SYNTHETICS_DCL, + }, + { + label: DOCUMENT_ONLOAD_LABEL, + field: SYNTHETICS_DOCUMENT_ONLOAD, + id: SYNTHETICS_DOCUMENT_ONLOAD, + }, + { + label: CLS_LABEL, + field: SYNTHETICS_CLS, + id: SYNTHETICS_CLS, + }, ], labels: { ...FieldLabels, 'monitor.duration.us': MONITORS_DURATION_LABEL }, }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/field_formats.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/field_formats.ts index 5c91e3924cbb7c..5f8a6a28ca81db 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/field_formats.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/field_formats.ts @@ -6,6 +6,12 @@ */ import { FieldFormat } from '../../types'; +import { + SYNTHETICS_DCL, + SYNTHETICS_DOCUMENT_ONLOAD, + SYNTHETICS_FCP, + SYNTHETICS_LCP, +} from '../constants/field_names/synthetics'; export const syntheticsFieldFormats: FieldFormat[] = [ { @@ -21,4 +27,56 @@ export const syntheticsFieldFormats: FieldFormat[] = [ }, }, }, + { + field: SYNTHETICS_LCP, + format: { + id: 'duration', + params: { + inputFormat: 'microseconds', + outputFormat: 'humanizePrecise', + outputPrecision: 1, + showSuffix: true, + useShortSuffix: true, + }, + }, + }, + { + field: SYNTHETICS_FCP, + format: { + id: 'duration', + params: { + inputFormat: 'microseconds', + outputFormat: 'humanizePrecise', + outputPrecision: 1, + showSuffix: true, + useShortSuffix: true, + }, + }, + }, + { + field: SYNTHETICS_DOCUMENT_ONLOAD, + format: { + id: 'duration', + params: { + inputFormat: 'microseconds', + outputFormat: 'humanizePrecise', + outputPrecision: 1, + showSuffix: true, + useShortSuffix: true, + }, + }, + }, + { + field: SYNTHETICS_DCL, + format: { + id: 'duration', + params: { + inputFormat: 'microseconds', + outputFormat: 'humanizePrecise', + outputPrecision: 1, + showSuffix: true, + useShortSuffix: true, + }, + }, + }, ]; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts index 6bf280e93eb11a..4ee22181d4334d 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/synthetics/kpi_over_time_config.ts @@ -7,9 +7,24 @@ import { ConfigProps, SeriesConfig } from '../../types'; import { FieldLabels, OPERATION_COLUMN, REPORT_METRIC_FIELD } from '../constants'; -import { buildExistsFilter } from '../utils'; -import { DOWN_LABEL, MONITORS_DURATION_LABEL, UP_LABEL } from '../constants/labels'; -import { MONITOR_DURATION_US } from '../constants/field_names/synthetics'; +import { + CLS_LABEL, + DCL_LABEL, + DOCUMENT_ONLOAD_LABEL, + DOWN_LABEL, + FCP_LABEL, + LCP_LABEL, + MONITORS_DURATION_LABEL, + UP_LABEL, +} from '../constants/labels'; +import { + MONITOR_DURATION_US, + SYNTHETICS_CLS, + SYNTHETICS_DCL, + SYNTHETICS_DOCUMENT_ONLOAD, + SYNTHETICS_FCP, + SYNTHETICS_LCP, +} from '../constants/field_names/synthetics'; const SUMMARY_UP = 'summary.up'; const SUMMARY_DOWN = 'summary.down'; @@ -29,8 +44,8 @@ export function getSyntheticsKPIConfig({ indexPattern }: ConfigProps): SeriesCon ], hasOperationType: false, filterFields: ['observer.geo.name', 'monitor.type', 'tags'], - breakdownFields: ['observer.geo.name', 'monitor.type'], - baseFilters: [...buildExistsFilter('summary.up', indexPattern)], + breakdownFields: ['observer.geo.name', 'monitor.type', 'monitor.name'], + baseFilters: [], palette: { type: 'palette', name: 'status' }, definitionFields: ['monitor.name', 'url.full'], metricOptions: [ @@ -52,6 +67,36 @@ export function getSyntheticsKPIConfig({ indexPattern }: ConfigProps): SeriesCon label: DOWN_LABEL, columnType: OPERATION_COLUMN, }, + { + label: LCP_LABEL, + field: SYNTHETICS_LCP, + id: SYNTHETICS_LCP, + columnType: OPERATION_COLUMN, + }, + { + label: FCP_LABEL, + field: SYNTHETICS_FCP, + id: SYNTHETICS_FCP, + columnType: OPERATION_COLUMN, + }, + { + label: DCL_LABEL, + field: SYNTHETICS_DCL, + id: SYNTHETICS_DCL, + columnType: OPERATION_COLUMN, + }, + { + label: DOCUMENT_ONLOAD_LABEL, + field: SYNTHETICS_DOCUMENT_ONLOAD, + id: SYNTHETICS_DOCUMENT_ONLOAD, + columnType: OPERATION_COLUMN, + }, + { + label: CLS_LABEL, + field: SYNTHETICS_CLS, + id: SYNTHETICS_CLS, + columnType: OPERATION_COLUMN, + }, ], labels: { ...FieldLabels }, }; diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts index d14a26d13d928d..8bb265b4f6d895 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/hooks/use_lens_attributes.ts @@ -14,14 +14,17 @@ import { getDefaultConfigs } from '../configurations/default_configs'; import { SeriesUrl, UrlFilter } from '../types'; import { useAppIndexPatternContext } from './use_app_index_pattern'; +import { ALL_VALUES_SELECTED } from '../../field_value_suggestions/field_value_combobox'; export const getFiltersFromDefs = (reportDefinitions: SeriesUrl['reportDefinitions']) => { - return Object.entries(reportDefinitions ?? {}).map(([field, value]) => { - return { - field, - values: value, - }; - }) as UrlFilter[]; + return Object.entries(reportDefinitions ?? {}) + .map(([field, value]) => { + return { + field, + values: value, + }; + }) + .filter(({ values }) => !values.includes(ALL_VALUES_SELECTED)) as UrlFilter[]; }; export const useLensAttributes = (): TypedLensByValueInput['attributes'] | null => { diff --git a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx index 61f6f85dbeaf23..d137b36a7e8c7a 100644 --- a/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx +++ b/x-pack/plugins/observability/public/components/shared/exploratory_view/series_builder/columns/report_definition_field.tsx @@ -16,6 +16,7 @@ import { PersistableFilter } from '../../../../../../../lens/common'; import { ExistsFilter } from '../../../../../../../../../src/plugins/data/common/es_query/filters'; import { buildPhrasesFilter } from '../../configurations/utils'; import { SeriesConfig } from '../../types'; +import { ALL_VALUES_SELECTED } from '../../../field_value_suggestions/field_value_combobox'; interface Props { seriesId: string; @@ -51,8 +52,10 @@ export function ReportDefinitionField({ seriesId, field, seriesConfig, onChange definitionFields.forEach((fieldT) => { if (indexPattern && selectedReportDefinitions?.[fieldT] && fieldT !== field) { const values = selectedReportDefinitions?.[fieldT]; - const valueFilter = buildPhrasesFilter(fieldT, values, indexPattern)[0]; - filtersN.push(valueFilter.query); + if (!values.includes(ALL_VALUES_SELECTED)) { + const valueFilter = buildPhrasesFilter(fieldT, values, indexPattern)[0]; + filtersN.push(valueFilter.query); + } } }); } @@ -74,6 +77,7 @@ export function ReportDefinitionField({ seriesId, field, seriesConfig, onChange filters={queryFilters} time={series.time} fullWidth={true} + allowAllValuesSelection={true} /> )}
diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx index 393d4fc86a98dc..fc562fa80e26d7 100644 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx +++ b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx @@ -11,9 +11,11 @@ import { EuiComboBox, EuiFormControlLayout, EuiComboBoxOptionOption } from '@ela import { i18n } from '@kbn/i18n'; import styled from 'styled-components'; import { FieldValueSelectionProps } from './types'; - -const formatOptions = (values?: string[]) => { - const uniqueValues = Array.from(new Set(values)); +export const ALL_VALUES_SELECTED = 'ALL_VALUES'; +const formatOptions = (values?: string[], allowAllValuesSelection?: boolean) => { + const uniqueValues = Array.from( + new Set(allowAllValuesSelection ? ['ALL_VALUES', ...(values ?? [])] : values) + ); return (uniqueValues ?? []).map((label) => ({ label, @@ -29,15 +31,24 @@ export function FieldValueCombobox({ values, setQuery, compressed = true, + allowAllValuesSelection, onChange: onSelectionChange, }: FieldValueSelectionProps) { - const [options, setOptions] = useState( - formatOptions(union(values?.map(({ label: lb }) => lb) ?? [], selectedValue ?? [])) + const [options, setOptions] = useState(() => + formatOptions( + union(values?.map(({ label: lb }) => lb) ?? [], selectedValue ?? []), + allowAllValuesSelection + ) ); useEffect(() => { - setOptions(formatOptions(union(values?.map(({ label: lb }) => lb) ?? [], selectedValue ?? []))); - }, [selectedValue, values]); + setOptions( + formatOptions( + union(values?.map(({ label: lb }) => lb) ?? [], selectedValue ?? []), + allowAllValuesSelection + ) + ); + }, [allowAllValuesSelection, selectedValue, values]); const onChange = (selectedValuesN: ValueOption[]) => { onSelectionChange(selectedValuesN.map(({ label: lbl }) => lbl)); diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx index 7cd41af78bef1e..2b4d9c0898f3e9 100644 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx +++ b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx @@ -30,6 +30,7 @@ export function FieldValueSuggestions({ singleSelection, compressed, asFilterButton, + allowAllValuesSelection, asCombobox = true, onChange: onSelectionChange, }: FieldValueSuggestionsProps) { @@ -73,6 +74,7 @@ export function FieldValueSuggestions({ width={width} compressed={compressed} asFilterButton={asFilterButton} + allowAllValuesSelection={allowAllValuesSelection} /> ); } diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts index ab24f4064c02e5..aa8c967e31ff5f 100644 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts +++ b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts @@ -23,6 +23,7 @@ interface CommonProps { compressed?: boolean; asFilterButton?: boolean; showCount?: boolean; + allowAllValuesSelection?: boolean; } export type FieldValueSuggestionsProps = CommonProps & { From af62b05e3a72788a88ea97e7699365fffff45fac Mon Sep 17 00:00:00 2001 From: Jason Stoltzfus Date: Tue, 29 Jun 2021 08:24:51 -0400 Subject: [PATCH 080/227] Dont record analytics when showing curations (#103558) --- .../components/curations/curation/curation_logic.test.ts | 5 ++++- .../components/curations/curation/curation_logic.ts | 3 ++- .../enterprise_search/server/routes/app_search/curations.ts | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts index db387f581b92e1..c733294af29100 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.test.ts @@ -287,7 +287,10 @@ describe('CurationLogic', () => { await nextTick(); expect(http.get).toHaveBeenCalledWith( - '/api/app_search/engines/some-engine/curations/cur-123456789' + '/api/app_search/engines/some-engine/curations/cur-123456789', + { + query: { skip_record_analytics: 'true' }, + } ); expect(CurationLogic.actions.onCurationLoad).toHaveBeenCalledWith(MOCK_CURATION_RESPONSE); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts index 9fa2d353b4ef21..12ff380ccb389f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/curation_logic.ts @@ -169,7 +169,8 @@ export const CurationLogic = kea Date: Tue, 29 Jun 2021 08:55:30 -0400 Subject: [PATCH 081/227] [APM] Fleet: Add secret_token to agent instructions in legacy Getting Started guide (#102669) * Register tutorial on APM plugin * using files from apm * removing tutorial from apm_oss * removing export * fixing i18n * adding fleet section * adding fleet information on APM tutorial * adding fleet typing * fixing i18n * adding fleet information on APM tutorial * checks apm fleet integration when pushing button * adding fleet information on APM tutorial * refactoring * registering status check callback * addin custom component registration function * fixing TS issue * addressing PR comments * fixing tests * adding i18n * fixing issues * adding environment credencials * refactoring * adjusting size * adding unit test * adding unit test * refactoring * addressing PR comments * refactoring eui component * adding unit test * fixing TS issue * fixing TS issue * adding help text * renaming * moving tutorial to a common directory * moving files * updating apm int version * adding storybook * adding storybook * refactoring * removing commented code * fixing unit tests * addressing PR comments * fixing lint errors * changing to url * addressing PR comments Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../instruction_set.test.js.snap | 24 + .../__snapshots__/tutorial.test.js.snap | 3 + .../components/tutorial/instruction.js | 23 +- .../components/tutorial/instruction_set.js | 3 + .../tutorial/instruction_set.test.js | 6 + .../components/tutorial/tutorial.js | 1 + x-pack/plugins/apm/public/plugin.ts | 10 + .../tutorial/config_agent/commands/django.ts | 72 +++ .../tutorial/config_agent/commands/dotnet.ts | 14 + .../tutorial/config_agent/commands/flask.ts | 70 +++ .../commands/get_commands.test.ts | 536 ++++++++++++++++++ .../config_agent/commands/get_commands.ts | 48 ++ .../tutorial/config_agent/commands/go.ts | 58 ++ .../tutorial/config_agent/commands/java.ts | 14 + .../tutorial/config_agent/commands/node.ts | 57 ++ .../tutorial/config_agent/commands/php.ts | 11 + .../tutorial/config_agent/commands/rack.ts | 50 ++ .../tutorial/config_agent/commands/rails.ts | 21 + .../tutorial/config_agent/commands/rum.ts | 58 ++ .../config_agent/config_agent.stories.tsx | 117 ++++ .../tutorial/config_agent/copy_commands.tsx | 26 + .../config_agent/get_policy_options.test.ts | 318 +++++++++++ .../config_agent/get_policy_options.ts | 67 +++ .../tutorial/config_agent/index.test.tsx | 205 +++++++ .../public/tutorial/config_agent/index.tsx | 144 +++++ .../tutorial/config_agent/policy_selector.tsx | 92 +++ .../tutorial/config_agent/rum_script.tsx | 33 ++ .../tutorial_fleet_instructions.stories.tsx | 46 ++ .../apm/server/lib/fleet/get_agents.ts | 34 ++ x-pack/plugins/apm/server/routes/fleet.ts | 69 ++- .../instructions/apm_agent_instructions.ts | 361 +----------- x-pack/plugins/fleet/server/mocks/index.ts | 1 + x-pack/plugins/fleet/server/plugin.ts | 1 + x-pack/plugins/fleet/server/services/index.ts | 1 + 34 files changed, 2229 insertions(+), 365 deletions(-) create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/django.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/dotnet.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/flask.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.test.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/go.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/java.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/node.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/php.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/rack.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/rails.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/commands/rum.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/copy_commands.tsx create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.test.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.ts create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/index.tsx create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/policy_selector.tsx create mode 100644 x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx create mode 100644 x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_agents.ts diff --git a/src/plugins/home/public/application/components/tutorial/__snapshots__/instruction_set.test.js.snap b/src/plugins/home/public/application/components/tutorial/__snapshots__/instruction_set.test.js.snap index a9f9823047c0b6..073d20b4bf8048 100644 --- a/src/plugins/home/public/application/components/tutorial/__snapshots__/instruction_set.test.js.snap +++ b/src/plugins/home/public/application/components/tutorial/__snapshots__/instruction_set.test.js.snap @@ -52,8 +52,10 @@ exports[`render 1`] = ` "do stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 0, "title": "step 1", @@ -65,8 +67,10 @@ exports[`render 1`] = ` "do more stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 1, "title": "step 2", @@ -129,8 +133,10 @@ exports[`statusCheckState checking status 1`] = ` "do stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 0, "title": "step 1", @@ -142,8 +148,10 @@ exports[`statusCheckState checking status 1`] = ` "do more stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 1, "title": "step 2", @@ -236,8 +244,10 @@ exports[`statusCheckState failed status check - error 1`] = ` "do stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 0, "title": "step 1", @@ -249,8 +259,10 @@ exports[`statusCheckState failed status check - error 1`] = ` "do more stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 1, "title": "step 2", @@ -347,8 +359,10 @@ exports[`statusCheckState failed status check - no data 1`] = ` "do stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 0, "title": "step 1", @@ -360,8 +374,10 @@ exports[`statusCheckState failed status check - no data 1`] = ` "do more stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 1, "title": "step 2", @@ -458,8 +474,10 @@ exports[`statusCheckState initial state - no check has been attempted 1`] = ` "do stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 0, "title": "step 1", @@ -471,8 +489,10 @@ exports[`statusCheckState initial state - no check has been attempted 1`] = ` "do more stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 1, "title": "step 2", @@ -565,8 +585,10 @@ exports[`statusCheckState successful status check 1`] = ` "do stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 0, "title": "step 1", @@ -578,8 +600,10 @@ exports[`statusCheckState successful status check 1`] = ` "do more stuff in command line", ] } + isCloudEnabled={false} paramValues={Object {}} replaceTemplateStrings={[Function]} + variantId="OSX" />, "key": 1, "title": "step 2", diff --git a/src/plugins/home/public/application/components/tutorial/__snapshots__/tutorial.test.js.snap b/src/plugins/home/public/application/components/tutorial/__snapshots__/tutorial.test.js.snap index f819569cd422d6..ac697fae17f693 100644 --- a/src/plugins/home/public/application/components/tutorial/__snapshots__/tutorial.test.js.snap +++ b/src/plugins/home/public/application/components/tutorial/__snapshots__/tutorial.test.js.snap @@ -31,6 +31,7 @@ exports[`isCloudEnabled is false should not render instruction toggle when ON_PR }, ] } + isCloudEnabled={false} key="0" offset={1} onStatusCheck={[Function]} @@ -107,6 +108,7 @@ exports[`isCloudEnabled is false should render ON_PREM instructions with instruc }, ] } + isCloudEnabled={false} key="0" offset={1} onStatusCheck={[Function]} @@ -154,6 +156,7 @@ exports[`should render ELASTIC_CLOUD instructions when isCloudEnabled is true 1` }, ] } + isCloudEnabled={true} key="0" offset={1} onStatusCheck={[Function]} diff --git a/src/plugins/home/public/application/components/tutorial/instruction.js b/src/plugins/home/public/application/components/tutorial/instruction.js index 373f8c318a5048..e4b3b3f321bf9e 100644 --- a/src/plugins/home/public/application/components/tutorial/instruction.js +++ b/src/plugins/home/public/application/components/tutorial/instruction.js @@ -18,6 +18,7 @@ import { EuiCopy, EuiButton, EuiLoadingSpinner, + EuiErrorBoundary, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -31,6 +32,8 @@ export function Instruction({ textPre, replaceTemplateStrings, customComponentName, + variantId, + isCloudEnabled, }) { const { tutorialService, http, uiSettings, getBasePath } = getServices(); @@ -96,18 +99,22 @@ export function Instruction({ {commandBlock} - {post} - {LazyCustomComponent && ( }> - + + + )} + {post} +
); @@ -120,4 +127,6 @@ Instruction.propTypes = { textPre: PropTypes.string, replaceTemplateStrings: PropTypes.func.isRequired, customComponentName: PropTypes.string, + variantId: PropTypes.string, + isCloudEnabled: PropTypes.bool.isRequired, }; diff --git a/src/plugins/home/public/application/components/tutorial/instruction_set.js b/src/plugins/home/public/application/components/tutorial/instruction_set.js index da368120d493c8..08b55a527b3cf5 100644 --- a/src/plugins/home/public/application/components/tutorial/instruction_set.js +++ b/src/plugins/home/public/application/components/tutorial/instruction_set.js @@ -187,6 +187,8 @@ class InstructionSetUi extends React.Component { textPost={instruction.textPost} replaceTemplateStrings={this.props.replaceTemplateStrings} customComponentName={instruction.customComponentName} + variantId={instructionVariant.id} + isCloudEnabled={this.props.isCloudEnabled} /> ); return { @@ -320,6 +322,7 @@ InstructionSetUi.propTypes = { paramValues: PropTypes.object.isRequired, setParameter: PropTypes.func, replaceTemplateStrings: PropTypes.func.isRequired, + isCloudEnabled: PropTypes.bool.isRequired, }; export const InstructionSet = injectI18n(InstructionSetUi); diff --git a/src/plugins/home/public/application/components/tutorial/instruction_set.test.js b/src/plugins/home/public/application/components/tutorial/instruction_set.test.js index 539732a1c51a9c..1bce4f72fde607 100644 --- a/src/plugins/home/public/application/components/tutorial/instruction_set.test.js +++ b/src/plugins/home/public/application/components/tutorial/instruction_set.test.js @@ -49,6 +49,7 @@ test('render', () => { offset={1} paramValues={{}} replaceTemplateStrings={() => {}} + isCloudEnabled={false} /> ); expect(component).toMatchSnapshot(); // eslint-disable-line @@ -74,6 +75,7 @@ describe('statusCheckState', () => { statusCheckConfig={statusCheckConfig} replaceTemplateStrings={() => {}} statusCheckState={StatusCheckStates.FETCHING} + isCloudEnabled={false} /> ); expect(component).toMatchSnapshot(); // eslint-disable-line @@ -90,6 +92,7 @@ describe('statusCheckState', () => { statusCheckConfig={statusCheckConfig} replaceTemplateStrings={() => {}} statusCheckState={StatusCheckStates.FETCHING} + isCloudEnabled={false} /> ); expect(component).toMatchSnapshot(); // eslint-disable-line @@ -106,6 +109,7 @@ describe('statusCheckState', () => { statusCheckConfig={statusCheckConfig} replaceTemplateStrings={() => {}} statusCheckState={StatusCheckStates.ERROR} + isCloudEnabled={false} /> ); expect(component).toMatchSnapshot(); // eslint-disable-line @@ -122,6 +126,7 @@ describe('statusCheckState', () => { statusCheckConfig={statusCheckConfig} replaceTemplateStrings={() => {}} statusCheckState={StatusCheckStates.NO_DATA} + isCloudEnabled={false} /> ); expect(component).toMatchSnapshot(); // eslint-disable-line @@ -138,6 +143,7 @@ describe('statusCheckState', () => { statusCheckConfig={statusCheckConfig} replaceTemplateStrings={() => {}} statusCheckState={StatusCheckStates.HAS_DATA} + isCloudEnabled={false} /> ); expect(component).toMatchSnapshot(); // eslint-disable-line diff --git a/src/plugins/home/public/application/components/tutorial/tutorial.js b/src/plugins/home/public/application/components/tutorial/tutorial.js index 92bbb92fa08507..52daa53d4585c8 100644 --- a/src/plugins/home/public/application/components/tutorial/tutorial.js +++ b/src/plugins/home/public/application/components/tutorial/tutorial.js @@ -301,6 +301,7 @@ class TutorialUi extends React.Component { setParameter={this.setParameter} replaceTemplateStrings={this.props.replaceTemplateStrings} key={index} + isCloudEnabled={this.props.isCloudEnabled} /> ); }); diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts index 012856ca9213c5..0f0d0727990612 100644 --- a/x-pack/plugins/apm/public/plugin.ts +++ b/x-pack/plugins/apm/public/plugin.ts @@ -175,6 +175,16 @@ export class ApmPlugin implements Plugin { () => import('./tutorial/tutorial_fleet_instructions') ); + pluginSetupDeps.home?.tutorials.registerCustomComponent( + 'TutorialConfigAgent', + () => import('./tutorial/config_agent') + ); + + pluginSetupDeps.home?.tutorials.registerCustomComponent( + 'TutorialConfigAgentRumScript', + () => import('./tutorial/config_agent/rum_script') + ); + plugins.observability.dashboard.register({ appName: 'apm', hasData: async () => { diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/django.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/django.ts new file mode 100644 index 00000000000000..97b5f3315bcdbf --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/django.ts @@ -0,0 +1,72 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const django = `# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.addAgentComment', + { + defaultMessage: 'Add the agent to the installed apps', + } +)} +INSTALLED_APPS = ( +'elasticapm.contrib.django', +# ... +) + +ELASTIC_APM = {curlyOpen} +# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.setRequiredServiceNameComment', + { + defaultMessage: 'Set the required service name. Allowed characters:', + } +)} +# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.allowedCharactersComment', + { + defaultMessage: 'a-z, A-Z, 0-9, -, _, and space', + } +)} +'SERVICE_NAME': '', + +# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.useIfApmServerRequiresTokenComment', + { + defaultMessage: 'Use if APM Server requires a secret token', + } +)} +'SECRET_TOKEN': '{{{secretToken}}}', + +# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.setCustomApmServerUrlComment', + { + defaultMessage: + 'Set the custom APM Server URL (default: {defaultApmServerUrl})', + values: { defaultApmServerUrl: 'http://localhost:8200' }, + } +)} +'SERVER_URL': '{{{apmServerUrl}}}', + +# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.setServiceEnvironmentComment', + { + defaultMessage: 'Set the service environment', + } +)} +'ENVIRONMENT': 'production', +{curlyClose} + +# ${i18n.translate( + 'xpack.apm.tutorial.djangoClient.configure.commands.addTracingMiddlewareComment', + { + defaultMessage: 'To send performance metrics, add our tracing middleware:', + } +)} +MIDDLEWARE = ( +'elasticapm.contrib.django.middleware.TracingMiddleware', +#... +)`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/dotnet.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/dotnet.ts new file mode 100644 index 00000000000000..e083a2b45c716d --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/dotnet.ts @@ -0,0 +1,14 @@ +/* + * 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. + */ +export const dotnet = `{ +"ElasticApm": { +"SecretToken": "{{{secretToken}}}", +"ServerUrls": "{{{apmServerUrl}}}", //Set custom APM Server URL (default: http://localhost:8200) +"ServiceName": "MyApp", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application +"Environment": "production", // Set the service environment +} +}`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/flask.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/flask.ts new file mode 100644 index 00000000000000..e4d7fd188e7c6f --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/flask.ts @@ -0,0 +1,70 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const flask = `# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.initializeUsingEnvironmentVariablesComment', + { + defaultMessage: 'initialize using environment variables', + } +)} +from elasticapm.contrib.flask import ElasticAPM +app = Flask(__name__) +apm = ElasticAPM(app) + +# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.configureElasticApmComment', + { + defaultMessage: + "or configure to use ELASTIC_APM in your application's settings", + } +)} +from elasticapm.contrib.flask import ElasticAPM +app.config['ELASTIC_APM'] = {curlyOpen} +# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.setRequiredServiceNameComment', + { + defaultMessage: 'Set the required service name. Allowed characters:', + } +)} +# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.allowedCharactersComment', + { + defaultMessage: 'a-z, A-Z, 0-9, -, _, and space', + } +)} +'SERVICE_NAME': '', + +# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.useIfApmServerRequiresTokenComment', + { + defaultMessage: 'Use if APM Server requires a secret token', + } +)} +'SECRET_TOKEN': '{{{secretToken}}}', + +# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.setCustomApmServerUrlComment', + { + defaultMessage: + 'Set the custom APM Server URL (default: {defaultApmServerUrl})', + values: { defaultApmServerUrl: 'http://localhost:8200' }, + } +)} +'SERVER_URL': '{{{apmServerUrl}}}', + +# ${i18n.translate( + 'xpack.apm.tutorial.flaskClient.configure.commands.setServiceEnvironmentComment', + { + defaultMessage: 'Set the service environment', + } +)} +'ENVIRONMENT': 'production', +{curlyClose} + +apm = ElasticAPM(app)`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.test.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.test.ts new file mode 100644 index 00000000000000..5dc66e22305248 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.test.ts @@ -0,0 +1,536 @@ +/* + * 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 { getCommands } from './get_commands'; + +describe('getCommands', () => { + describe('unknown agent', () => { + it('renders empty command', () => { + const commands = getCommands({ + variantId: 'foo', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).toBe(''); + }); + }); + describe('java agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'java', + policyDetails: {}, + }); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls= \\\\ + -Delastic.apm.secret_token= \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'java', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls=localhost:8220 \\\\ + -Delastic.apm.secret_token=foobar \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + }); + }); + describe('RUM(js) agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'js', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "import { init as initApm } from '@elastic/apm-rum' + var apm = initApm({ + + // Set required service name (allowed characters: a-z, A-Z, 0-9, -, _, and space) + serviceName: 'your-app-name', + + // Set custom APM Server URL (default: http://localhost:8200) + serverUrl: '', + + // Set the service version (required for source map feature) + serviceVersion: '', + + // Set the service environment + environment: 'production' + })" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'js', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "import { init as initApm } from '@elastic/apm-rum' + var apm = initApm({ + + // Set required service name (allowed characters: a-z, A-Z, 0-9, -, _, and space) + serviceName: 'your-app-name', + + // Set custom APM Server URL (default: http://localhost:8200) + serverUrl: 'localhost:8220', + + // Set the service version (required for source map feature) + serviceVersion: '', + + // Set the service environment + environment: 'production' + })" + `); + }); + }); + describe('Node.js agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'node', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "// Add this to the VERY top of the first file loaded in your app + var apm = require('elastic-apm-node').start({ + + // Override the service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a secret token + secretToken: '', + + // Set the custom APM Server URL (default: http://localhost:8200) + serverUrl: '', + + // Set the service environment + environment: 'production' + })" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'node', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "// Add this to the VERY top of the first file loaded in your app + var apm = require('elastic-apm-node').start({ + + // Override the service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a secret token + secretToken: 'foobar', + + // Set the custom APM Server URL (default: http://localhost:8200) + serverUrl: 'localhost:8220', + + // Set the service environment + environment: 'production' + })" + `); + }); + }); + describe('Django agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'django', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# Add the agent to the installed apps + INSTALLED_APPS = ( + 'elasticapm.contrib.django', + # ... + ) + + ELASTIC_APM = {curlyOpen} + # Set the required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', + + # Use if APM Server requires a secret token + 'SECRET_TOKEN': '', + + # Set the custom APM Server URL (default: http://localhost:8200) + 'SERVER_URL': '', + + # Set the service environment + 'ENVIRONMENT': 'production', + {curlyClose} + + # To send performance metrics, add our tracing middleware: + MIDDLEWARE = ( + 'elasticapm.contrib.django.middleware.TracingMiddleware', + #... + )" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'django', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# Add the agent to the installed apps + INSTALLED_APPS = ( + 'elasticapm.contrib.django', + # ... + ) + + ELASTIC_APM = {curlyOpen} + # Set the required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', + + # Use if APM Server requires a secret token + 'SECRET_TOKEN': 'foobar', + + # Set the custom APM Server URL (default: http://localhost:8200) + 'SERVER_URL': 'localhost:8220', + + # Set the service environment + 'ENVIRONMENT': 'production', + {curlyClose} + + # To send performance metrics, add our tracing middleware: + MIDDLEWARE = ( + 'elasticapm.contrib.django.middleware.TracingMiddleware', + #... + )" + `); + }); + }); + describe('Flask agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'flask', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# initialize using environment variables + from elasticapm.contrib.flask import ElasticAPM + app = Flask(__name__) + apm = ElasticAPM(app) + + # or configure to use ELASTIC_APM in your application's settings + from elasticapm.contrib.flask import ElasticAPM + app.config['ELASTIC_APM'] = {curlyOpen} + # Set the required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', + + # Use if APM Server requires a secret token + 'SECRET_TOKEN': '', + + # Set the custom APM Server URL (default: http://localhost:8200) + 'SERVER_URL': '', + + # Set the service environment + 'ENVIRONMENT': 'production', + {curlyClose} + + apm = ElasticAPM(app)" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'flask', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# initialize using environment variables + from elasticapm.contrib.flask import ElasticAPM + app = Flask(__name__) + apm = ElasticAPM(app) + + # or configure to use ELASTIC_APM in your application's settings + from elasticapm.contrib.flask import ElasticAPM + app.config['ELASTIC_APM'] = {curlyOpen} + # Set the required service name. Allowed characters: + # a-z, A-Z, 0-9, -, _, and space + 'SERVICE_NAME': '', + + # Use if APM Server requires a secret token + 'SECRET_TOKEN': 'foobar', + + # Set the custom APM Server URL (default: http://localhost:8200) + 'SERVER_URL': 'localhost:8220', + + # Set the service environment + 'ENVIRONMENT': 'production', + {curlyClose} + + apm = ElasticAPM(app)" + `); + }); + }); + describe('Ruby on Rails agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'rails', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# config/elastic_apm.yml: + + # Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space + # Defaults to the name of your Rails app + service_name: 'my-service' + + # Use if APM Server requires a secret token + secret_token: '' + + # Set the custom APM Server URL (default: http://localhost:8200) + server_url: '' + + # Set the service environment + environment: 'production'" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'rails', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# config/elastic_apm.yml: + + # Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space + # Defaults to the name of your Rails app + service_name: 'my-service' + + # Use if APM Server requires a secret token + secret_token: 'foobar' + + # Set the custom APM Server URL (default: http://localhost:8200) + server_url: 'localhost:8220' + + # Set the service environment + environment: 'production'" + `); + }); + }); + describe('Rack agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'rack', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# config/elastic_apm.yml: + + # Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space + # Defaults to the name of your Rack app's class. + service_name: 'my-service' + + # Use if APM Server requires a token + secret_token: '' + + # Set custom APM Server URL (default: http://localhost:8200) + server_url: '', + + # Set the service environment + environment: 'production'" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'rack', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# config/elastic_apm.yml: + + # Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space + # Defaults to the name of your Rack app's class. + service_name: 'my-service' + + # Use if APM Server requires a token + secret_token: 'foobar' + + # Set custom APM Server URL (default: http://localhost:8200) + server_url: 'localhost:8220', + + # Set the service environment + environment: 'production'" + `); + }); + }); + describe('Go agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'go', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# Initialize using environment variables: + + # Set the service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space. + # If ELASTIC_APM_SERVICE_NAME is not specified, the executable name will be used. + export ELASTIC_APM_SERVICE_NAME= + + # Set custom APM Server URL (default: http://localhost:8200) + export ELASTIC_APM_SERVER_URL= + + # Use if APM Server requires a secret token + export ELASTIC_APM_SECRET_TOKEN= + + # Set the service environment + export ELASTIC_APM_ENVIRONMENT= + " + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'go', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "# Initialize using environment variables: + + # Set the service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space. + # If ELASTIC_APM_SERVICE_NAME is not specified, the executable name will be used. + export ELASTIC_APM_SERVICE_NAME= + + # Set custom APM Server URL (default: http://localhost:8200) + export ELASTIC_APM_SERVER_URL=localhost:8220 + + # Use if APM Server requires a secret token + export ELASTIC_APM_SECRET_TOKEN=foobar + + # Set the service environment + export ELASTIC_APM_ENVIRONMENT= + " + `); + }); + }); + describe('dotNet agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'dotnet', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "{ + \\"ElasticApm\\": { + \\"SecretToken\\": \\"\\", + \\"ServerUrls\\": \\"\\", //Set custom APM Server URL (default: http://localhost:8200) + \\"ServiceName\\": \\"MyApp\\", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application + \\"Environment\\": \\"production\\", // Set the service environment + } + }" + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'dotnet', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "{ + \\"ElasticApm\\": { + \\"SecretToken\\": \\"foobar\\", + \\"ServerUrls\\": \\"localhost:8220\\", //Set custom APM Server URL (default: http://localhost:8200) + \\"ServiceName\\": \\"MyApp\\", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application + \\"Environment\\": \\"production\\", // Set the service environment + } + }" + `); + }); + }); + describe('PHP agent', () => { + it('renders empty commands', () => { + const commands = getCommands({ + variantId: 'php', + policyDetails: {}, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "elastic_apm.server_url=\\"\\" + elastic.apm.secret_token=\\"\\" + elastic_apm.service_name=\\"My service\\" + " + `); + }); + it('renders with secret token and url', () => { + const commands = getCommands({ + variantId: 'php', + policyDetails: { + apmServerUrl: 'localhost:8220', + secretToken: 'foobar', + }, + }); + expect(commands).not.toBe(''); + expect(commands).toMatchInlineSnapshot(` + "elastic_apm.server_url=\\"localhost:8220\\" + elastic.apm.secret_token=\\"foobar\\" + elastic_apm.service_name=\\"My service\\" + " + `); + }); + }); +}); diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.ts new file mode 100644 index 00000000000000..73a388c3f735e7 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/get_commands.ts @@ -0,0 +1,48 @@ +/* + * 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 Mustache from 'mustache'; +import { java } from './java'; +import { node } from './node'; +import { django } from './django'; +import { flask } from './flask'; +import { rails } from './rails'; +import { rack } from './rack'; +import { go } from './go'; +import { dotnet } from './dotnet'; +import { php } from './php'; +import { rum, rumScript } from './rum'; + +const commandsMap: Record = { + java, + node, + django, + flask, + rails, + rack, + go, + dotnet, + php, + js: rum, + js_script: rumScript, +}; + +export function getCommands({ + variantId, + policyDetails, +}: { + variantId: string; + policyDetails: { + apmServerUrl?: string; + secretToken?: string; + }; +}) { + const commands = commandsMap[variantId]; + if (!commands) { + return ''; + } + return Mustache.render(commands, policyDetails); +} diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/go.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/go.ts new file mode 100644 index 00000000000000..a3900420d6fdec --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/go.ts @@ -0,0 +1,58 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const go = `# ${i18n.translate( + 'xpack.apm.tutorial.goClient.configure.commands.initializeUsingEnvironmentVariablesComment', + { + defaultMessage: 'Initialize using environment variables:', + } +)} + +# ${i18n.translate( + 'xpack.apm.tutorial.goClient.configure.commands.setServiceNameComment', + { + defaultMessage: + 'Set the service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space.', + } +)} +# ${i18n.translate( + 'xpack.apm.tutorial.goClient.configure.commands.usedExecutableNameComment', + { + defaultMessage: + 'If ELASTIC_APM_SERVICE_NAME is not specified, the executable name will be used.', + } +)} +export ELASTIC_APM_SERVICE_NAME= + +# ${i18n.translate( + 'xpack.apm.tutorial.goClient.configure.commands.setCustomApmServerUrlComment', + { + defaultMessage: + 'Set custom APM Server URL (default: {defaultApmServerUrl})', + values: { defaultApmServerUrl: 'http://localhost:8200' }, + } +)} +export ELASTIC_APM_SERVER_URL={{{apmServerUrl}}} + +# ${i18n.translate( + 'xpack.apm.tutorial.goClient.configure.commands.useIfApmRequiresTokenComment', + { + defaultMessage: 'Use if APM Server requires a secret token', + } +)} +export ELASTIC_APM_SECRET_TOKEN={{{secretToken}}} + +# ${i18n.translate( + 'xpack.apm.tutorial.goClient.configure.commands.setServiceEnvironment', + { + defaultMessage: 'Set the service environment', + } +)} +export ELASTIC_APM_ENVIRONMENT= +`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/java.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/java.ts new file mode 100644 index 00000000000000..249907a9b0c4bf --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/java.ts @@ -0,0 +1,14 @@ +/* + * 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. + */ + +export const java = `java -javaagent:/path/to/elastic-apm-agent-.jar \\ +-Delastic.apm.service_name=my-application \\ +-Delastic.apm.server_urls={{{apmServerUrl}}} \\ +-Delastic.apm.secret_token={{{secretToken}}} \\ +-Delastic.apm.environment=production \\ +-Delastic.apm.application_packages=org.example \\ +-jar my-application.jar`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/node.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/node.ts new file mode 100644 index 00000000000000..31f9fac0ed480d --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/node.ts @@ -0,0 +1,57 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const node = `// ${i18n.translate( + 'xpack.apm.tutorial.nodeClient.configure.commands.addThisToTheFileTopComment', + { + defaultMessage: + 'Add this to the VERY top of the first file loaded in your app', + } +)} +var apm = require('elastic-apm-node').start({ + +// ${i18n.translate( + 'xpack.apm.tutorial.nodeClient.configure.commands.setRequiredServiceNameComment', + { + defaultMessage: 'Override the service name from package.json', + } +)} +// ${i18n.translate( + 'xpack.apm.tutorial.nodeClient.configure.commands.allowedCharactersComment', + { + defaultMessage: 'Allowed characters: a-z, A-Z, 0-9, -, _, and space', + } +)} +serviceName: '', + +// ${i18n.translate( + 'xpack.apm.tutorial.nodeClient.configure.commands.useIfApmRequiresTokenComment', + { + defaultMessage: 'Use if APM Server requires a secret token', + } +)} +secretToken: '{{{secretToken}}}', + +// ${i18n.translate( + 'xpack.apm.tutorial.nodeClient.configure.commands.setCustomApmServerUrlComment', + { + defaultMessage: + 'Set the custom APM Server URL (default: {defaultApmServerUrl})', + values: { defaultApmServerUrl: 'http://localhost:8200' }, + } +)} +serverUrl: '{{{apmServerUrl}}}', + +// ${i18n.translate( + 'xpack.apm.tutorial.nodeClient.configure.commands.setCustomServiceEnvironmentComment', + { + defaultMessage: 'Set the service environment', + } +)} +environment: 'production' +})`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/php.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/php.ts new file mode 100644 index 00000000000000..ea7e8764f89ad1 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/php.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export const php = `elastic_apm.server_url="{{{apmServerUrl}}}" +elastic.apm.secret_token="{{{secretToken}}}" +elastic_apm.service_name="My service" +`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/rack.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/rack.ts new file mode 100644 index 00000000000000..9195ad9f156666 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/rack.ts @@ -0,0 +1,50 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const rack = `# config/elastic_apm.yml: + +# ${i18n.translate( + 'xpack.apm.tutorial.rackClient.createConfig.commands.setServiceNameComment', + { + defaultMessage: + 'Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space', + } +)} +# ${i18n.translate( + 'xpack.apm.tutorial.rackClient.createConfig.commands.defaultsToTheNameOfRackAppClassComment', + { + defaultMessage: "Defaults to the name of your Rack app's class.", + } +)} +service_name: 'my-service' + +# ${i18n.translate( + 'xpack.apm.tutorial.rackClient.createConfig.commands.useIfApmServerRequiresTokenComment', + { + defaultMessage: 'Use if APM Server requires a token', + } +)} +secret_token: '{{{secretToken}}}' + +# ${i18n.translate( + 'xpack.apm.tutorial.rackClient.createConfig.commands.setCustomApmServerComment', + { + defaultMessage: 'Set custom APM Server URL (default: {defaultServerUrl})', + values: { defaultServerUrl: 'http://localhost:8200' }, + } +)} +server_url: '{{{apmServerUrl}}}', + +# ${i18n.translate( + 'xpack.apm.tutorial.rackClient.createConfig.commands.setServiceEnvironment', + { + defaultMessage: 'Set the service environment', + } +)} +environment: 'production'`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/rails.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/rails.ts new file mode 100644 index 00000000000000..0f8a5508e1cebb --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/rails.ts @@ -0,0 +1,21 @@ +/* + * 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. + */ + +export const rails = `# config/elastic_apm.yml: + +# Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space +# Defaults to the name of your Rails app +service_name: 'my-service' + +# Use if APM Server requires a secret token +secret_token: '{{{secretToken}}}' + +# Set the custom APM Server URL (default: http://localhost:8200) +server_url: '{{{apmServerUrl}}}' + +# Set the service environment +environment: 'production'`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/commands/rum.ts b/x-pack/plugins/apm/public/tutorial/config_agent/commands/rum.ts new file mode 100644 index 00000000000000..f5de61f64c63ac --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/commands/rum.ts @@ -0,0 +1,58 @@ +/* + * 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 { i18n } from '@kbn/i18n'; + +export const rum = `import { init as initApm } from '@elastic/apm-rum' +var apm = initApm({ + + // ${i18n.translate( + 'xpack.apm.tutorial.jsClient.installDependency.commands.setRequiredServiceNameComment', + { + defaultMessage: + 'Set required service name (allowed characters: a-z, A-Z, 0-9, -, _, and space)', + } + )} + serviceName: 'your-app-name', + + // ${i18n.translate( + 'xpack.apm.tutorial.jsClient.installDependency.commands.setCustomApmServerUrlComment', + { + defaultMessage: + 'Set custom APM Server URL (default: {defaultApmServerUrl})', + values: { defaultApmServerUrl: 'http://localhost:8200' }, + } + )} + serverUrl: '{{{apmServerUrl}}}', + + // ${i18n.translate( + 'xpack.apm.tutorial.jsClient.installDependency.commands.setServiceVersionComment', + { + defaultMessage: + 'Set the service version (required for source map feature)', + } + )} + serviceVersion: '', + + // ${i18n.translate( + 'xpack.apm.tutorial.jsClient.installDependency.commands.setServiceEnvironmentComment', + { + defaultMessage: 'Set the service environment', + } + )} + environment: 'production' +})`; + +export const rumScript = `\ + + +`; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx new file mode 100644 index 00000000000000..33f171ab88247a --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx @@ -0,0 +1,117 @@ +/* + * 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 { Story } from '@storybook/react'; +import { HttpStart } from 'kibana/public'; +import React from 'react'; +import TutorialConfigAgent from './'; +import { APIReturnType } from '../..//services/rest/createCallApmApi'; + +export type APIResponseType = APIReturnType<'GET /api/apm/fleet/agents'>; + +interface Args { + apmAgent: string; + onPrem: boolean; + hasFleetPoliciesWithApmIntegration: boolean; + hasCloudPolicyWithApmIntegration: boolean; +} + +const policyElasticAgentOnCloudAgent: APIResponseType['fleetAgents'][0] = { + id: 'policy-elastic-agent-on-cloud', + name: 'Elastic Cloud agent policy', + apmServerUrl: 'apm_cloud_url', + secretToken: 'apm_cloud_token', +}; + +const fleetAgents: APIResponseType['fleetAgents'] = [ + { + id: '1', + name: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + }, + { + id: '2', + name: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + }, +]; + +function Wrapper({ + hasFleetPoliciesWithApmIntegration, + apmAgent, + onPrem, + hasCloudPolicyWithApmIntegration, +}: Args) { + const http = ({ + get: () => ({ + fleetAgents: [ + ...(hasFleetPoliciesWithApmIntegration ? fleetAgents : []), + ...(hasCloudPolicyWithApmIntegration + ? [policyElasticAgentOnCloudAgent] + : []), + ], + cloudStandaloneSetup: { + apmServerUrl: 'cloud_url', + secretToken: 'foo', + }, + }), + } as unknown) as HttpStart; + return ( + + ); +} +export const Integration: Story = (args) => { + return ; +}; + +Integration.args = { + apmAgent: 'java', + onPrem: true, + hasFleetPoliciesWithApmIntegration: false, + hasCloudPolicyWithApmIntegration: false, +}; + +export default { + title: 'app/Tutorial/AgentConfig', + component: TutorialConfigAgent, + argTypes: { + apmAgent: { + control: { + type: 'select', + options: [ + 'java', + 'node', + 'django', + 'flask', + 'rails', + 'rack', + 'go', + 'dotnet', + 'php', + 'js', + 'js_script', + ], + }, + }, + onPrem: { + control: { type: 'boolean', options: [true, false] }, + }, + hasFleetPoliciesWithApmIntegration: { + control: { type: 'boolean', options: [true, false] }, + }, + hasCloudPolicyWithApmIntegration: { + control: { type: 'boolean', options: [true, false] }, + }, + }, +}; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/copy_commands.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/copy_commands.tsx new file mode 100644 index 00000000000000..c5261cfc1dc042 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/copy_commands.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { EuiButton, EuiCopy } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; + +interface Props { + commands: string; +} +export function CopyCommands({ commands }: Props) { + return ( + + {(copy) => ( + + {i18n.translate('xpack.apm.tutorial.copySnippet', { + defaultMessage: 'Copy snippet', + })} + + )} + + ); +} diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.test.ts b/x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.test.ts new file mode 100644 index 00000000000000..90c9aab80f6f56 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.test.ts @@ -0,0 +1,318 @@ +/* + * 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 { getPolicyOptions } from './get_policy_options'; +import { APIReturnType } from '../../services/rest/createCallApmApi'; + +type APIResponseType = APIReturnType<'GET /api/apm/fleet/agents'>; + +const policyElasticAgentOnCloudAgent = { + id: 'policy-elastic-agent-on-cloud', + name: 'Elastic Cloud agent policy', + apmServerUrl: 'apm_cloud_url', + secretToken: 'apm_cloud_token', +}; + +const fleetAgents = [ + { + id: '1', + name: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + }, + { + id: '2', + name: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + }, +]; + +describe('getPolicyOptions', () => { + describe('running on cloud', () => { + describe('with APM on cloud', () => { + it('shows apm on cloud standalone option', () => { + const data: APIResponseType = { + fleetAgents: [], + cloudStandaloneSetup: { + apmServerUrl: 'cloud_url', + secretToken: 'cloud_token', + }, + }; + const options = getPolicyOptions({ + isCloudEnabled: true, + data, + }); + expect(options).toEqual([ + { + key: 'cloud', + type: 'standalone', + label: 'Default Standalone configuration', + apmServerUrl: 'cloud_url', + secretToken: 'cloud_token', + isVisible: true, + isSelected: true, + }, + ]); + }); + it('shows apm on cloud standalone option and fleet agents options', () => { + const data: APIResponseType = { + fleetAgents, + cloudStandaloneSetup: { + apmServerUrl: 'cloud_url', + secretToken: 'cloud_token', + }, + }; + const options = getPolicyOptions({ + isCloudEnabled: true, + data, + }); + + expect(options).toEqual([ + { + key: 'cloud', + type: 'standalone', + label: 'Default Standalone configuration', + apmServerUrl: 'cloud_url', + secretToken: 'cloud_token', + isVisible: true, + isSelected: true, + }, + + { + key: '1', + type: 'fleetAgents', + label: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + isVisible: true, + isSelected: false, + }, + { + key: '2', + type: 'fleetAgents', + label: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + isVisible: true, + isSelected: false, + }, + ]); + }); + it('selects policy elastic agent on cloud when available', () => { + const data: APIResponseType = { + fleetAgents: [policyElasticAgentOnCloudAgent, ...fleetAgents], + cloudStandaloneSetup: { + apmServerUrl: 'cloud_url', + secretToken: 'cloud_token', + }, + }; + const options = getPolicyOptions({ + isCloudEnabled: true, + data, + }); + + expect(options).toEqual([ + { + key: 'policy-elastic-agent-on-cloud', + type: 'fleetAgents', + label: 'Elastic Cloud agent policy', + apmServerUrl: 'apm_cloud_url', + secretToken: 'apm_cloud_token', + isVisible: true, + isSelected: true, + }, + { + key: '1', + type: 'fleetAgents', + label: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + isVisible: true, + isSelected: false, + }, + { + key: '2', + type: 'fleetAgents', + label: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + isVisible: true, + isSelected: false, + }, + ]); + }); + }); + describe('with APM on prem', () => { + it('shows apm on prem standalone option', () => { + const data: APIResponseType = { + fleetAgents: [], + cloudStandaloneSetup: undefined, + }; + const options = getPolicyOptions({ + isCloudEnabled: true, + data, + }); + + expect(options).toEqual([ + { + key: 'onPrem', + type: 'standalone', + label: 'Default Standalone configuration', + apmServerUrl: 'http://localhost:8200', + secretToken: '', + isVisible: true, + isSelected: true, + }, + ]); + }); + it('shows apm on prem standalone option and fleet agents options', () => { + const data: APIResponseType = { + fleetAgents, + cloudStandaloneSetup: undefined, + }; + const options = getPolicyOptions({ + isCloudEnabled: true, + data, + }); + expect(options).toEqual([ + { + key: 'onPrem', + type: 'standalone', + label: 'Default Standalone configuration', + apmServerUrl: 'http://localhost:8200', + secretToken: '', + isVisible: true, + isSelected: true, + }, + + { + key: '1', + type: 'fleetAgents', + label: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + isVisible: true, + isSelected: false, + }, + { + key: '2', + type: 'fleetAgents', + label: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + isVisible: true, + isSelected: false, + }, + ]); + }); + it('selects policy elastic agent on cloud when available', () => { + const data: APIResponseType = { + fleetAgents: [policyElasticAgentOnCloudAgent, ...fleetAgents], + cloudStandaloneSetup: undefined, + }; + const options = getPolicyOptions({ + isCloudEnabled: true, + data, + }); + + expect(options).toEqual([ + { + key: 'policy-elastic-agent-on-cloud', + type: 'fleetAgents', + label: 'Elastic Cloud agent policy', + apmServerUrl: 'apm_cloud_url', + secretToken: 'apm_cloud_token', + isVisible: true, + isSelected: true, + }, + { + key: '1', + type: 'fleetAgents', + label: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + isVisible: true, + isSelected: false, + }, + { + key: '2', + type: 'fleetAgents', + label: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + isVisible: true, + isSelected: false, + }, + ]); + }); + }); + }); + describe('Running on prem', () => { + it('shows apm on prem standalone option', () => { + const data: APIResponseType = { + fleetAgents: [], + cloudStandaloneSetup: undefined, + }; + const options = getPolicyOptions({ + isCloudEnabled: false, + data, + }); + + expect(options).toEqual([ + { + key: 'onPrem', + type: 'standalone', + label: 'Default Standalone configuration', + apmServerUrl: 'http://localhost:8200', + secretToken: '', + isVisible: true, + isSelected: true, + }, + ]); + }); + it('shows apm on prem standalone option and fleet agents options', () => { + const data: APIResponseType = { + fleetAgents, + cloudStandaloneSetup: undefined, + }; + const options = getPolicyOptions({ + isCloudEnabled: false, + data, + }); + + expect(options).toEqual([ + { + key: 'onPrem', + type: 'standalone', + label: 'Default Standalone configuration', + apmServerUrl: 'http://localhost:8200', + secretToken: '', + isVisible: true, + isSelected: true, + }, + { + key: '1', + type: 'fleetAgents', + label: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + isVisible: true, + isSelected: false, + }, + { + key: '2', + type: 'fleetAgents', + label: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + isVisible: true, + isSelected: false, + }, + ]); + }); + }); +}); diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.ts b/x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.ts new file mode 100644 index 00000000000000..afbdc867d3e0a3 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/get_policy_options.ts @@ -0,0 +1,67 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { APIResponseType } from './'; + +const POLICY_ELASTIC_AGENT_ON_CLOUD = 'policy-elastic-agent-on-cloud'; + +const DEFAULT_STANDALONE_CONFIG_LABEL = i18n.translate( + 'xpack.apm.tutorial.agent_config.defaultStandaloneConfig', + { defaultMessage: 'Default Standalone configuration' } +); + +export type PolicyOption = ReturnType[0]; + +export function getPolicyOptions({ + isCloudEnabled, + data, +}: { + isCloudEnabled: boolean; + data: APIResponseType; +}) { + const isCloudVisible = !!( + isCloudEnabled && data.cloudStandaloneSetup?.apmServerUrl + ); + + const fleetAgentsOptions = data.fleetAgents.map((agent) => { + return { + key: agent.id, + type: 'fleetAgents', + label: agent.name, + apmServerUrl: agent.apmServerUrl, + secretToken: agent.secretToken, + isVisible: true, + isSelected: agent.id === POLICY_ELASTIC_AGENT_ON_CLOUD, + }; + }); + + const hasFleetAgentsSelected = fleetAgentsOptions.some( + ({ isSelected }) => isSelected + ); + + return [ + { + key: 'cloud', + type: 'standalone', + label: DEFAULT_STANDALONE_CONFIG_LABEL, + apmServerUrl: data.cloudStandaloneSetup?.apmServerUrl, + secretToken: data.cloudStandaloneSetup?.secretToken, + isVisible: isCloudVisible && !hasFleetAgentsSelected, + isSelected: !hasFleetAgentsSelected, + }, + { + key: 'onPrem', + type: 'standalone', + label: DEFAULT_STANDALONE_CONFIG_LABEL, + apmServerUrl: 'http://localhost:8200', + secretToken: '', + isVisible: !isCloudVisible && !hasFleetAgentsSelected, + isSelected: !hasFleetAgentsSelected, + }, + ...fleetAgentsOptions, + ].filter(({ isVisible }) => isVisible); +} diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx new file mode 100644 index 00000000000000..8f8afe58506a69 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx @@ -0,0 +1,205 @@ +/* + * 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 { fireEvent, render, screen } from '@testing-library/react'; +import { HttpStart } from 'kibana/public'; +import React from 'react'; +import TutorialConfigAgent from './'; + +const policyElasticAgentOnCloudAgent = { + id: 'policy-elastic-agent-on-cloud', + name: 'Elastic Cloud agent policy', + apmServerUrl: 'apm_cloud_url', + secretToken: 'apm_cloud_token', +}; + +const fleetAgents = [ + { + id: '1', + name: 'agent foo', + apmServerUrl: 'foo', + secretToken: 'foo', + }, + { + id: '2', + name: 'agent bar', + apmServerUrl: 'bar', + secretToken: 'bar', + }, +]; + +describe('TutorialConfigAgent', () => { + it('renders loading component while API is being called', () => { + const component = render( + + ); + expect(component.getByTestId('loading')).toBeInTheDocument(); + }); + it('updates commands when a different policy is selected', async () => { + const component = render( + + ); + expect( + await screen.findByText('Default Standalone configuration') + ).toBeInTheDocument(); + let commands = component.getByTestId('commands').innerHTML; + expect(commands).not.toEqual(''); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-<version>.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls=http://localhost:8200 \\\\ + -Delastic.apm.secret_token= \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + + fireEvent.click(component.getByTestId('comboBoxToggleListButton')); + fireEvent.click(component.getByText('agent foo')); + commands = component.getByTestId('commands').innerHTML; + expect(commands).not.toEqual(''); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-<version>.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls=foo \\\\ + -Delastic.apm.secret_token=foo \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + }); + describe('running on prem', () => { + it('selects defaul standalone by defauls', async () => { + const component = render( + + ); + expect( + await screen.findByText('Default Standalone configuration') + ).toBeInTheDocument(); + expect( + component.getByTestId('policySelector_onPrem') + ).toBeInTheDocument(); + const commands = component.getByTestId('commands').innerHTML; + expect(commands).not.toEqual(''); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-<version>.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls=http://localhost:8200 \\\\ + -Delastic.apm.secret_token= \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + }); + }); + describe('running on cloud', () => { + it('selects defaul standalone by defauls', async () => { + const component = render( + + ); + expect( + await screen.findByText('Default Standalone configuration') + ).toBeInTheDocument(); + expect(component.getByTestId('policySelector_cloud')).toBeInTheDocument(); + const commands = component.getByTestId('commands').innerHTML; + expect(commands).not.toEqual(''); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-<version>.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls=cloud_url \\\\ + -Delastic.apm.secret_token=cloud_token \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + }); + it('selects policy elastic agent on cloud when available by default', async () => { + const component = render( + + ); + expect( + await screen.findByText('Elastic Cloud agent policy') + ).toBeInTheDocument(); + expect( + component.getByTestId('policySelector_policy-elastic-agent-on-cloud') + ).toBeInTheDocument(); + const commands = component.getByTestId('commands').innerHTML; + expect(commands).not.toEqual(''); + expect(commands).toMatchInlineSnapshot(` + "java -javaagent:/path/to/elastic-apm-agent-<version>.jar \\\\ + -Delastic.apm.service_name=my-application \\\\ + -Delastic.apm.server_urls=apm_cloud_url \\\\ + -Delastic.apm.secret_token=apm_cloud_token \\\\ + -Delastic.apm.environment=production \\\\ + -Delastic.apm.application_packages=org.example \\\\ + -jar my-application.jar" + `); + }); + }); +}); diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx new file mode 100644 index 00000000000000..755c3eca55868a --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx @@ -0,0 +1,144 @@ +/* + * 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 { + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { HttpStart } from 'kibana/public'; +import React, { useEffect, useMemo, useState } from 'react'; +import styled from 'styled-components'; +import { APIReturnType } from '../..//services/rest/createCallApmApi'; +import { getCommands } from './commands/get_commands'; +import { CopyCommands } from './copy_commands'; +import { getPolicyOptions, PolicyOption } from './get_policy_options'; +import { PolicySelector } from './policy_selector'; + +export type APIResponseType = APIReturnType<'GET /api/apm/fleet/agents'>; + +const CentralizedContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; +`; + +const MANAGE_FLEET_POLICIES_LABEL = i18n.translate( + 'xpack.apm.tutorial.agent_config.manageFleetPolicies', + { defaultMessage: 'Manage fleet policies' } +); + +const GET_STARTED_WITH_FLEET_LABEL = i18n.translate( + 'xpack.apm.tutorial.agent_config.getStartedWithFleet', + { defaultMessage: 'Get started with fleet' } +); + +interface Props { + variantId: string; + http: HttpStart; + basePath: string; + isCloudEnabled: boolean; +} + +function TutorialConfigAgent({ + variantId, + http, + basePath, + isCloudEnabled, +}: Props) { + const [data, setData] = useState({ + fleetAgents: [], + cloudStandaloneSetup: undefined, + }); + const [isLoading, setIsLoading] = useState(true); + const [selectedOption, setSelectedOption] = useState(); + + useEffect(() => { + async function fetchData() { + setIsLoading(true); + try { + const response = await http.get('/api/apm/fleet/agents'); + if (response) { + setData(response as APIResponseType); + } + } catch (e) { + console.error('Error while fetching fleet agents.', e); + } + } + fetchData(); + }, [http]); + + // Depending the environment running (onPrem/Cloud) different values must be available and automatically selected + const options = useMemo(() => { + const availableOptions = getPolicyOptions({ + isCloudEnabled, + data, + }); + const defaultSelectedOption = availableOptions.find( + ({ isSelected }) => isSelected + ); + setSelectedOption(defaultSelectedOption); + setIsLoading(false); + return availableOptions; + }, [data, isCloudEnabled]); + + if (isLoading) { + return ( + + + + ); + } + + const commands = getCommands({ + variantId, + policyDetails: { + apmServerUrl: selectedOption?.apmServerUrl, + secretToken: selectedOption?.secretToken, + }, + }); + + const hasFleetAgents = !!data.fleetAgents.length; + const fleetLink = hasFleetAgents + ? { + label: MANAGE_FLEET_POLICIES_LABEL, + href: `${basePath}/app/fleet#/policies`, + } + : { + label: GET_STARTED_WITH_FLEET_LABEL, + href: `${basePath}/app/integrations#/detail/apm-0.3.0/overview`, + }; + + return ( + <> + + + + setSelectedOption(newSelectedOption) + } + fleetLink={fleetLink} + /> + + + + + + + + {commands} + + + ); +} + +// eslint-disable-next-line import/no-default-export +export default TutorialConfigAgent; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/policy_selector.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/policy_selector.tsx new file mode 100644 index 00000000000000..3a0c6d70db82be --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/policy_selector.tsx @@ -0,0 +1,92 @@ +/* + * 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 { + EuiComboBox, + EuiComboBoxOptionOption, + EuiFormRow, + EuiLink, + EuiText, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { groupBy } from 'lodash'; +import React from 'react'; +import { PolicyOption } from './get_policy_options'; + +interface Props { + options: PolicyOption[]; + selectedOption?: PolicyOption; + onChange: (selectedOption?: PolicyOption) => void; + fleetLink: { + label: string; + href: string; + }; +} + +export function PolicySelector({ + options, + selectedOption, + onChange, + fleetLink, +}: Props) { + const { fleetAgents, standalone } = groupBy(options, 'type'); + + const standaloneComboboxOptions: EuiComboBoxOptionOption[] = + standalone?.map(({ key, label }) => ({ key, label })) || []; + + const fleetAgentsComboboxOptions = fleetAgents?.length + ? [ + { + key: 'fleet_policies', + label: i18n.translate( + 'xpack.apm.tutorial.agent_config.fleetPoliciesLabel', + { defaultMessage: 'Fleet policies' } + ), + options: fleetAgents.map(({ key, label }) => ({ key, label })), + }, + ] + : []; + + return ( + + {fleetLink.label} + + } + helpText={i18n.translate( + 'xpack.apm.tutorial.agent_config.choosePolicy.helper', + { + defaultMessage: + 'Adds the selected policy configuration to the snippet below.', + } + )} + > + { + const newSelectedOption = options.find( + ({ key }) => key === selectedOptions[0].key + ); + onChange(newSelectedOption); + }} + /> + + ); +} diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx new file mode 100644 index 00000000000000..ae3ec803ac5883 --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx @@ -0,0 +1,33 @@ +/* + * 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 { HttpStart } from 'kibana/public'; +import React from 'react'; +import TutorialConfigAgent from './'; + +interface Props { + http: HttpStart; + basePath: string; + isCloudEnabled: boolean; +} + +function TutorialConfigAgentRumScript({ + http, + basePath, + isCloudEnabled, +}: Props) { + return ( + + ); +} + +// eslint-disable-next-line import/no-default-export +export default TutorialConfigAgentRumScript; diff --git a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx new file mode 100644 index 00000000000000..40b72f06654ffa --- /dev/null +++ b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx @@ -0,0 +1,46 @@ +/* + * 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 { Story } from '@storybook/react'; +import React from 'react'; +import { HttpStart } from 'kibana/public'; +import TutorialFleetInstructions from '.'; + +interface Args { + hasFleetPoliciesWithApmIntegration: boolean; +} + +function Wrapper({ hasFleetPoliciesWithApmIntegration }: Args) { + const http = ({ + get: () => ({ hasData: hasFleetPoliciesWithApmIntegration }), + } as unknown) as HttpStart; + return ( + + ); +} + +export default { + title: 'app/Tutorial/FleetInstructions', + component: TutorialFleetInstructions, + argTypes: { + hasFleetPoliciesWithApmIntegration: { + control: { type: 'boolean', options: [true, false] }, + }, + }, +}; + +export const Instructions: Story = (args) => { + return ; +}; + +Instructions.args = { + hasFleetPoliciesWithApmIntegration: true, +}; diff --git a/x-pack/plugins/apm/server/lib/fleet/get_agents.ts b/x-pack/plugins/apm/server/lib/fleet/get_agents.ts new file mode 100644 index 00000000000000..5ee44bb3ad1746 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_agents.ts @@ -0,0 +1,34 @@ +/* + * 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 { + CoreSetup, + CoreStart, + SavedObjectsClientContract, +} from 'kibana/server'; +import { APMPluginStartDependencies } from '../../types'; +import { getInternalSavedObjectsClient } from '../helpers/get_internal_saved_objects_client'; + +export async function getFleetAgents({ + policyIds, + core, + fleetPluginStart, +}: { + policyIds: string[]; + core: { setup: CoreSetup; start: () => Promise }; + fleetPluginStart: NonNullable; +}) { + // @ts-ignore + const savedObjectsClient: SavedObjectsClientContract = await getInternalSavedObjectsClient( + core.setup + ); + + return await fleetPluginStart.agentPolicyService.getByIds( + savedObjectsClient, + policyIds + ); +} diff --git a/x-pack/plugins/apm/server/routes/fleet.ts b/x-pack/plugins/apm/server/routes/fleet.ts index 74ca8dc368dade..01323add276df2 100644 --- a/x-pack/plugins/apm/server/routes/fleet.ts +++ b/x-pack/plugins/apm/server/routes/fleet.ts @@ -5,23 +5,28 @@ * 2.0. */ +import { keyBy } from 'lodash'; import Boom from '@hapi/boom'; import { i18n } from '@kbn/i18n'; +import { getFleetAgents } from '../lib/fleet/get_agents'; import { getApmPackgePolicies } from '../lib/fleet/get_apm_package_policies'; import { createApmServerRoute } from './create_apm_server_route'; import { createApmServerRouteRepository } from './create_apm_server_route_repository'; +const FLEET_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.fleet_has_data.fleetRequired', + { + defaultMessage: `Fleet plugin is required`, + } +); + const hasFleetDataRoute = createApmServerRoute({ endpoint: 'GET /api/apm/fleet/has_data', options: { tags: [] }, handler: async ({ core, plugins }) => { const fleetPluginStart = await plugins.fleet?.start(); if (!fleetPluginStart) { - throw Boom.internal( - i18n.translate('xpack.apm.fleet_has_data.fleetRequired', { - defaultMessage: `Fleet plugin is required`, - }) - ); + throw Boom.internal(FLEET_REQUIRED_MESSAGE); } const packagePolicies = await getApmPackgePolicies({ core, @@ -31,6 +36,54 @@ const hasFleetDataRoute = createApmServerRoute({ }, }); -export const ApmFleetRouteRepository = createApmServerRouteRepository().add( - hasFleetDataRoute -); +const fleetAgentsRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/fleet/agents', + options: { tags: [] }, + handler: async ({ core, plugins }) => { + const cloudSetup = plugins.cloud?.setup; + const cloudStandaloneSetup = cloudSetup + ? { + apmServerUrl: cloudSetup?.apm.url, + secretToken: cloudSetup?.apm.secretToken, + } + : undefined; + + const fleetPluginStart = await plugins.fleet?.start(); + if (!fleetPluginStart) { + throw Boom.internal(FLEET_REQUIRED_MESSAGE); + } + // fetches package policies that contains APM integrations + const packagePolicies = await getApmPackgePolicies({ + core, + fleetPluginStart, + }); + + const policiesGroupedById = keyBy(packagePolicies.items, 'policy_id'); + + // fetches all agents with the found package policies + const fleetAgents = await getFleetAgents({ + policyIds: Object.keys(policiesGroupedById), + core, + fleetPluginStart, + }); + + return { + cloudStandaloneSetup, + fleetAgents: fleetAgents.map((agent) => { + const packagePolicy = policiesGroupedById[agent.id]; + const apmServerCompiledInputs = + packagePolicy.inputs[0].compiled_input['apm-server']; + return { + id: agent.id, + name: agent.name, + apmServerUrl: apmServerCompiledInputs?.url, + secretToken: apmServerCompiledInputs?.secret_token, + }; + }), + }; + }, +}); + +export const ApmFleetRouteRepository = createApmServerRouteRepository() + .add(hasFleetDataRoute) + .add(fleetAgentsRoute); diff --git a/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts b/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts index ba11a996f00df4..e2bf09dae5bede 100644 --- a/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts +++ b/x-pack/plugins/apm/server/tutorial/instructions/apm_agent_instructions.ts @@ -31,55 +31,7 @@ export const createNodeAgentInstructions = ( APM services are created programmatically based on the `serviceName`. \ This agent supports a variety of frameworks but can also be used with your custom stack.', }), - commands: `// ${i18n.translate( - 'xpack.apm.tutorial.nodeClient.configure.commands.addThisToTheFileTopComment', - { - defaultMessage: - 'Add this to the VERY top of the first file loaded in your app', - } - )} -var apm = require('elastic-apm-node').start({curlyOpen} - - // ${i18n.translate( - 'xpack.apm.tutorial.nodeClient.configure.commands.setRequiredServiceNameComment', - { - defaultMessage: 'Override the service name from package.json', - } - )} - // ${i18n.translate( - 'xpack.apm.tutorial.nodeClient.configure.commands.allowedCharactersComment', - { - defaultMessage: 'Allowed characters: a-z, A-Z, 0-9, -, _, and space', - } - )} - serviceName: '', - - // ${i18n.translate( - 'xpack.apm.tutorial.nodeClient.configure.commands.useIfApmRequiresTokenComment', - { - defaultMessage: 'Use if APM Server requires a secret token', - } - )} - secretToken: '${secretToken}', - - // ${i18n.translate( - 'xpack.apm.tutorial.nodeClient.configure.commands.setCustomApmServerUrlComment', - { - defaultMessage: - 'Set the custom APM Server URL (default: {defaultApmServerUrl})', - values: { defaultApmServerUrl: 'http://localhost:8200' }, - } - )} - serverUrl: '${apmServerUrl}', - - // ${i18n.translate( - 'xpack.apm.tutorial.nodeClient.configure.commands.setCustomServiceEnvironmentComment', - { - defaultMessage: 'Set the service environment', - } - )} - environment: 'production' -{curlyClose})`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.nodeClient.configure.textPost', { @@ -122,70 +74,7 @@ export const createDjangoAgentInstructions = ( APM services are created programmatically based on the `SERVICE_NAME`.', } ), - commands: `# ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.addAgentComment', - { - defaultMessage: 'Add the agent to the installed apps', - } - )} -INSTALLED_APPS = ( - 'elasticapm.contrib.django', - # ... -) - -ELASTIC_APM = {curlyOpen} - # ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.setRequiredServiceNameComment', - { - defaultMessage: 'Set the required service name. Allowed characters:', - } - )} - # ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.allowedCharactersComment', - { - defaultMessage: 'a-z, A-Z, 0-9, -, _, and space', - } - )} - 'SERVICE_NAME': '', - - # ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.useIfApmServerRequiresTokenComment', - { - defaultMessage: 'Use if APM Server requires a secret token', - } - )} - 'SECRET_TOKEN': '${secretToken}', - - # ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.setCustomApmServerUrlComment', - { - defaultMessage: - 'Set the custom APM Server URL (default: {defaultApmServerUrl})', - values: { defaultApmServerUrl: 'http://localhost:8200' }, - } - )} - 'SERVER_URL': '${apmServerUrl}', - - # ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.setServiceEnvironmentComment', - { - defaultMessage: 'Set the service environment', - } - )} - 'ENVIRONMENT': 'production', -{curlyClose} - -# ${i18n.translate( - 'xpack.apm.tutorial.djangoClient.configure.commands.addTracingMiddlewareComment', - { - defaultMessage: - 'To send performance metrics, add our tracing middleware:', - } - )} -MIDDLEWARE = ( - 'elasticapm.contrib.django.middleware.TracingMiddleware', - #... -)`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.djangoClient.configure.textPost', { @@ -225,67 +114,7 @@ export const createFlaskAgentInstructions = ( APM services are created programmatically based on the `SERVICE_NAME`.', } ), - commands: `# ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.initializeUsingEnvironmentVariablesComment', - { - defaultMessage: 'initialize using environment variables', - } - )} -from elasticapm.contrib.flask import ElasticAPM -app = Flask(__name__) -apm = ElasticAPM(app) - -# ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.configureElasticApmComment', - { - defaultMessage: - "or configure to use ELASTIC_APM in your application's settings", - } - )} -from elasticapm.contrib.flask import ElasticAPM -app.config['ELASTIC_APM'] = {curlyOpen} - # ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.setRequiredServiceNameComment', - { - defaultMessage: 'Set the required service name. Allowed characters:', - } - )} - # ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.allowedCharactersComment', - { - defaultMessage: 'a-z, A-Z, 0-9, -, _, and space', - } - )} - 'SERVICE_NAME': '', - - # ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.useIfApmServerRequiresTokenComment', - { - defaultMessage: 'Use if APM Server requires a secret token', - } - )} - 'SECRET_TOKEN': '${secretToken}', - - # ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.setCustomApmServerUrlComment', - { - defaultMessage: - 'Set the custom APM Server URL (default: {defaultApmServerUrl})', - values: { defaultApmServerUrl: 'http://localhost:8200' }, - } - )} - 'SERVER_URL': '${apmServerUrl}', - - # ${i18n.translate( - 'xpack.apm.tutorial.flaskClient.configure.commands.setServiceEnvironmentComment', - { - defaultMessage: 'Set the service environment', - } - )} - 'ENVIRONMENT': 'production', -{curlyClose} - -apm = ElasticAPM(app)`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.flaskClient.configure.textPost', { @@ -325,20 +154,7 @@ export const createRailsAgentInstructions = ( values: { configFile: '`config/elastic_apm.yml`' }, } ), - commands: `# config/elastic_apm.yml: - -# Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space -# Defaults to the name of your Rails app -service_name: 'my-service' - -# Use if APM Server requires a secret token -secret_token: '${secretToken}' - -# Set the custom APM Server URL (default: http://localhost:8200) -server_url: '${apmServerUrl || 'http://localhost:8200'}' - -# Set the service environment -environment: 'production'`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.railsClient.configure.textPost', { @@ -413,48 +229,7 @@ export const createRackAgentInstructions = ( values: { configFile: '`config/elastic_apm.yml`' }, } ), - commands: `# config/elastic_apm.yml: - -# ${i18n.translate( - 'xpack.apm.tutorial.rackClient.createConfig.commands.setServiceNameComment', - { - defaultMessage: - 'Set the service name - allowed characters: a-z, A-Z, 0-9, -, _ and space', - } - )} -# ${i18n.translate( - 'xpack.apm.tutorial.rackClient.createConfig.commands.defaultsToTheNameOfRackAppClassComment', - { - defaultMessage: "Defaults to the name of your Rack app's class.", - } - )} -service_name: 'my-service' - -# ${i18n.translate( - 'xpack.apm.tutorial.rackClient.createConfig.commands.useIfApmServerRequiresTokenComment', - { - defaultMessage: 'Use if APM Server requires a token', - } - )} -secret_token: '${secretToken}' - -# ${i18n.translate( - 'xpack.apm.tutorial.rackClient.createConfig.commands.setCustomApmServerComment', - { - defaultMessage: - 'Set custom APM Server URL (default: {defaultServerUrl})', - values: { defaultServerUrl: 'http://localhost:8200' }, - } - )} -server_url: '${apmServerUrl || 'http://localhost:8200'}', - -# ${i18n.translate( - 'xpack.apm.tutorial.rackClient.createConfig.commands.setServiceEnvironment', - { - defaultMessage: 'Set the service environment', - } - )} -environment: 'production'`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.rackClient.createConfig.textPost', { @@ -506,45 +281,7 @@ for details on how to enable RUM support.', The Agent can then be initialized and configured in your application like this:', } ), - commands: `import {curlyOpen} init as initApm {curlyClose} from '@elastic/apm-rum' -var apm = initApm({curlyOpen} - - // ${i18n.translate( - 'xpack.apm.tutorial.jsClient.installDependency.commands.setRequiredServiceNameComment', - { - defaultMessage: - 'Set required service name (allowed characters: a-z, A-Z, 0-9, -, _, and space)', - } - )} - serviceName: 'your-app-name', - - // ${i18n.translate( - 'xpack.apm.tutorial.jsClient.installDependency.commands.setCustomApmServerUrlComment', - { - defaultMessage: - 'Set custom APM Server URL (default: {defaultApmServerUrl})', - values: { defaultApmServerUrl: 'http://localhost:8200' }, - } - )} - serverUrl: '${apmServerUrl}', - - // ${i18n.translate( - 'xpack.apm.tutorial.jsClient.installDependency.commands.setServiceVersionComment', - { - defaultMessage: - 'Set the service version (required for source map feature)', - } - )} - serviceVersion: '', - - // ${i18n.translate( - 'xpack.apm.tutorial.jsClient.installDependency.commands.setServiceEnvironmentComment', - { - defaultMessage: 'Set the service environment', - } - )} - environment: 'production' -{curlyClose})`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.jsClient.installDependency.textPost', { @@ -575,15 +312,7 @@ and host the file on your Server/CDN before deploying to production.", 'https://unpkg.com/@elastic/apm-rum/dist/bundles/elastic-apm-rum.umd.min.js', }, }), - commands: `\ - - -`.split('\n'), + customComponentName: 'TutorialConfigAgentRumScript', }, ]; @@ -610,55 +339,7 @@ export const createGoAgentInstructions = ( APM services are created programmatically based on the executable \ file name, or the `ELASTIC_APM_SERVICE_NAME` environment variable.', }), - commands: `# ${i18n.translate( - 'xpack.apm.tutorial.goClient.configure.commands.initializeUsingEnvironmentVariablesComment', - { - defaultMessage: 'Initialize using environment variables:', - } - )} - -# ${i18n.translate( - 'xpack.apm.tutorial.goClient.configure.commands.setServiceNameComment', - { - defaultMessage: - 'Set the service name. Allowed characters: # a-z, A-Z, 0-9, -, _, and space.', - } - )} -# ${i18n.translate( - 'xpack.apm.tutorial.goClient.configure.commands.usedExecutableNameComment', - { - defaultMessage: - 'If ELASTIC_APM_SERVICE_NAME is not specified, the executable name will be used.', - } - )} -export ELASTIC_APM_SERVICE_NAME= - -# ${i18n.translate( - 'xpack.apm.tutorial.goClient.configure.commands.setCustomApmServerUrlComment', - { - defaultMessage: - 'Set custom APM Server URL (default: {defaultApmServerUrl})', - values: { defaultApmServerUrl: 'http://localhost:8200' }, - } - )} -export ELASTIC_APM_SERVER_URL=${apmServerUrl} - -# ${i18n.translate( - 'xpack.apm.tutorial.goClient.configure.commands.useIfApmRequiresTokenComment', - { - defaultMessage: 'Use if APM Server requires a secret token', - } - )} -export ELASTIC_APM_SECRET_TOKEN=${secretToken} - -# ${i18n.translate( - 'xpack.apm.tutorial.goClient.configure.commands.setServiceEnvironment', - { - defaultMessage: 'Set the service environment', - } - )} -export ELASTIC_APM_ENVIRONMENT= -`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate('xpack.apm.tutorial.goClient.configure.textPost', { defaultMessage: 'See the [documentation]({documentationLink}) for advanced configuration.', @@ -743,13 +424,7 @@ Do **not** add the agent as a dependency to your application.', values: { customApmServerUrl: 'http://localhost:8200' }, } ), - commands: `java -javaagent:/path/to/elastic-apm-agent-.jar \\ - -Delastic.apm.service_name=my-application \\ - -Delastic.apm.server_urls=${apmServerUrl || 'http://localhost:8200'} \\ - -Delastic.apm.secret_token=${secretToken} \\ - -Delastic.apm.environment=production \\ - -Delastic.apm.application_packages=org.example \\ - -jar my-application.jar`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.javaClient.startApplication.textPost', { @@ -837,16 +512,7 @@ export const createDotNetAgentInstructions = ( defaultMessage: 'Sample appsettings.json file:', } ), - commands: `{curlyOpen} - "ElasticApm": {curlyOpen} - "SecretToken": "${secretToken}", - "ServerUrls": "${ - apmServerUrl || 'http://localhost:8200' - }", //Set custom APM Server URL (default: http://localhost:8200) - "ServiceName": "MyApp", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application - "Environment": "production", // Set the service environment - {curlyClose} -{curlyClose}`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.dotNetClient.configureAgent.textPost', { @@ -913,12 +579,7 @@ export const createPhpAgentInstructions = ( 'APM is automatically started when your app boots. Configure the agent either via `php.ini` file:', } ), - commands: `elastic_apm.server_url="${ - apmServerUrl || 'http://localhost:8200' - }" -elastic.apm.secret_token="${secretToken}" -elastic_apm.service_name="My service" -`.split('\n'), + customComponentName: 'TutorialConfigAgent', textPost: i18n.translate( 'xpack.apm.tutorial.phpClient.configure.textPost', { diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index 43a5a14b425b57..2632b7f9dd85ae 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -88,6 +88,7 @@ export const createMockAgentPolicyService = (): jest.Mocked { diff --git a/x-pack/plugins/fleet/server/services/index.ts b/x-pack/plugins/fleet/server/services/index.ts index ebddb695d695b2..f82415987e5ac6 100644 --- a/x-pack/plugins/fleet/server/services/index.ts +++ b/x-pack/plugins/fleet/server/services/index.ts @@ -69,6 +69,7 @@ export interface AgentPolicyServiceInterface { list: typeof agentPolicyService['list']; getDefaultAgentPolicyId: typeof agentPolicyService['getDefaultAgentPolicyId']; getFullAgentPolicy: typeof agentPolicyService['getFullAgentPolicy']; + getByIds: typeof agentPolicyService['getByIDs']; } // Saved object services From 85709925cc4961a1be723dd8ab7b2ccafb1e44ef Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Tue, 29 Jun 2021 15:00:05 +0200 Subject: [PATCH 082/227] [Security Solutions] Side Navigation phase 2 (#103275) * [SecuritySolutions] [Navigation] Prepare new routing and migrate overview (#101733) * prepare new routing and migrate overview * test fix and todo comments identified * telemetry using app views * navigation groups implemented * cleaning * export subplugin routes as route props array * [Security Solution][Navigation] Migrate Security Solutions 'explore' tab group to deep link navigation (#102306) * Update navigateToApp and getUrlForApp to provide the deepLinkId * Update Hosts and Network routes to start from /hosts and /network * Add Hosts and Network to side nav menu under "Explore" menu group * Delete Hosts and Network old menu code * Fix broken tests * [SecuritySolution] Add detections subplugin to deeplink (#101791) * prepare new routing and migrate overview * init nav deeplink * split detections into rules and alerts * init exception link * init detections * link to rules creation page * link to rules creation page * rename detections to alerts * fix unit tests * fix rules creation page * remove console * fix lint error * fix unit tests * fix unit tests * isolating rules and exceptions page * replace history push with navigateToApp * fix unit test * temporary fix for createCoreStartMock * update cypress * skip failing cypress * skip failing cypress Co-authored-by: semd * Migrate "Investigate" tab group to new side navigation (#102705) * Migrate "Investigate" tab group to new side navigation It includes: * Timelines * Cases * Quick fix useFormatUrl and HeaderPage navigation * [Security Solutions] Management navigation (#102685) * prepare new routing and migrate overview * test fix and todo comments identified * telemetry using app views * navigation groups implemented * cleaning * export subplugin routes as route props array * breadcrumbs changes and sidenav generation improvements * jest tests for breadcrumbs and navigation changes * retrocompatibility for sections that are not yet migrated to deepLinks * management deepLinks and plugin refactoring * home navigation changes * management navigation migrated to deeplinks * jest tests fixed * header page back link improved and tests fixed * type errors fixes * improve home navigation encapsulation Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> * Fix type checking * export header page * fix padding * add redirect routes * unskip detection cypress * fix i18n * fix create your own rules btn * fix cancel button on rules creation page * test fixes * fix breadcrumbs for rules pages * unit test fixes * additional fixes * [Security Solutions] Navigation usage tracker and general changes (#103271) * [Security Solutions] use of currentAppId$ migrated. and some small fixes * unused constants removed * remove unused constant * test fix and types * fix cypress * fix cypress tests * Fix case navTab permission and tests * Revert 'timeline.isOpen' breadcrumb code that was deleted during merge * Fix useInsertTimeline test by removing '/' * change global navigation visible deeplinks * fix /admininstration top level redirect to * fix global search icon, nav order and overview hosts link * update start a new case link * fix rules link in exception list table * unskip cypress tests * update rules link * fix full screen timeline * fixing broken links and administration telemetry split * remove unused comments * remove timeline z-index and cleanup global header component * some minor fixes * add unit tests for detections breadcrumbs * remove case to global/search nav when cases is none * rename test scenario * fix side_panel flyout * fix cases use cases between search/gobal nav * timeline snapshot regenerated and cypres test fixed * rollback management tracking split as it causes unexpected errors on the telemetry component Co-authored-by: Pablo Machado Co-authored-by: Angela Chuang <6295984+angorayc@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Michael Olorunnisola Co-authored-by: Angela Chuang Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> --- .../collectors/application_usage/schema.ts | 9 +- src/plugins/telemetry/schema/oss_plugins.json | 917 ------------------ .../recent_cases/no_cases/index.tsx | 18 +- .../security_solution/common/constants.ts | 56 +- .../integration/cases/attach_timeline.spec.ts | 10 +- .../detection_alerts/alerts_details.spec.ts | 6 +- ..._detection_callouts_index_outdated.spec.ts | 10 +- .../detection_alerts/attach_to_case.spec.ts | 6 +- .../detection_alerts/closing.spec.ts | 4 +- .../detection_alerts/in_progress.spec.ts | 4 +- .../investigate_in_timeline.spec.ts | 4 +- .../missing_privileges_callout.spec.ts | 8 +- .../detection_alerts/opening.spec.ts | 4 +- .../detection_rules/custom_query_rule.spec.ts | 8 +- .../event_correlation_rule.spec.ts | 6 +- .../detection_rules/export_rule.spec.ts | 4 +- .../indicator_match_rule.spec.ts | 10 +- .../machine_learning_rule.spec.ts | 4 +- .../detection_rules/override.spec.ts | 4 +- .../detection_rules/prebuilt_rules.spec.ts | 6 +- .../detection_rules/sorting.spec.ts | 4 +- .../detection_rules/threshold_rule.spec.ts | 4 +- .../exceptions/exceptions_modal.spec.ts | 4 +- .../exceptions/exceptions_table.spec.ts | 18 +- .../integration/exceptions/from_alert.spec.ts | 4 +- .../integration/exceptions/from_rule.spec.ts | 4 +- .../integration/header/navigation.spec.ts | 44 +- .../integration/urls/compatibility.spec.ts | 28 +- .../cypress/integration/urls/state.spec.ts | 2 +- .../value_lists/value_lists.spec.ts | 6 +- .../cypress/screens/exceptions.ts | 5 +- .../cypress/screens/kibana_navigation.ts | 8 +- .../cypress/screens/security_header.ts | 8 +- .../cypress/urls/navigation.ts | 19 +- x-pack/plugins/security_solution/kibana.json | 10 +- .../public/app/deep_links/index.test.ts | 82 ++ .../public/app/deep_links/index.ts | 395 ++++++++ .../public/app/home/global_header/index.tsx | 22 +- .../public/app/home/home_navigations.ts | 130 +++ .../public/app/home/home_navigations.tsx | 72 -- .../public/app/home/index.tsx | 21 +- .../template_wrapper/bottom_bar/index.tsx | 16 +- .../security_solution/public/app/index.tsx | 33 +- .../public/app/search/index.test.ts | 22 - .../public/app/search/index.ts | 240 ----- .../public/app/translations.ts | 41 +- .../security_solution/public/app/types.ts | 25 +- .../cases/components/all_cases/index.tsx | 11 +- .../cases/components/case_view/index.tsx | 20 +- .../cases/components/create/index.test.tsx | 8 +- .../public/cases/components/create/index.tsx | 9 +- .../add_to_case_action.test.tsx | 4 +- .../timeline_actions/add_to_case_action.tsx | 8 +- .../security_solution/public/cases/index.ts | 4 +- .../public/cases/pages/case_details.tsx | 9 +- .../public/cases/pages/configure_cases.tsx | 8 +- .../public/cases/pages/create_case.tsx | 8 +- .../public/cases/pages/index.tsx | 10 +- .../public/cases/pages/utils.ts | 12 +- .../security_solution/public/cases/routes.tsx | 23 +- .../components/endpoint/link_to_app.tsx | 18 +- .../components/endpoint/route_capture.tsx | 9 +- .../components/header_page/index.test.tsx | 12 +- .../common/components/header_page/index.tsx | 18 +- .../components/link_to/__mocks__/index.ts | 2 +- .../public/common/components/link_to/index.ts | 12 +- .../link_to/redirect_to_detection_engine.tsx | 11 +- .../components/link_to/redirect_to_hosts.tsx | 4 +- .../link_to/redirect_to_timelines.tsx | 2 - .../public/common/components/links/index.tsx | 14 +- .../ml_host_conditional_container.tsx | 145 +-- .../ml_network_conditional_container.tsx | 149 +-- .../navigation/breadcrumbs/index.test.ts | 223 ++++- .../navigation/breadcrumbs/index.ts | 33 +- .../components/navigation/index.test.tsx | 121 +-- .../common/components/navigation/index.tsx | 6 +- .../navigation/tab_navigation/index.test.tsx | 218 ++--- .../navigation/tab_navigation/index.tsx | 80 +- .../navigation/tab_navigation/types.ts | 3 - .../common/components/navigation/types.ts | 31 +- .../index.test.tsx | 114 ++- .../index.tsx | 23 +- .../use_security_solution_navigation/types.ts | 2 +- .../use_navigation_items.tsx | 105 +- .../use_primary_navigation.tsx | 15 +- .../common/components/url_state/constants.ts | 6 +- .../common/components/url_state/helpers.ts | 8 +- .../components/url_state/index.test.tsx | 4 +- .../url_state/initialize_redux_by_url.tsx | 2 +- .../common/components/url_state/types.ts | 20 +- .../components/url_state/use_url_state.tsx | 2 +- .../public/common/containers/source/index.tsx | 5 +- .../use_navigate_to_app_event_handler.ts | 6 +- .../common/lib/kibana/__mocks__/index.ts | 9 + .../public/common/lib/kibana/hooks.ts | 56 +- .../mock/endpoint/app_context_render.tsx | 49 +- .../alerts_histogram_panel/index.test.tsx | 7 +- .../alerts_histogram_panel/index.tsx | 5 +- .../load_empty_prompt.test.tsx | 6 +- .../pre_packaged_rules/load_empty_prompt.tsx | 11 +- .../rule_actions_overflow/index.test.tsx | 29 +- .../rules/rule_actions_overflow/index.tsx | 6 +- .../rules/step_define_rule/index.tsx | 2 - .../public/detections/index.ts | 6 +- .../detection_engine/detection_engine.tsx | 15 +- .../pages/detection_engine/index.test.tsx | 20 - .../pages/detection_engine/index.tsx | 37 - .../detection_engine/rules/all/actions.tsx | 14 +- .../rules/all/columns.test.tsx | 7 +- .../detection_engine/rules/all/columns.tsx | 15 +- .../rules/all/exceptions/columns.tsx | 7 +- .../all/exceptions/exceptions_search_bar.tsx | 1 + .../all/exceptions/exceptions_table.test.tsx | 49 +- .../rules/all/exceptions/exceptions_table.tsx | 671 ++++++------- .../detection_engine/rules/all/index.test.tsx | 29 - .../detection_engine/rules/all/index.tsx | 51 +- .../rules/all/rules_tables.tsx | 3 + .../rules/create/index.test.tsx | 2 +- .../detection_engine/rules/create/index.tsx | 31 +- .../detection_engine/rules/details/index.tsx | 24 +- .../rules/edit/index.test.tsx | 1 + .../detection_engine/rules/edit/index.tsx | 33 +- .../detection_engine/rules/index.test.tsx | 2 + .../pages/detection_engine/rules/index.tsx | 28 +- .../detection_engine/rules/translations.ts | 2 +- .../detection_engine/rules/utils.test.ts | 4 +- .../pages/detection_engine/rules/utils.ts | 46 +- .../pages/detection_engine/translations.ts | 4 +- .../public/detections/routes.tsx | 41 +- .../public/exceptions/index.ts | 25 + .../public/exceptions/routes.tsx | 28 + .../security_solution/public/helpers.ts | 58 +- .../security_solution/public/hosts/index.ts | 4 +- .../hosts/pages/details/details_tabs.test.tsx | 2 +- .../public/hosts/pages/details/nav_tabs.tsx | 18 +- .../public/hosts/pages/details/utils.ts | 7 +- .../public/hosts/pages/hosts_tabs.tsx | 14 +- .../public/hosts/pages/index.tsx | 52 +- .../public/hosts/pages/nav_tabs.tsx | 16 +- .../public/hosts/pages/types.ts | 4 +- .../security_solution/public/hosts/routes.tsx | 20 +- .../public/lazy_application_dependencies.tsx | 1 - .../public/lazy_sub_plugins.tsx | 8 +- .../public/management/common/breadcrumbs.ts | 3 +- .../public/management/common/constants.ts | 15 +- .../public/management/common/routing.test.ts | 32 +- .../components/administration_list_page.tsx | 47 +- .../hooks/use_management_format_url.ts | 19 - .../public/management/index.ts | 4 +- .../components/endpoint_agent_status.test.tsx | 2 +- .../view/components/endpoint_policy_link.tsx | 13 +- .../details/components/actions_menu.test.tsx | 18 +- ...k_to_endpoint_details_flyout_subheader.tsx | 9 +- .../view/details/endpoint_details.tsx | 27 +- .../pages/endpoint_hosts/view/hooks/hooks.ts | 14 +- .../view/hooks/use_endpoint_action_items.tsx | 40 +- .../pages/endpoint_hosts/view/index.test.tsx | 51 +- .../pages/endpoint_hosts/view/index.tsx | 26 +- .../event_filters/store/middleware.test.ts | 2 +- .../pages/event_filters/store/reducer.test.ts | 2 +- .../event_filter_delete_modal.test.tsx | 2 +- .../view/event_filters_list_page.test.tsx | 8 +- .../public/management/pages/index.test.tsx | 12 +- .../public/management/pages/index.tsx | 19 +- .../components/fleet_event_filters_card.tsx | 25 +- .../components/fleet_trusted_apps_card.tsx | 26 +- .../pages/policy/view/policy_details.test.tsx | 5 +- .../pages/policy/view/policy_details.tsx | 9 +- .../view/policy_forms/protections/malware.tsx | 2 +- .../policy_forms/protections/ransomware.tsx | 2 +- .../trusted_apps/store/middleware.test.ts | 26 +- .../pages/trusted_apps/store/reducer.test.ts | 11 +- .../effected_policy_select.tsx | 11 +- .../trusted_apps_grid/index.test.tsx | 4 +- .../trusted_apps_list/index.test.tsx | 4 +- .../view/trusted_apps_page.test.tsx | 16 +- .../public/management/routes.tsx | 25 +- .../security_solution/public/network/index.ts | 4 +- .../public/network/pages/details/utils.ts | 6 +- .../public/network/pages/index.tsx | 42 +- .../network/pages/navigation/nav_tabs.tsx | 16 +- .../pages/navigation/network_routes.tsx | 14 +- .../public/network/pages/navigation/types.ts | 1 - .../public/network/pages/navigation/utils.ts | 5 +- .../public/network/pages/network.tsx | 5 +- .../public/network/pages/types.ts | 1 - .../public/network/routes.tsx | 24 +- .../components/alerts_by_category/index.tsx | 3 +- .../components/endpoint_notice/index.tsx | 9 +- .../components/events_by_dataset/index.tsx | 3 +- .../components/overview_host/index.tsx | 9 +- .../overview_network/index.test.tsx | 6 +- .../components/overview_network/index.tsx | 3 +- .../components/recent_cases/index.tsx | 22 +- .../components/recent_timelines/index.tsx | 4 +- .../public/overview/index.ts | 4 +- .../public/overview/routes.tsx | 21 +- .../security_solution/public/plugin.tsx | 273 ++---- .../security_solution/public/rules/index.ts | 25 + .../security_solution/public/rules/routes.tsx | 56 ++ .../flyout/add_to_case_button/index.test.tsx | 11 +- .../flyout/add_to_case_button/index.tsx | 9 +- .../components/flyout/pane/index.tsx | 24 +- .../open_timeline/use_timeline_types.test.tsx | 16 + .../open_timeline/use_timeline_types.tsx | 23 +- .../__snapshots__/index.test.tsx.snap | 3 + .../timelines/components/side_panel/index.tsx | 1 + .../renderers/formatted_field_helpers.tsx | 8 +- .../public/timelines/index.ts | 4 +- .../public/timelines/pages/index.tsx | 41 +- .../public/timelines/routes.tsx | 27 +- .../plugins/security_solution/public/types.ts | 19 +- .../security_solution/server/plugin.ts | 29 +- .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 215 files changed, 3239 insertions(+), 3571 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/app/deep_links/index.test.ts create mode 100644 x-pack/plugins/security_solution/public/app/deep_links/index.ts create mode 100644 x-pack/plugins/security_solution/public/app/home/home_navigations.ts delete mode 100644 x-pack/plugins/security_solution/public/app/home/home_navigations.tsx delete mode 100644 x-pack/plugins/security_solution/public/app/search/index.test.ts delete mode 100644 x-pack/plugins/security_solution/public/app/search/index.ts delete mode 100644 x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.tsx create mode 100644 x-pack/plugins/security_solution/public/exceptions/index.ts create mode 100644 x-pack/plugins/security_solution/public/exceptions/routes.tsx delete mode 100644 x-pack/plugins/security_solution/public/management/components/hooks/use_management_format_url.ts create mode 100644 x-pack/plugins/security_solution/public/rules/index.ts create mode 100644 x-pack/plugins/security_solution/public/rules/routes.tsx diff --git a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts index 1fa7d8e846c9da..65857f02c883d9 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/application_usage/schema.ts @@ -157,14 +157,7 @@ export const applicationUsageSchema = { security_login: commonSchema, security_logout: commonSchema, security_overwritten_session: commonSchema, - securitySolution: commonSchema, // It's a forward app so we'll likely never report it - 'securitySolution:overview': commonSchema, - 'securitySolution:detections': commonSchema, - 'securitySolution:hosts': commonSchema, - 'securitySolution:network': commonSchema, - 'securitySolution:timelines': commonSchema, - 'securitySolution:case': commonSchema, - 'securitySolution:administration': commonSchema, + securitySolution: commonSchema, siem: commonSchema, space_selector: commonSchema, uptime: commonSchema, diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 56fc7697a4e07d..d11e1cf78c9606 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -5280,923 +5280,6 @@ } } }, - "securitySolution:overview": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, - "securitySolution:detections": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, - "securitySolution:hosts": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, - "securitySolution:network": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, - "securitySolution:timelines": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, - "securitySolution:case": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, - "securitySolution:administration": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "Always `main`" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen over the last 90 days" - } - }, - "views": { - "type": "array", - "items": { - "properties": { - "appId": { - "type": "keyword", - "_meta": { - "description": "The application being tracked" - } - }, - "viewId": { - "type": "keyword", - "_meta": { - "description": "The application view being tracked" - } - }, - "clicks_total": { - "type": "long", - "_meta": { - "description": "General number of clicks in the application sub view since we started counting them" - } - }, - "clicks_7_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 7 days" - } - }, - "clicks_30_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 30 days" - } - }, - "clicks_90_days": { - "type": "long", - "_meta": { - "description": "General number of clicks in the active application sub view over the last 90 days" - } - }, - "minutes_on_screen_total": { - "type": "float", - "_meta": { - "description": "Minutes the application sub view is active and on-screen since we started counting them." - } - }, - "minutes_on_screen_7_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 7 days" - } - }, - "minutes_on_screen_30_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 30 days" - } - }, - "minutes_on_screen_90_days": { - "type": "float", - "_meta": { - "description": "Minutes the application is active and on-screen active application sub view over the last 90 days" - } - } - } - } - } - } - }, "siem": { "properties": { "appId": { diff --git a/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx b/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx index a5b90943a219a7..2d60cc1b223add 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/no_cases/index.tsx @@ -5,10 +5,11 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; -import { EuiLink } from '@elastic/eui'; import * as i18n from '../translations'; +import { useKibana } from '../../../common/lib/kibana'; +import { LinkAnchor } from '../../links'; const NoCasesComponent = ({ createCaseHref, @@ -17,13 +18,22 @@ const NoCasesComponent = ({ createCaseHref: string; hasWritePermissions: boolean; }) => { + const { navigateToUrl } = useKibana().services.application; + const goToCaseCreation = useCallback( + (e) => { + e.preventDefault(); + navigateToUrl(createCaseHref); + }, + [createCaseHref, navigateToUrl] + ); return hasWritePermissions ? ( <> {i18n.NO_CASES} - {` ${i18n.START_A_NEW_CASE}`} + >{` ${i18n.START_A_NEW_CASE}`} {'!'} ) : ( diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index d59d7e7b7da4f8..3fb32856a1ef11 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -62,29 +62,57 @@ export const DEFAULT_INDICATOR_SOURCE_PATH = 'threatintel.indicator'; export const INDICATOR_DESTINATION_PATH = 'threat.indicator'; export enum SecurityPageName { - detections = 'detections', overview = 'overview', + detections = 'detections', + alerts = 'alerts', + rules = 'rules', + exceptions = 'exceptions', hosts = 'hosts', network = 'network', timelines = 'timelines', case = 'case', administration = 'administration', + endpoints = 'endpoints', + policies = 'policies', + trustedApps = 'trusted_apps', + eventFilters = 'event_filters', } -/** - * The ID of the cases plugin - */ -export const CASES_APP_ID = `${APP_ID}:${SecurityPageName.case}`; - -export const APP_OVERVIEW_PATH = `${APP_PATH}/overview`; -export const APP_DETECTIONS_PATH = `${APP_PATH}/detections`; -export const APP_HOSTS_PATH = `${APP_PATH}/hosts`; -export const APP_NETWORK_PATH = `${APP_PATH}/network`; -export const APP_TIMELINES_PATH = `${APP_PATH}/timelines`; -export const APP_CASES_PATH = `${APP_PATH}/cases`; -export const APP_MANAGEMENT_PATH = `${APP_PATH}/administration`; +export enum SecurityPageGroupName { + detect = 'detect', + explore = 'explore', + investigate = 'investigate', + manage = 'manage', +} -export const DETECTIONS_SUB_PLUGIN_ID = `${APP_ID}:${SecurityPageName.detections}`; +export const TIMELINES_PATH = '/timelines'; +export const CASES_PATH = '/cases'; +export const OVERVIEW_PATH = '/overview'; +export const DETECTIONS_PATH = '/detections'; +export const ALERTS_PATH = '/alerts'; +export const RULES_PATH = '/rules'; +export const EXCEPTIONS_PATH = '/exceptions'; +export const HOSTS_PATH = '/hosts'; +export const NETWORK_PATH = '/network'; +export const MANAGEMENT_PATH = '/administration'; +export const ENDPOINTS_PATH = `${MANAGEMENT_PATH}/endpoints`; +export const TRUSTED_APPS_PATH = `${MANAGEMENT_PATH}/trusted_apps`; +export const EVENT_FILTERS_PATH = `${MANAGEMENT_PATH}/event_filters`; + +export const APP_OVERVIEW_PATH = `${APP_PATH}${OVERVIEW_PATH}`; +export const APP_MANAGEMENT_PATH = `${APP_PATH}${MANAGEMENT_PATH}`; + +export const APP_ALERTS_PATH = `${APP_PATH}${ALERTS_PATH}`; +export const APP_RULES_PATH = `${APP_PATH}${RULES_PATH}`; +export const APP_EXCEPTIONS_PATH = `${APP_PATH}${EXCEPTIONS_PATH}`; + +export const APP_HOSTS_PATH = `${APP_PATH}${HOSTS_PATH}`; +export const APP_NETWORK_PATH = `${APP_PATH}${NETWORK_PATH}`; +export const APP_TIMELINES_PATH = `${APP_PATH}${TIMELINES_PATH}`; +export const APP_CASES_PATH = `${APP_PATH}${CASES_PATH}`; +export const APP_ENDPOINTS_PATH = `${APP_PATH}${ENDPOINTS_PATH}`; +export const APP_TRUSTED_APPS_PATH = `${APP_PATH}${TRUSTED_APPS_PATH}`; +export const APP_EVENT_FILTERS_PATH = `${APP_PATH}${EVENT_FILTERS_PATH}`; /** The comma-delimited list of Elasticsearch indices from which the SIEM app collects events */ export const DEFAULT_INDEX_PATTERN = [ diff --git a/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts index 3f3209b52120eb..b8477d5b082802 100644 --- a/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts @@ -21,11 +21,13 @@ import { createCase } from '../../tasks/api_calls/cases'; describe('attach timeline to case', () => { context('without cases created', () => { - beforeEach(() => { + beforeEach((done) => { cleanKibana(); - createTimeline(timeline).then((response) => - cy.wrap(response.body.data.persistTimeline.timeline).as('myTimeline') - ); + + createTimeline(timeline).then((response) => { + cy.wrap(response.body.data.persistTimeline.timeline).as('myTimeline'); + done(); + }); }); it('attach timeline to a new case', function () { diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts index aeee7077ec9c04..d9ca43339d4126 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts @@ -20,17 +20,17 @@ import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { unmappedRule } from '../../objects/rule'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Alert details with unmapped fields', () => { beforeEach(() => { cleanKibana(); esArchiverLoad('unmapped_fields'); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(unmappedRule); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); expandFirstAlert(); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_detection_callouts_index_outdated.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_detection_callouts_index_outdated.spec.ts index 1c6c604b84fbb2..fb0b96c977e32c 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_detection_callouts_index_outdated.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_detection_callouts_index_outdated.spec.ts @@ -6,7 +6,7 @@ */ import { ROLES } from '../../../common/test'; -import { DETECTIONS_RULE_MANAGEMENT_URL, DETECTIONS_URL } from '../../urls/navigation'; +import { DETECTIONS_RULE_MANAGEMENT_URL, ALERTS_URL } from '../../urls/navigation'; import { newRule } from '../../objects/rule'; import { PAGE_TITLE } from '../../screens/common/page'; @@ -37,7 +37,7 @@ describe('Detections > Need Admin Callouts indicating an admin is needed to migr // First, we have to open the app on behalf of a privileged user in order to initialize it. // Otherwise the app will be disabled and show a "welcome"-like page. cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL, ROLES.platform_engineer); + loginAndWaitForPageWithoutDateRange(ALERTS_URL, ROLES.platform_engineer); waitForAlertsIndexToBeCreated(); // After that we can login as a soc manager. @@ -57,7 +57,7 @@ describe('Detections > Need Admin Callouts indicating an admin is needed to migr }); context('On Detections home page', () => { beforeEach(() => { - loadPageAsPlatformEngineerUser(DETECTIONS_URL); + loadPageAsPlatformEngineerUser(ALERTS_URL); }); it('We show the need admin primary callout', () => { @@ -107,7 +107,7 @@ describe('Detections > Need Admin Callouts indicating an admin is needed to migr }); context('On Detections home page', () => { beforeEach(() => { - loadPageAsPlatformEngineerUser(DETECTIONS_URL); + loadPageAsPlatformEngineerUser(ALERTS_URL); }); it('We show the need admin primary callout', () => { @@ -157,7 +157,7 @@ describe('Detections > Need Admin Callouts indicating an admin is needed to migr }); context('On Detections home page', () => { beforeEach(() => { - loadPageAsPlatformEngineerUser(DETECTIONS_URL); + loadPageAsPlatformEngineerUser(ALERTS_URL); }); it('We show the need admin primary callout', () => { diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts index 932f1ceac61e81..6cc5d2443e7840 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/attach_to_case.spec.ts @@ -15,11 +15,11 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { login, loginAndWaitForPage, waitForPageWithoutDateRange } from '../../tasks/login'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { ATTACH_ALERT_TO_CASE_BUTTON } from '../../screens/alerts_detection_rules'; const loadDetectionsPage = (role: ROLES) => { - waitForPageWithoutDateRange(DETECTIONS_URL, role); + waitForPageWithoutDateRange(ALERTS_URL, role); waitForAlertsToPopulate(); }; @@ -27,7 +27,7 @@ describe('Alerts timeline', () => { before(() => { // First we login as a privileged user to create alerts. cleanKibana(); - loginAndWaitForPage(DETECTIONS_URL, ROLES.platform_engineer); + loginAndWaitForPage(ALERTS_URL, ROLES.platform_engineer); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts index 741f05129f9c47..6ae23733d6434b 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/closing.spec.ts @@ -31,12 +31,12 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Closing alerts', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPage(DETECTIONS_URL); + loginAndWaitForPage(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule, '1', '100m', 100); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts index b4f890e4d8dbfe..cb8694d5c35af2 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/in_progress.spec.ts @@ -28,12 +28,12 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Marking alerts as in-progress', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPage(DETECTIONS_URL); + loginAndWaitForPage(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts index d705cb652d2eae..115118b6762d9d 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/investigate_in_timeline.spec.ts @@ -19,12 +19,12 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Alerts timeline', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPage(DETECTIONS_URL); + loginAndWaitForPage(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/missing_privileges_callout.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/missing_privileges_callout.spec.ts index 87a3dc84748767..20a863e742efd6 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/missing_privileges_callout.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/missing_privileges_callout.spec.ts @@ -6,7 +6,7 @@ */ import { ROLES } from '../../../common/test'; -import { DETECTIONS_RULE_MANAGEMENT_URL, DETECTIONS_URL } from '../../urls/navigation'; +import { DETECTIONS_RULE_MANAGEMENT_URL, ALERTS_URL } from '../../urls/navigation'; import { newRule } from '../../objects/rule'; import { PAGE_TITLE } from '../../screens/common/page'; @@ -47,7 +47,7 @@ describe('Detections > Callouts', () => { // First, we have to open the app on behalf of a privileged user in order to initialize it. // Otherwise the app will be disabled and show a "welcome"-like page. cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL, ROLES.platform_engineer); + loginAndWaitForPageWithoutDateRange(ALERTS_URL, ROLES.platform_engineer); waitForAlertsIndexToBeCreated(); // After that we can login as a read-only user. @@ -57,7 +57,7 @@ describe('Detections > Callouts', () => { context('indicating read-only access to resources', () => { context('On Detections home page', () => { beforeEach(() => { - loadPageAsReadOnlyUser(DETECTIONS_URL); + loadPageAsReadOnlyUser(ALERTS_URL); }); it('We show one primary callout', () => { @@ -125,7 +125,7 @@ describe('Detections > Callouts', () => { context('indicating read-write access to resources', () => { context('On Detections home page', () => { beforeEach(() => { - loadPageAsPlatformEngineer(DETECTIONS_URL); + loadPageAsPlatformEngineer(ALERTS_URL); }); it('We show no callout', () => { diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts index bc907dccd0a048..6cbc82b93f446f 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/opening.spec.ts @@ -29,12 +29,12 @@ import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { loginAndWaitForPage } from '../../tasks/login'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Opening alerts', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPage(DETECTIONS_URL); + loginAndWaitForPage(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts index 8210c7c6d8b20b..5f9175476795ce 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/custom_query_rule.spec.ts @@ -110,7 +110,7 @@ import { saveEditedRule, waitForKibana } from '../../tasks/edit_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { activatesRule } from '../../tasks/rule_details'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Custom detection rules creation', () => { const expectedUrls = newRule.referenceUrls.join(''); @@ -133,7 +133,7 @@ describe('Custom detection rules creation', () => { }); it('Creates and activates a new rule', function () { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); @@ -226,7 +226,7 @@ describe('Custom detection rules deletion and edition', () => { context('Deletion', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); goToManageAlertsDetectionRules(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(newRule, 'rule1'); @@ -302,7 +302,7 @@ describe('Custom detection rules deletion and edition', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); goToManageAlertsDetectionRules(); waitForAlertsIndexToBeCreated(); createCustomRuleActivated(existingRule, 'rule1'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts index b38796cca373d3..337e2a8ec5033e 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/event_correlation_rule.spec.ts @@ -75,7 +75,7 @@ import { } from '../../tasks/create_new_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Detection rules, EQL', () => { const expectedUrls = eqlRule.referenceUrls.join(''); @@ -99,7 +99,7 @@ describe('Detection rules, EQL', () => { }); it('Creates and activates a new EQL rule', function () { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); @@ -194,7 +194,7 @@ describe('Detection rules, sequence EQL', () => { }); it('Creates and activates a new EQL rule with a sequence', function () { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/export_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/export_rule.spec.ts index cbd37dec13232c..1de636010f9670 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/export_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/export_rule.spec.ts @@ -16,7 +16,7 @@ import { createCustomRule } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Export rules', () => { beforeEach(() => { @@ -25,7 +25,7 @@ describe('Export rules', () => { 'POST', '/api/detection_engine/rules/_export?exclude_export_details=false&file_name=rules_export.ndjson' ).as('export'); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRule(newRule).as('ruleResponse'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts index bc8cf0137fa830..c2e8a92474814b 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/indicator_match_rule.spec.ts @@ -123,7 +123,7 @@ import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { addsFieldsToTimeline, goBackToAllRulesTable } from '../../tasks/rule_details'; -import { DETECTIONS_URL, RULE_CREATION } from '../../urls/navigation'; +import { ALERTS_URL, RULE_CREATION } from '../../urls/navigation'; describe('indicator match', () => { describe('Detection rules, Indicator Match', () => { @@ -407,7 +407,7 @@ describe('indicator match', () => { describe('Generating signals', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); }); it('Creates and activates a new Indicator Match rule', () => { @@ -559,7 +559,7 @@ describe('indicator match', () => { cleanKibana(); esArchiverLoad('threat_indicator'); esArchiverLoad('suspicious_source_event'); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); goToManageAlertsDetectionRules(); createCustomIndicatorRule(newThreatIndicatorRule); reload(); @@ -571,7 +571,7 @@ describe('indicator match', () => { }); beforeEach(() => { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); goToManageAlertsDetectionRules(); goToRuleDetails(); }); @@ -687,7 +687,7 @@ describe('indicator match', () => { describe('Duplicates the indicator rule', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); goToManageAlertsDetectionRules(); createCustomIndicatorRule(newThreatIndicatorRule); reload(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts index 65dde40bbd76b8..2d869b314b67ca 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/machine_learning_rule.spec.ts @@ -62,7 +62,7 @@ import { } from '../../tasks/create_new_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Detection rules, machine learning', () => { const expectedUrls = machineLearningRule.referenceUrls.join(''); @@ -76,7 +76,7 @@ describe('Detection rules, machine learning', () => { }); it('Creates and activates a new ml rule', () => { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts index f9f1ca14c81642..a791cc293c1f06 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/override.spec.ts @@ -86,7 +86,7 @@ import { } from '../../tasks/create_new_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Detection rules, override', () => { const expectedUrls = newOverrideRule.referenceUrls.join(''); @@ -108,7 +108,7 @@ describe('Detection rules, override', () => { }); it('Creates and activates a new custom rule with override option', function () { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts index 74e1d082ae4103..b259c0f1d9e336 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts @@ -34,7 +34,7 @@ import { } from '../../tasks/alerts_detection_rules'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { totalNumberOfPrebuiltRules } from '../../objects/rule'; import { cleanKibana } from '../../tasks/common'; @@ -50,7 +50,7 @@ describe('Alerts rules, prebuilt rules', () => { const expectedNumberOfPages = Math.ceil(totalNumberOfPrebuiltRules / rowsPerPage); const expectedElasticRulesBtnText = `Elastic rules (${expectedNumberOfRules})`; - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); waitForRulesTableToBeLoaded(); @@ -72,7 +72,7 @@ describe('Actions with prebuilt rules', () => { const expectedElasticRulesBtnText = `Elastic rules (${expectedNumberOfRules})`; cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsIndexToBeCreated(); goToManageAlertsDetectionRules(); waitForRulesTableToBeLoaded(); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/sorting.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/sorting.spec.ts index bf5c281a43e39e..7d42ea533a9ae5 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/sorting.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/sorting.spec.ts @@ -36,7 +36,7 @@ import { import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; import { DEFAULT_RULE_REFRESH_INTERVAL_VALUE } from '../../../common/constants'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { createCustomRule } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { existingRule, newOverrideRule, newRule, newThresholdRule } from '../../objects/rule'; @@ -44,7 +44,7 @@ import { existingRule, newOverrideRule, newRule, newThresholdRule } from '../../ describe('Alerts detection rules', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); createCustomRule(newRule, '1'); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts index 0f4095372f92a7..ad71d54eb2a7ad 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/threshold_rule.spec.ts @@ -81,7 +81,7 @@ import { } from '../../tasks/create_new_rule'; import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; describe('Detection rules, threshold', () => { const expectedUrls = newThresholdRule.referenceUrls.join(''); @@ -96,7 +96,7 @@ describe('Detection rules, threshold', () => { createTimeline(newThresholdRule.timeline).then((response) => { rule.timeline.id = response.body.data.persistTimeline.timeline.savedObjectId; }); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_modal.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_modal.spec.ts index dee921b0c668af..a4b929f7d8e1d1 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_modal.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_modal.spec.ts @@ -31,7 +31,7 @@ import { ADD_EXCEPTIONS_BTN, } from '../../screens/exceptions'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { cleanKibana } from '../../tasks/common'; // NOTE: You might look at these tests and feel they're overkill, @@ -42,7 +42,7 @@ import { cleanKibana } from '../../tasks/common'; describe('Exceptions modal', () => { before(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsIndexToBeCreated(); createCustomRule(newRule); goToManageAlertsDetectionRules(); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_table.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_table.spec.ts index fdc8a268ca3684..83277075b35cc9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_table.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_table.spec.ts @@ -14,7 +14,10 @@ import { goToManageAlertsDetectionRules, waitForAlertsIndexToBeCreated } from '. import { createCustomRule } from '../../tasks/api_calls/rules'; import { goToRuleDetails, waitForRulesTableToBeLoaded } from '../../tasks/alerts_detection_rules'; import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver'; -import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; +import { + loginAndWaitForPageWithoutDateRange, + waitForPageWithoutDateRange, +} from '../../tasks/login'; import { addsExceptionFromRuleSettings, goBackToAllRulesTable, @@ -22,13 +25,12 @@ import { waitForTheRuleToBeExecuted, } from '../../tasks/rule_details'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL, EXCEPTIONS_URL } from '../../urls/navigation'; import { cleanKibana } from '../../tasks/common'; import { deleteExceptionListWithRuleReference, deleteExceptionListWithoutRuleReference, exportExceptionList, - goToExceptionsTable, searchForExceptionList, waitForExceptionsTableToBeLoaded, clearSearchSelection, @@ -42,7 +44,7 @@ import { createExceptionList } from '../../tasks/api_calls/exceptions'; describe('Exceptions Table', () => { before(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsIndexToBeCreated(); createCustomRule(newRule); goToManageAlertsDetectionRules(); @@ -69,7 +71,7 @@ describe('Exceptions Table', () => { }); it('Filters exception lists on search', () => { - goToExceptionsTable(); + waitForPageWithoutDateRange(EXCEPTIONS_URL); waitForExceptionsTableToBeLoaded(); cy.get(EXCEPTIONS_TABLE_SHOWING_LISTS).should('have.text', `Showing 3 lists`); @@ -110,7 +112,7 @@ describe('Exceptions Table', () => { it('Exports exception list', async function () { cy.intercept(/(\/api\/exception_lists\/_export)/).as('export'); - goToExceptionsTable(); + waitForPageWithoutDateRange(EXCEPTIONS_URL); waitForExceptionsTableToBeLoaded(); exportExceptionList(); @@ -124,7 +126,7 @@ describe('Exceptions Table', () => { }); it('Deletes exception list without rule reference', () => { - goToExceptionsTable(); + waitForPageWithoutDateRange(EXCEPTIONS_URL); waitForExceptionsTableToBeLoaded(); cy.get(EXCEPTIONS_TABLE_SHOWING_LISTS).should('have.text', `Showing 3 lists`); @@ -135,7 +137,7 @@ describe('Exceptions Table', () => { }); it('Deletes exception list with rule reference', () => { - goToExceptionsTable(); + waitForPageWithoutDateRange(EXCEPTIONS_URL); waitForExceptionsTableToBeLoaded(); cy.get(EXCEPTIONS_TABLE_SHOWING_LISTS).should('have.text', `Showing 2 lists`); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts index e36809380df863..4918de7488dddf 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_alert.spec.ts @@ -33,7 +33,7 @@ import { } from '../../tasks/rule_details'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { cleanKibana } from '../../tasks/common'; describe('From alert', () => { @@ -41,7 +41,7 @@ describe('From alert', () => { beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsIndexToBeCreated(); createCustomRule(newRule, 'rule_testing', '10s'); goToManageAlertsDetectionRules(); diff --git a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts index e0d7e5a32edfd3..ea8988456d8b30 100644 --- a/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/exceptions/from_rule.spec.ts @@ -32,14 +32,14 @@ import { } from '../../tasks/rule_details'; import { refreshPage } from '../../tasks/security_header'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { cleanKibana } from '../../tasks/common'; describe('From rule', () => { const NUMBER_OF_AUDITBEAT_EXCEPTIONS_ALERTS = '1'; beforeEach(() => { cleanKibana(); - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsIndexToBeCreated(); createCustomRule(newRule, 'rule_testing', '10s'); goToManageAlertsDetectionRules(); diff --git a/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts b/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts index 3caddb86d67258..2079e8e47d479f 100644 --- a/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts @@ -9,7 +9,9 @@ import { CASES, DETECTIONS, HOSTS, - ADMINISTRATION, + ENDPOINTS, + TRUSTED_APPS, + EVENT_FILTERS, NETWORK, OVERVIEW, TIMELINES, @@ -19,11 +21,13 @@ import { loginAndWaitForPage } from '../../tasks/login'; import { navigateFromHeaderTo } from '../../tasks/security_header'; import { - DETECTIONS_URL, + ALERTS_URL, CASES_URL, HOSTS_URL, KIBANA_HOME, - ADMINISTRATION_URL, + ENDPOINTS_URL, + TRUSTED_APPS_URL, + EVENT_FILTERS_URL, NETWORK_URL, OVERVIEW_URL, TIMELINES_URL, @@ -34,9 +38,9 @@ import { } from '../../tasks/kibana_navigation'; import { CASES_PAGE, - DETECTIONS_PAGE, + ALERTS_PAGE, HOSTS_PAGE, - ADMINISTRATION_PAGE, + ENDPOINTS_PAGE, NETWORK_PAGE, OVERVIEW_PAGE, TIMELINES_PAGE, @@ -54,9 +58,9 @@ describe('top-level navigation common to all pages in the Security app', () => { cy.url().should('include', OVERVIEW_URL); }); - it('navigates to the Detections page', () => { + it('navigates to the Alerts page', () => { navigateFromHeaderTo(DETECTIONS); - cy.url().should('include', DETECTIONS_URL); + cy.url().should('include', ALERTS_URL); }); it('navigates to the Hosts page', () => { @@ -79,9 +83,17 @@ describe('top-level navigation common to all pages in the Security app', () => { cy.url().should('include', CASES_URL); }); - it('navigates to the Administration page', () => { - navigateFromHeaderTo(ADMINISTRATION); - cy.url().should('include', ADMINISTRATION_URL); + it('navigates to the Endpoints page', () => { + navigateFromHeaderTo(ENDPOINTS); + cy.url().should('include', ENDPOINTS_URL); + }); + it('navigates to the Trusted Apps page', () => { + navigateFromHeaderTo(TRUSTED_APPS); + cy.url().should('include', TRUSTED_APPS_URL); + }); + it('navigates to the Event Filters page', () => { + navigateFromHeaderTo(EVENT_FILTERS); + cy.url().should('include', EVENT_FILTERS_URL); }); }); @@ -97,9 +109,9 @@ describe('Kibana navigation to all pages in the Security app ', () => { cy.url().should('include', OVERVIEW_URL); }); - it('navigates to the Detections page', () => { - navigateFromKibanaCollapsibleTo(DETECTIONS_PAGE); - cy.url().should('include', DETECTIONS_URL); + it('navigates to the Alerts page', () => { + navigateFromKibanaCollapsibleTo(ALERTS_PAGE); + cy.url().should('include', ALERTS_URL); }); it('navigates to the Hosts page', () => { @@ -122,8 +134,8 @@ describe('Kibana navigation to all pages in the Security app ', () => { cy.url().should('include', CASES_URL); }); - it('navigates to the Administration page', () => { - navigateFromKibanaCollapsibleTo(ADMINISTRATION_PAGE); - cy.url().should('include', ADMINISTRATION_URL); + it('navigates to the Endpoints page', () => { + navigateFromKibanaCollapsibleTo(ENDPOINTS_PAGE); + cy.url().should('include', ENDPOINTS_URL); }); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/urls/compatibility.spec.ts b/x-pack/plugins/security_solution/cypress/integration/urls/compatibility.spec.ts index b956eb64a04e55..bbbd6037d3862e 100644 --- a/x-pack/plugins/security_solution/cypress/integration/urls/compatibility.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/urls/compatibility.spec.ts @@ -7,7 +7,15 @@ import { loginAndWaitForPage, loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS } from '../../urls/navigation'; +import { + ALERTS_URL, + DETECTIONS, + DETECTIONS_RULE_MANAGEMENT_URL, + RULE_CREATION, + SECURITY_DETECTIONS_RULES_CREATION_URL, + SECURITY_DETECTIONS_RULES_URL, + SECURITY_DETECTIONS_URL, +} from '../../urls/navigation'; import { ABSOLUTE_DATE_RANGE } from '../../urls/state'; import { DATE_PICKER_START_DATE_POPOVER_BUTTON, @@ -25,10 +33,24 @@ describe('URL compatibility', () => { cleanKibana(); }); - it('Redirects to Detection alerts from old Detections URL', () => { + it('Redirects to alerts from old siem Detections URL', () => { loginAndWaitForPage(DETECTIONS); + cy.url().should('include', ALERTS_URL); + }); + + it('Redirects to alerts from old Detections URL', () => { + loginAndWaitForPage(SECURITY_DETECTIONS_URL); + cy.url().should('include', ALERTS_URL); + }); + + it('Redirects to rules from old Detections rules URL', () => { + loginAndWaitForPage(SECURITY_DETECTIONS_RULES_URL); + cy.url().should('include', DETECTIONS_RULE_MANAGEMENT_URL); + }); - cy.url().should('include', '/security/detections'); + it('Redirects to rules creation from old Detections rules creation URL', () => { + loginAndWaitForPage(SECURITY_DETECTIONS_RULES_CREATION_URL); + cy.url().should('include', RULE_CREATION); }); it('sets the global start and end dates from the url with timestamps', () => { diff --git a/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts b/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts index 48dc6faf8524e3..f2b644e8d054c9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts @@ -214,7 +214,7 @@ describe('url state', () => { cy.get(ANOMALIES_TAB).should( 'have.attr', 'href', - "/app/security/hosts/siem-kibana/anomalies?query=(language:kuery,query:'agent.type:%20%22auditbeat%22%20')&sourcerer=(default:!('auditbeat-*'))&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2020-01-01T21:33:29.186Z')),timeline:(linkTo:!(global),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2020-01-01T21:33:29.186Z')))" + "/app/security/hosts/siem-kibana/anomalies?sourcerer=(default:!('auditbeat-*'))&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2020-01-01T21:33:29.186Z')),timeline:(linkTo:!(global),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2020-01-01T21:33:29.186Z')))&query=(language:kuery,query:'agent.type:%20%22auditbeat%22%20')" ); cy.get(BREADCRUMBS) .eq(1) diff --git a/x-pack/plugins/security_solution/cypress/integration/value_lists/value_lists.spec.ts b/x-pack/plugins/security_solution/cypress/integration/value_lists/value_lists.spec.ts index 0f545136d1c077..a7cc412a920c0a 100644 --- a/x-pack/plugins/security_solution/cypress/integration/value_lists/value_lists.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/value_lists/value_lists.spec.ts @@ -7,7 +7,7 @@ import { ROLES } from '../../../common/test'; import { deleteRoleAndUser, loginAndWaitForPageWithoutDateRange } from '../../tasks/login'; -import { DETECTIONS_URL } from '../../urls/navigation'; +import { ALERTS_URL } from '../../urls/navigation'; import { waitForAlertsPanelToBeLoaded, waitForAlertsIndexToBeCreated, @@ -35,7 +35,7 @@ import { describe('value lists', () => { describe('management modal', () => { beforeEach(() => { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + loginAndWaitForPageWithoutDateRange(ALERTS_URL); waitForAlertsPanelToBeLoaded(); waitForAlertsIndexToBeCreated(); waitForListsIndexToBeCreated(); @@ -228,7 +228,7 @@ describe('value lists', () => { describe('user with restricted access role', () => { beforeEach(() => { - loginAndWaitForPageWithoutDateRange(DETECTIONS_URL, ROLES.t1_analyst); + loginAndWaitForPageWithoutDateRange(ALERTS_URL, ROLES.t1_analyst); goToManageAlertsDetectionRules(); }); diff --git a/x-pack/plugins/security_solution/cypress/screens/exceptions.ts b/x-pack/plugins/security_solution/cypress/screens/exceptions.ts index 2479b76cf1de47..bd6d3b78872063 100644 --- a/x-pack/plugins/security_solution/cypress/screens/exceptions.ts +++ b/x-pack/plugins/security_solution/cypress/screens/exceptions.ts @@ -42,7 +42,7 @@ export const EXCEPTIONS_TABLE_TAB = '[data-test-subj="allRulesTableTab-exception export const EXCEPTIONS_TABLE = '[data-test-subj="exceptions-table"]'; -export const EXCEPTIONS_TABLE_SEARCH = '[data-test-subj="header-section-supplements"] input'; +export const EXCEPTIONS_TABLE_SEARCH = '[data-test-subj="exceptionsHeaderSearchInput"]'; export const EXCEPTIONS_TABLE_SHOWING_LISTS = '[data-test-subj="showingExceptionLists"]'; @@ -50,7 +50,8 @@ export const EXCEPTIONS_TABLE_DELETE_BTN = '[data-test-subj="exceptionsTableDele export const EXCEPTIONS_TABLE_EXPORT_BTN = '[data-test-subj="exceptionsTableExportButton"]'; -export const EXCEPTIONS_TABLE_SEARCH_CLEAR = '[data-test-subj="header-section-supplements"] button'; +export const EXCEPTIONS_TABLE_SEARCH_CLEAR = + '[data-test-subj="allExceptionListsPanel"] button.euiFormControlLayoutClearButton'; export const EXCEPTIONS_TABLE_LIST_NAME = '[data-test-subj="exceptionsTableName"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/kibana_navigation.ts b/x-pack/plugins/security_solution/cypress/screens/kibana_navigation.ts index 7a63357aabaf08..36b870598eff44 100644 --- a/x-pack/plugins/security_solution/cypress/screens/kibana_navigation.ts +++ b/x-pack/plugins/security_solution/cypress/screens/kibana_navigation.ts @@ -5,8 +5,8 @@ * 2.0. */ -export const DETECTIONS_PAGE = - '[data-test-subj="collapsibleNavGroup-securitySolution"] [title="Detections"]'; +export const ALERTS_PAGE = + '[data-test-subj="collapsibleNavGroup-securitySolution"] [title="Alerts"]'; export const CASES_PAGE = '[data-test-subj="collapsibleNavGroup-securitySolution"] [title="Cases"]'; @@ -14,8 +14,8 @@ export const HOSTS_PAGE = '[data-test-subj="collapsibleNavGroup-securitySolution export const KIBANA_NAVIGATION_TOGGLE = '[data-test-subj="toggleNavButton"]'; -export const ADMINISTRATION_PAGE = - '[data-test-subj="collapsibleNavGroup-securitySolution"] [title="Administration"]'; +export const ENDPOINTS_PAGE = + '[data-test-subj="collapsibleNavGroup-securitySolution"] [title="Endpoints"]'; export const NETWORK_PAGE = '[data-test-subj="collapsibleNavGroup-securitySolution"] [title="Network"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/security_header.ts b/x-pack/plugins/security_solution/cypress/screens/security_header.ts index a3d5b714cdb3f5..3573d78bfcf8aa 100644 --- a/x-pack/plugins/security_solution/cypress/screens/security_header.ts +++ b/x-pack/plugins/security_solution/cypress/screens/security_header.ts @@ -5,7 +5,7 @@ * 2.0. */ -export const DETECTIONS = '[data-test-subj="navigation-detections"]'; +export const DETECTIONS = '[data-test-subj="navigation-alerts"]'; export const BREADCRUMBS = '[data-test-subj="breadcrumbs"] a'; @@ -15,7 +15,11 @@ export const HOSTS = '[data-test-subj="navigation-hosts"]'; export const KQL_INPUT = '[data-test-subj="queryInput"]'; -export const ADMINISTRATION = '[data-test-subj="navigation-administration"]'; +export const ENDPOINTS = '[data-test-subj="navigation-endpoints"]'; + +export const TRUSTED_APPS = '[data-test-subj="navigation-trusted_apps"]'; + +export const EVENT_FILTERS = '[data-test-subj="navigation-event_filters"]'; export const NETWORK = '[data-test-subj="navigation-network"]'; diff --git a/x-pack/plugins/security_solution/cypress/urls/navigation.ts b/x-pack/plugins/security_solution/cypress/urls/navigation.ts index 2beed9e8ec0b76..879f16f0b7e0e8 100644 --- a/x-pack/plugins/security_solution/cypress/urls/navigation.ts +++ b/x-pack/plugins/security_solution/cypress/urls/navigation.ts @@ -5,13 +5,18 @@ * 2.0. */ -export const DETECTIONS_URL = 'app/security/detections'; -export const DETECTIONS_RULE_MANAGEMENT_URL = 'app/security/detections/rules'; -export const detectionsRuleDetailsUrl = (ruleId: string) => - `app/security/detections/rules/id/${ruleId}`; +export const ALERTS_URL = 'app/security/alerts'; +export const DETECTIONS_RULE_MANAGEMENT_URL = 'app/security/rules'; +export const detectionsRuleDetailsUrl = (ruleId: string) => `app/security/rules/id/${ruleId}`; export const CASES_URL = '/app/security/cases'; export const DETECTIONS = '/app/siem#/detections'; +export const SECURITY_DETECTIONS_URL = '/app/security/detections'; +export const SECURITY_DETECTIONS_RULES_URL = '/app/security/detections/rules'; +export const SECURITY_DETECTIONS_RULES_CREATION_URL = '/app/security/detections/rules/create'; + +export const EXCEPTIONS_URL = 'app/security/exceptions'; + export const HOSTS_URL = '/app/security/hosts/allHosts'; export const HOSTS_PAGE_TAB_URLS = { allHosts: '/app/security/hosts/allHosts', @@ -21,9 +26,11 @@ export const HOSTS_PAGE_TAB_URLS = { uncommonProcesses: '/app/security/hosts/uncommonProcesses', }; export const KIBANA_HOME = '/app/home#/'; -export const ADMINISTRATION_URL = '/app/security/administration'; +export const ENDPOINTS_URL = '/app/security/administration/endpoints'; +export const TRUSTED_APPS_URL = '/app/security/administration/trusted_apps'; +export const EVENT_FILTERS_URL = '/app/security/administration/event_filters'; export const NETWORK_URL = '/app/security/network'; export const OVERVIEW_URL = '/app/security/overview'; -export const RULE_CREATION = 'app/security/detections/rules/create'; +export const RULE_CREATION = 'app/security/rules/create'; export const TIMELINES_URL = '/app/security/timelines'; export const TIMELINE_TEMPLATES_URL = '/app/security/timelines/template'; diff --git a/x-pack/plugins/security_solution/kibana.json b/x-pack/plugins/security_solution/kibana.json index f707e650643ec5..990756f3da7015 100644 --- a/x-pack/plugins/security_solution/kibana.json +++ b/x-pack/plugins/security_solution/kibana.json @@ -37,5 +37,13 @@ ], "server": true, "ui": true, - "requiredBundles": ["esUiShared", "fleet", "kibanaUtils", "kibanaReact", "lists", "ml"] + "requiredBundles": [ + "esUiShared", + "fleet", + "kibanaUtils", + "kibanaReact", + "usageCollection", + "lists", + "ml" + ] } diff --git a/x-pack/plugins/security_solution/public/app/deep_links/index.test.ts b/x-pack/plugins/security_solution/public/app/deep_links/index.test.ts new file mode 100644 index 00000000000000..f125218b68c090 --- /dev/null +++ b/x-pack/plugins/security_solution/public/app/deep_links/index.test.ts @@ -0,0 +1,82 @@ +/* + * 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 { getDeepLinks } from '.'; +import { Capabilities } from '../../../../../../src/core/public'; +import { SecurityPageName } from '../types'; + +describe('public search functions', () => { + it('returns a subset of links for basic license, full set for platinum', () => { + const basicLicense = 'basic'; + const platinumLicense = 'platinum'; + const basicLinks = getDeepLinks(basicLicense); + const platinumLinks = getDeepLinks(platinumLicense); + + basicLinks.forEach((basicLink, index) => { + const platinumLink = platinumLinks[index]; + expect(basicLink.id).toEqual(platinumLink.id); + const platinumDeepLinksCount = platinumLink.deepLinks?.length || 0; + const basicDeepLinksCount = basicLink.deepLinks?.length || 0; + expect(platinumDeepLinksCount).toBeGreaterThanOrEqual(basicDeepLinksCount); + }); + }); + + it('returns case links for basic license with only read_cases capabilities', () => { + const basicLicense = 'basic'; + const basicLinks = getDeepLinks(basicLicense, ({ + siem: { read_cases: true, crud_cases: false }, + } as unknown) as Capabilities); + + expect(basicLinks.some((l) => l.id === SecurityPageName.case)).toBeTruthy(); + }); + + it('returns case links with NO deepLinks for basic license with only read_cases capabilities', () => { + const basicLicense = 'basic'; + const basicLinks = getDeepLinks(basicLicense, ({ + siem: { read_cases: true, crud_cases: false }, + } as unknown) as Capabilities); + + expect( + basicLinks.find((l) => l.id === SecurityPageName.case)?.deepLinks?.length === 0 + ).toBeTruthy(); + }); + + it('returns case links with deepLinks for basic license with crud_cases capabilities', () => { + const basicLicense = 'basic'; + const basicLinks = getDeepLinks(basicLicense, ({ + siem: { read_cases: true, crud_cases: true }, + } as unknown) as Capabilities); + + expect( + (basicLinks.find((l) => l.id === SecurityPageName.case)?.deepLinks?.length ?? 0) > 0 + ).toBeTruthy(); + }); + + it('returns NO case links for basic license with NO read_cases capabilities', () => { + const basicLicense = 'basic'; + const basicLinks = getDeepLinks(basicLicense, ({ + siem: { read_cases: false, crud_cases: false }, + } as unknown) as Capabilities); + + expect(basicLinks.some((l) => l.id === SecurityPageName.case)).toBeFalsy(); + }); + + it('returns case links for basic license with undefined capabilities', () => { + const basicLicense = 'basic'; + const basicLinks = getDeepLinks(basicLicense, undefined); + + expect(basicLinks.some((l) => l.id === SecurityPageName.case)).toBeTruthy(); + }); + + it('returns case deepLinks for basic license with undefined capabilities', () => { + const basicLicense = 'basic'; + const basicLinks = getDeepLinks(basicLicense, undefined); + + expect( + (basicLinks.find((l) => l.id === SecurityPageName.case)?.deepLinks?.length ?? 0) > 0 + ).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/app/deep_links/index.ts b/x-pack/plugins/security_solution/public/app/deep_links/index.ts new file mode 100644 index 00000000000000..cbaa789d47489b --- /dev/null +++ b/x-pack/plugins/security_solution/public/app/deep_links/index.ts @@ -0,0 +1,395 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { Subject } from 'rxjs'; + +import { LicenseType } from '../../../../licensing/common/types'; +import { SecurityDeepLinkName, SecurityDeepLinks, SecurityPageName } from '../types'; +import { + AppDeepLink, + ApplicationStart, + AppNavLinkStatus, + AppUpdater, +} from '../../../../../../src/core/public'; +import { + OVERVIEW, + DETECT, + ALERTS, + RULES, + EXCEPTIONS, + HOSTS, + NETWORK, + TIMELINES, + CASE, + ADMINISTRATION, +} from '../translations'; +import { + OVERVIEW_PATH, + ALERTS_PATH, + RULES_PATH, + EXCEPTIONS_PATH, + HOSTS_PATH, + NETWORK_PATH, + TIMELINES_PATH, + CASES_PATH, + ENDPOINTS_PATH, + TRUSTED_APPS_PATH, + EVENT_FILTERS_PATH, +} from '../../../common/constants'; + +export const topDeepLinks: AppDeepLink[] = [ + { + id: SecurityPageName.overview, + title: OVERVIEW, + path: OVERVIEW_PATH, + navLinkStatus: AppNavLinkStatus.visible, + keywords: [ + i18n.translate('xpack.securitySolution.search.overview', { + defaultMessage: 'Overview', + }), + ], + order: 9000, + }, + { + id: SecurityPageName.detections, + title: DETECT, + path: ALERTS_PATH, + navLinkStatus: AppNavLinkStatus.hidden, + keywords: [ + i18n.translate('xpack.securitySolution.search.detect', { + defaultMessage: 'Detect', + }), + ], + }, + { + id: SecurityPageName.hosts, + title: HOSTS, + path: HOSTS_PATH, + navLinkStatus: AppNavLinkStatus.visible, + keywords: [ + i18n.translate('xpack.securitySolution.search.hosts', { + defaultMessage: 'Hosts', + }), + ], + order: 9002, + }, + { + id: SecurityPageName.network, + title: NETWORK, + path: NETWORK_PATH, + navLinkStatus: AppNavLinkStatus.visible, + keywords: [ + i18n.translate('xpack.securitySolution.search.network', { + defaultMessage: 'Network', + }), + ], + order: 9003, + }, + { + id: SecurityPageName.timelines, + title: TIMELINES, + path: TIMELINES_PATH, + navLinkStatus: AppNavLinkStatus.visible, + keywords: [ + i18n.translate('xpack.securitySolution.search.timelines', { + defaultMessage: 'Timelines', + }), + ], + order: 9004, + }, + { + id: SecurityPageName.case, + title: CASE, + path: CASES_PATH, + navLinkStatus: AppNavLinkStatus.visible, + keywords: [ + i18n.translate('xpack.securitySolution.search.cases', { + defaultMessage: 'Cases', + }), + ], + order: 9005, + }, + { + id: SecurityPageName.administration, + title: ADMINISTRATION, + path: ENDPOINTS_PATH, + navLinkStatus: AppNavLinkStatus.hidden, + keywords: [ + i18n.translate('xpack.securitySolution.search.administration', { + defaultMessage: 'Administration', + }), + ], + }, +]; + +const nestedDeepLinks: SecurityDeepLinks = { + [SecurityPageName.overview]: { + base: [], + }, + [SecurityPageName.detections]: { + base: [ + { + id: SecurityPageName.alerts, + title: ALERTS, + path: ALERTS_PATH, + navLinkStatus: AppNavLinkStatus.visible, + keywords: [ + i18n.translate('xpack.securitySolution.search.alerts', { + defaultMessage: 'Alerts', + }), + ], + searchable: true, + order: 9001, + }, + { + id: SecurityPageName.rules, + title: RULES, + path: RULES_PATH, + navLinkStatus: AppNavLinkStatus.hidden, + keywords: [ + i18n.translate('xpack.securitySolution.search.rules', { + defaultMessage: 'Rules', + }), + ], + searchable: true, + }, + { + id: SecurityPageName.exceptions, + title: EXCEPTIONS, + path: EXCEPTIONS_PATH, + navLinkStatus: AppNavLinkStatus.hidden, + keywords: [ + i18n.translate('xpack.securitySolution.search.exceptions', { + defaultMessage: 'Exceptions', + }), + ], + searchable: true, + }, + ], + }, + [SecurityPageName.hosts]: { + base: [ + { + id: 'authentications', + title: i18n.translate('xpack.securitySolution.search.hosts.authentications', { + defaultMessage: 'Authentications', + }), + path: '/authentications', + }, + { + id: 'uncommonProcesses', + title: i18n.translate('xpack.securitySolution.search.hosts.uncommonProcesses', { + defaultMessage: 'Uncommon Processes', + }), + path: '/uncommonProcesses', + }, + { + id: 'events', + title: i18n.translate('xpack.securitySolution.search.hosts.events', { + defaultMessage: 'Events', + }), + path: '/events', + }, + { + id: 'externalAlerts', + title: i18n.translate('xpack.securitySolution.search.hosts.externalAlerts', { + defaultMessage: 'External Alerts', + }), + path: '/alerts', + }, + ], + premium: [ + { + id: 'anomalies', + title: i18n.translate('xpack.securitySolution.search.hosts.anomalies', { + defaultMessage: 'Anomalies', + }), + path: '/anomalies', + }, + ], + }, + [SecurityPageName.network]: { + base: [ + { + id: 'dns', + title: i18n.translate('xpack.securitySolution.search.network.dns', { + defaultMessage: 'DNS', + }), + path: '/dns', + }, + { + id: 'http', + title: i18n.translate('xpack.securitySolution.search.network.http', { + defaultMessage: 'HTTP', + }), + path: '/http', + }, + { + id: 'tls', + title: i18n.translate('xpack.securitySolution.search.network.tls', { + defaultMessage: 'TLS', + }), + path: '/tls', + }, + { + id: 'externalAlertsNetwork', + title: i18n.translate('xpack.securitySolution.search.network.externalAlerts', { + defaultMessage: 'External Alerts', + }), + path: '/external-alerts', + }, + ], + premium: [ + { + id: 'anomalies', + title: i18n.translate('xpack.securitySolution.search.hosts.anomalies', { + defaultMessage: 'Anomalies', + }), + path: '/anomalies', + }, + ], + }, + [SecurityPageName.timelines]: { + base: [ + { + id: 'timelineTemplates', + title: i18n.translate('xpack.securitySolution.search.timeline.templates', { + defaultMessage: 'Templates', + }), + path: '/template', + }, + ], + }, + [SecurityPageName.case]: { + base: [ + { + id: 'create', + title: i18n.translate('xpack.securitySolution.search.cases.create', { + defaultMessage: 'Create New Case', + }), + path: '/create', + }, + ], + premium: [ + { + id: 'configure', + title: i18n.translate('xpack.securitySolution.search.cases.configure', { + defaultMessage: 'Configure Cases', + }), + path: '/configure', + }, + ], + }, + [SecurityPageName.administration]: { + base: [ + { + id: SecurityPageName.endpoints, + navLinkStatus: AppNavLinkStatus.visible, + title: i18n.translate('xpack.securitySolution.search.administration.endpoints', { + defaultMessage: 'Endpoints', + }), + order: 9006, + path: ENDPOINTS_PATH, + }, + { + id: SecurityPageName.trustedApps, + title: i18n.translate('xpack.securitySolution.search.administration.trustedApps', { + defaultMessage: 'Trusted Applications', + }), + path: TRUSTED_APPS_PATH, + }, + { + id: SecurityPageName.eventFilters, + title: i18n.translate('xpack.securitySolution.search.administration.eventFilters', { + defaultMessage: 'Event Filters', + }), + path: EVENT_FILTERS_PATH, + }, + ], + }, +}; + +/** + * A function that generates the plugin deepLinks + * @param licenseType optional string for license level, if not provided basic is assumed. + */ +export function getDeepLinks( + licenseType?: LicenseType, + capabilities?: ApplicationStart['capabilities'] +): AppDeepLink[] { + return topDeepLinks + .filter( + (deepLink) => + deepLink.id !== SecurityPageName.case || + capabilities == null || + (deepLink.id === SecurityPageName.case && capabilities.siem.read_cases === true) + ) + .map((deepLink) => { + const deepLinkId = deepLink.id as SecurityDeepLinkName; + const subPluginDeepLinks = nestedDeepLinks[deepLinkId]; + const baseDeepLinks = Array.isArray(subPluginDeepLinks.base) + ? [...subPluginDeepLinks.base] + : []; + if ( + deepLinkId === SecurityPageName.case && + capabilities != null && + capabilities.siem.crud_cases === false + ) { + return { + ...deepLink, + deepLinks: [], + }; + } + if (isPremiumLicense(licenseType) && subPluginDeepLinks?.premium) { + return { + ...deepLink, + deepLinks: [...baseDeepLinks, ...subPluginDeepLinks.premium], + }; + } + return { + ...deepLink, + deepLinks: baseDeepLinks, + }; + }); +} + +export function isPremiumLicense(licenseType?: LicenseType): boolean { + return ( + licenseType === 'gold' || + licenseType === 'platinum' || + licenseType === 'enterprise' || + licenseType === 'trial' + ); +} + +export function updateGlobalNavigation({ + capabilities, + updater$, +}: { + capabilities: ApplicationStart['capabilities']; + updater$: Subject; +}) { + const deepLinks = getDeepLinks(undefined, capabilities); + const updatedDeepLinks = deepLinks.map((link) => { + switch (link.id) { + case 'case': + return { + ...link, + navLinkStatus: capabilities.siem.read_cases + ? AppNavLinkStatus.visible + : AppNavLinkStatus.hidden, + }; + default: + return link; + } + }); + + updater$.next(() => ({ + deepLinks: updatedDeepLinks, + })); +} diff --git a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx index 98ff11423ce01c..85e41a5cc12ca4 100644 --- a/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/global_header/index.tsx @@ -11,6 +11,7 @@ import { EuiHeaderSectionItem, } from '@elastic/eui'; import React, { useEffect, useMemo } from 'react'; +import { useLocation } from 'react-router-dom'; import { createPortalNode, OutPortal, InPortal } from 'react-reverse-portal'; import { i18n } from '@kbn/i18n'; @@ -18,7 +19,8 @@ import { AppMountParameters } from '../../../../../../../src/core/public'; import { toMountPoint } from '../../../../../../../src/plugins/kibana_react/public'; import { MlPopover } from '../../../common/components/ml_popover/ml_popover'; import { useKibana } from '../../../common/lib/kibana'; -import { ADD_DATA_PATH, APP_DETECTIONS_PATH } from '../../../../common/constants'; +import { ADD_DATA_PATH } from '../../../../common/constants'; +import { isDetectionsPath } from '../../../../public/helpers'; const BUTTON_ADD_DATA = i18n.translate('xpack.securitySolution.globalHeader.buttonAddData', { defaultMessage: 'Add data', @@ -31,27 +33,29 @@ const BUTTON_ADD_DATA = i18n.translate('xpack.securitySolution.globalHeader.butt export const GlobalHeader = React.memo( ({ setHeaderActionMenu }: { setHeaderActionMenu: AppMountParameters['setHeaderActionMenu'] }) => { const portalNode = useMemo(() => createPortalNode(), []); - const { http } = useKibana().services; + const { + http: { + basePath: { prepend }, + }, + } = useKibana().services; + const { pathname } = useLocation(); useEffect(() => { - let unmount = () => {}; - setHeaderActionMenu((element) => { const mount = toMountPoint(); - unmount = mount(element); - return unmount; + return mount(element); }); return () => { portalNode.unmount(); - unmount(); + setHeaderActionMenu(undefined); }; }, [portalNode, setHeaderActionMenu]); return ( - {window.location.pathname.includes(APP_DETECTIONS_PATH) && ( + {isDetectionsPath(pathname) && ( @@ -61,7 +65,7 @@ export const GlobalHeader = React.memo( {BUTTON_ADD_DATA} diff --git a/x-pack/plugins/security_solution/public/app/home/home_navigations.ts b/x-pack/plugins/security_solution/public/app/home/home_navigations.ts new file mode 100644 index 00000000000000..271eea47840dc0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/app/home/home_navigations.ts @@ -0,0 +1,130 @@ +/* + * 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 * as i18n from '../translations'; +import { SecurityPageName, SecurityPageGroupName } from '../types'; +import { SiemNavTab, NavTabGroups } from '../../common/components/navigation/types'; +import { + APP_OVERVIEW_PATH, + APP_RULES_PATH, + APP_ALERTS_PATH, + APP_EXCEPTIONS_PATH, + APP_HOSTS_PATH, + APP_NETWORK_PATH, + APP_TIMELINES_PATH, + APP_CASES_PATH, + APP_MANAGEMENT_PATH, + APP_ENDPOINTS_PATH, + APP_TRUSTED_APPS_PATH, + APP_EVENT_FILTERS_PATH, +} from '../../../common/constants'; + +export const navTabs: SiemNavTab = { + [SecurityPageName.overview]: { + id: SecurityPageName.overview, + name: i18n.OVERVIEW, + href: APP_OVERVIEW_PATH, + disabled: false, + urlKey: 'overview', + }, + [SecurityPageName.alerts]: { + id: SecurityPageName.alerts, + name: i18n.ALERTS, + href: APP_ALERTS_PATH, + disabled: false, + urlKey: SecurityPageName.alerts, + }, + [SecurityPageName.rules]: { + id: SecurityPageName.rules, + name: i18n.RULES, + href: APP_RULES_PATH, + disabled: false, + urlKey: SecurityPageName.rules, + }, + [SecurityPageName.exceptions]: { + id: SecurityPageName.exceptions, + name: i18n.EXCEPTIONS, + href: APP_EXCEPTIONS_PATH, + disabled: false, + urlKey: SecurityPageName.exceptions, + }, + [SecurityPageName.hosts]: { + id: SecurityPageName.hosts, + name: i18n.HOSTS, + href: APP_HOSTS_PATH, + disabled: false, + urlKey: 'host', + }, + [SecurityPageName.network]: { + id: SecurityPageName.network, + name: i18n.NETWORK, + href: APP_NETWORK_PATH, + disabled: false, + urlKey: 'network', + }, + [SecurityPageName.timelines]: { + id: SecurityPageName.timelines, + name: i18n.TIMELINES, + href: APP_TIMELINES_PATH, + disabled: false, + urlKey: 'timeline', + }, + [SecurityPageName.case]: { + id: SecurityPageName.case, + name: i18n.CASE, + href: APP_CASES_PATH, + disabled: false, + urlKey: 'case', + }, + [SecurityPageName.administration]: { + id: SecurityPageName.administration, + name: i18n.ADMINISTRATION, + href: APP_MANAGEMENT_PATH, + disabled: false, + urlKey: SecurityPageName.administration, + }, + [SecurityPageName.endpoints]: { + id: SecurityPageName.endpoints, + name: i18n.ENDPOINTS, + href: APP_ENDPOINTS_PATH, + disabled: false, + urlKey: SecurityPageName.administration, + }, + [SecurityPageName.trustedApps]: { + id: SecurityPageName.trustedApps, + name: i18n.TRUSTED_APPLICATIONS, + href: APP_TRUSTED_APPS_PATH, + disabled: false, + urlKey: SecurityPageName.administration, + }, + [SecurityPageName.eventFilters]: { + id: SecurityPageName.eventFilters, + name: i18n.EVENT_FILTERS, + href: APP_EVENT_FILTERS_PATH, + disabled: false, + urlKey: SecurityPageName.administration, + }, +}; + +export const navTabGroups: NavTabGroups = { + [SecurityPageGroupName.detect]: { + id: SecurityPageGroupName.detect, + name: i18n.DETECT, + }, + [SecurityPageGroupName.explore]: { + id: SecurityPageGroupName.explore, + name: i18n.EXPLORE, + }, + [SecurityPageGroupName.investigate]: { + id: SecurityPageGroupName.investigate, + name: i18n.INVESTIGATE, + }, + [SecurityPageGroupName.manage]: { + id: SecurityPageGroupName.manage, + name: i18n.MANAGE, + }, +}; diff --git a/x-pack/plugins/security_solution/public/app/home/home_navigations.tsx b/x-pack/plugins/security_solution/public/app/home/home_navigations.tsx deleted file mode 100644 index 8358e2f9377b82..00000000000000 --- a/x-pack/plugins/security_solution/public/app/home/home_navigations.tsx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 * as i18n from '../translations'; -import { SecurityPageName } from '../types'; -import { SiemNavTab } from '../../common/components/navigation/types'; -import { - APP_OVERVIEW_PATH, - APP_DETECTIONS_PATH, - APP_HOSTS_PATH, - APP_NETWORK_PATH, - APP_TIMELINES_PATH, - APP_CASES_PATH, - APP_MANAGEMENT_PATH, -} from '../../../common/constants'; - -export const navTabs: SiemNavTab = { - [SecurityPageName.overview]: { - id: SecurityPageName.overview, - name: i18n.OVERVIEW, - href: APP_OVERVIEW_PATH, - disabled: false, - urlKey: 'overview', - }, - [SecurityPageName.detections]: { - id: SecurityPageName.detections, - name: i18n.DETECTION_ENGINE, - href: APP_DETECTIONS_PATH, - disabled: false, - urlKey: 'detections', - }, - [SecurityPageName.hosts]: { - id: SecurityPageName.hosts, - name: i18n.HOSTS, - href: APP_HOSTS_PATH, - disabled: false, - urlKey: 'host', - }, - [SecurityPageName.network]: { - id: SecurityPageName.network, - name: i18n.NETWORK, - href: APP_NETWORK_PATH, - disabled: false, - urlKey: 'network', - }, - - [SecurityPageName.timelines]: { - id: SecurityPageName.timelines, - name: i18n.TIMELINES, - href: APP_TIMELINES_PATH, - disabled: false, - urlKey: 'timeline', - }, - [SecurityPageName.case]: { - id: SecurityPageName.case, - name: i18n.CASE, - href: APP_CASES_PATH, - disabled: false, - urlKey: 'case', - }, - [SecurityPageName.administration]: { - id: SecurityPageName.administration, - name: i18n.ADMINISTRATION, - href: APP_MANAGEMENT_PATH, - disabled: false, - urlKey: SecurityPageName.administration, - }, -}; diff --git a/x-pack/plugins/security_solution/public/app/home/index.tsx b/x-pack/plugins/security_solution/public/app/home/index.tsx index 17a6fab103d6f0..d16c35a832e6b8 100644 --- a/x-pack/plugins/security_solution/public/app/home/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/index.tsx @@ -5,7 +5,8 @@ * 2.0. */ -import React, { useRef } from 'react'; +import React from 'react'; +import { useLocation } from 'react-router-dom'; import { DragDropContextWrapper } from '../../common/components/drag_and_drop/drag_drop_context_wrapper'; import { AppLeaveHandler, AppMountParameters } from '../../../../../../src/core/public'; @@ -14,12 +15,11 @@ import { HelpMenu } from '../../common/components/help_menu'; import { UseUrlState } from '../../common/components/url_state'; import { navTabs } from './home_navigations'; import { useInitSourcerer, useSourcererScope } from '../../common/containers/sourcerer'; -import { useKibana } from '../../common/lib/kibana'; -import { DETECTIONS_SUB_PLUGIN_ID } from '../../../common/constants'; import { SourcererScopeName } from '../../common/store/sourcerer/model'; import { useUpgradeSecurityPackages } from '../../common/hooks/use_upgrade_security_packages'; import { GlobalHeader } from './global_header'; import { SecuritySolutionTemplateWrapper } from './template_wrapper'; +import { isDetectionsPath } from '../../helpers'; interface HomePageProps { children: React.ReactNode; @@ -32,23 +32,14 @@ const HomePageComponent: React.FC = ({ onAppLeave, setHeaderActionMenu, }) => { - const { application } = useKibana().services; - const subPluginId = useRef(''); - - application.currentAppId$.subscribe((appId) => { - subPluginId.current = appId ?? ''; - }); + const { pathname } = useLocation(); useInitSourcerer( - subPluginId.current === DETECTIONS_SUB_PLUGIN_ID - ? SourcererScopeName.detections - : SourcererScopeName.default + isDetectionsPath(pathname) ? SourcererScopeName.detections : SourcererScopeName.default ); const { browserFields, indexPattern } = useSourcererScope( - subPluginId.current === DETECTIONS_SUB_PLUGIN_ID - ? SourcererScopeName.detections - : SourcererScopeName.default + isDetectionsPath(pathname) ? SourcererScopeName.detections : SourcererScopeName.default ); // side effect: this will attempt to upgrade the endpoint package if it is not up to date diff --git a/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx b/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx index 08ebbeaee55d44..a2f1ed8c115d6b 100644 --- a/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx @@ -7,34 +7,28 @@ /* eslint-disable react/display-name */ -import React, { useRef } from 'react'; +import React from 'react'; +import { useLocation } from 'react-router-dom'; import { KibanaPageTemplateProps } from '../../../../../../../../src/plugins/kibana_react/public'; import { AppLeaveHandler } from '../../../../../../../../src/core/public'; -import { useKibana } from '../../../../common/lib/kibana'; import { useShowTimeline } from '../../../../common/utils/timeline/use_show_timeline'; import { useSourcererScope } from '../../../../common/containers/sourcerer'; -import { DETECTIONS_SUB_PLUGIN_ID } from '../../../../../common/constants'; import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; import { TimelineId } from '../../../../../common/types/timeline'; import { AutoSaveWarningMsg } from '../../../../timelines/components/timeline/auto_save_warning'; import { Flyout } from '../../../../timelines/components/flyout'; +import { isDetectionsPath } from '../../../../../public/helpers'; export const BOTTOM_BAR_CLASSNAME = 'timeline-bottom-bar'; export const SecuritySolutionBottomBar = React.memo( ({ onAppLeave }: { onAppLeave: (handler: AppLeaveHandler) => void }) => { - const subPluginId = useRef(''); - const { application } = useKibana().services; - application.currentAppId$.subscribe((appId) => { - subPluginId.current = appId ?? ''; - }); + const { pathname } = useLocation(); const [showTimeline] = useShowTimeline(); const { indicesExist } = useSourcererScope( - subPluginId.current === DETECTIONS_SUB_PLUGIN_ID - ? SourcererScopeName.detections - : SourcererScopeName.default + isDetectionsPath(pathname) ? SourcererScopeName.detections : SourcererScopeName.default ); return indicesExist && showTimeline ? ( diff --git a/x-pack/plugins/security_solution/public/app/index.tsx b/x-pack/plugins/security_solution/public/app/index.tsx index 194f119e35478e..81437ec9ec6f68 100644 --- a/x-pack/plugins/security_solution/public/app/index.tsx +++ b/x-pack/plugins/security_solution/public/app/index.tsx @@ -7,7 +7,10 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; +import { Redirect, Route, Switch } from 'react-router-dom'; +import { OVERVIEW_PATH } from '../../common/constants'; +import { NotFoundPage } from '../app/404'; import { SecurityApp } from './app'; import { RenderAppProps } from './types'; @@ -18,8 +21,11 @@ export const renderApp = ({ setHeaderActionMenu, services, store, - SubPluginRoutes, + usageCollection, + subPlugins, }: RenderAppProps): (() => void) => { + const ApplicationUsageTrackingProvider = + usageCollection?.components.ApplicationUsageTrackingProvider ?? React.Fragment; render( - + + + {[ + ...subPlugins.overview.routes, + ...subPlugins.alerts.routes, + ...subPlugins.rules.routes, + ...subPlugins.exceptions.routes, + ...subPlugins.hosts.routes, + ...subPlugins.network.routes, + ...subPlugins.timelines.routes, + ...subPlugins.cases.routes, + ...subPlugins.management.routes, + ].map((route, index) => ( + + ))} + + + + + + + + + , element ); diff --git a/x-pack/plugins/security_solution/public/app/search/index.test.ts b/x-pack/plugins/security_solution/public/app/search/index.test.ts deleted file mode 100644 index 328395f9b85c9e..00000000000000 --- a/x-pack/plugins/security_solution/public/app/search/index.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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 { getDeepLinksAndKeywords } from '.'; -import { SecurityPageName } from '../../../common/constants'; - -describe('public search functions', () => { - it('returns a subset of links for basic license, full set for platinum', () => { - const basicLicense = 'basic'; - const platinumLicense = 'platinum'; - for (const pageName of Object.values(SecurityPageName)) { - expect.assertions(Object.values(SecurityPageName).length * 2); - const basicLinkCount = getDeepLinksAndKeywords(pageName, basicLicense).deepLinks?.length || 0; - const platinumLinks = getDeepLinksAndKeywords(pageName, platinumLicense); - expect(platinumLinks.deepLinks?.length).toBeGreaterThanOrEqual(basicLinkCount); - expect(platinumLinks.keywords?.length).not.toBe(null); - } - }); -}); diff --git a/x-pack/plugins/security_solution/public/app/search/index.ts b/x-pack/plugins/security_solution/public/app/search/index.ts deleted file mode 100644 index 93d931fc4d1370..00000000000000 --- a/x-pack/plugins/security_solution/public/app/search/index.ts +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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 { i18n } from '@kbn/i18n'; -import { Subject } from 'rxjs'; - -import { AppUpdater } from 'src/core/public'; -import { LicenseType } from '../../../../licensing/common/types'; -import { SecuritySubPluginNames, SecurityDeepLinks } from '../types'; -import { App } from '../../../../../../src/core/public'; - -const securityDeepLinks: SecurityDeepLinks = { - detections: { - base: [ - { - id: 'siemDetectionRules', - title: i18n.translate('xpack.securitySolution.search.detections.manage', { - defaultMessage: 'Manage Rules', - }), - keywords: ['rules'], - path: '/rules', - }, - ], - }, - hosts: { - base: [ - { - id: 'authentications', - title: i18n.translate('xpack.securitySolution.search.hosts.authentications', { - defaultMessage: 'Authentications', - }), - path: '/authentications', - }, - { - id: 'uncommonProcesses', - title: i18n.translate('xpack.securitySolution.search.hosts.uncommonProcesses', { - defaultMessage: 'Uncommon Processes', - }), - path: '/uncommonProcesses', - }, - { - id: 'events', - title: i18n.translate('xpack.securitySolution.search.hosts.events', { - defaultMessage: 'Events', - }), - path: '/events', - }, - { - id: 'externalAlerts', - title: i18n.translate('xpack.securitySolution.search.hosts.externalAlerts', { - defaultMessage: 'External Alerts', - }), - path: '/alerts', - }, - ], - premium: [ - { - id: 'anomalies', - title: i18n.translate('xpack.securitySolution.search.hosts.anomalies', { - defaultMessage: 'Anomalies', - }), - path: '/anomalies', - }, - ], - }, - network: { - base: [ - { - id: 'dns', - title: i18n.translate('xpack.securitySolution.search.network.dns', { - defaultMessage: 'DNS', - }), - path: '/dns', - }, - { - id: 'http', - title: i18n.translate('xpack.securitySolution.search.network.http', { - defaultMessage: 'HTTP', - }), - path: '/http', - }, - { - id: 'tls', - title: i18n.translate('xpack.securitySolution.search.network.tls', { - defaultMessage: 'TLS', - }), - path: '/tls', - }, - { - id: 'externalAlertsNetwork', - title: i18n.translate('xpack.securitySolution.search.network.externalAlerts', { - defaultMessage: 'External Alerts', - }), - path: '/external-alerts', - }, - ], - premium: [ - { - id: 'anomalies', - title: i18n.translate('xpack.securitySolution.search.hosts.anomalies', { - defaultMessage: 'Anomalies', - }), - path: '/anomalies', - }, - ], - }, - timelines: { - base: [ - { - id: 'timelineTemplates', - title: i18n.translate('xpack.securitySolution.search.timeline.templates', { - defaultMessage: 'Templates', - }), - path: '/template', - }, - ], - }, - overview: { - base: [], - }, - case: { - base: [ - { - id: 'create', - title: i18n.translate('xpack.securitySolution.search.cases.create', { - defaultMessage: 'Create New Case', - }), - path: '/create', - }, - ], - premium: [ - { - id: 'configure', - title: i18n.translate('xpack.securitySolution.search.cases.configure', { - defaultMessage: 'Configure Cases', - }), - path: '/configure', - }, - ], - }, - administration: { - base: [ - { - id: 'trustApplications', - title: i18n.translate('xpack.securitySolution.search.administration.trustedApps', { - defaultMessage: 'Trusted Applications', - }), - path: '/trusted_apps', - }, - ], - }, -}; - -const subpluginKeywords: { [key in SecuritySubPluginNames]: string[] } = { - detections: [ - i18n.translate('xpack.securitySolution.search.detections', { - defaultMessage: 'Detections', - }), - ], - hosts: [ - i18n.translate('xpack.securitySolution.search.hosts', { - defaultMessage: 'Hosts', - }), - ], - network: [ - i18n.translate('xpack.securitySolution.search.network', { - defaultMessage: 'Network', - }), - ], - timelines: [ - i18n.translate('xpack.securitySolution.search.timelines', { - defaultMessage: 'Timelines', - }), - ], - overview: [ - i18n.translate('xpack.securitySolution.search.overview', { - defaultMessage: 'Overview', - }), - ], - case: [ - i18n.translate('xpack.securitySolution.search.cases', { - defaultMessage: 'Cases', - }), - ], - administration: [ - i18n.translate('xpack.securitySolution.search.administration', { - defaultMessage: 'Endpoint Administration', - }), - ], -}; - -/** - * A function that generates a subPlugin's meta tag - * @param subPluginName SubPluginName of the app to retrieve meta information for. - * @param licenseType optional string for license level, if not provided basic is assumed. - */ -export function getDeepLinksAndKeywords( - subPluginName: SecuritySubPluginNames, - licenseType?: LicenseType -): Pick { - const baseRoutes = [...securityDeepLinks[subPluginName].base]; - if ( - licenseType === 'gold' || - licenseType === 'platinum' || - licenseType === 'enterprise' || - licenseType === 'trial' - ) { - const premiumRoutes = - securityDeepLinks[subPluginName] && securityDeepLinks[subPluginName].premium; - if (premiumRoutes !== undefined) { - return { - keywords: subpluginKeywords[subPluginName], - deepLinks: [...baseRoutes, ...premiumRoutes], - }; - } - } - return { - keywords: subpluginKeywords[subPluginName], - deepLinks: baseRoutes, - }; -} -/** - * A function that updates a subplugin's meta property as appropriate when license level changes. - * @param subPluginName SubPluginName of the app to register deepLinks for - * @param appUpdater an instance of appUpdater$ observable to update search links when needed. - * @param licenseType A string representing the current license level. - */ -export function registerDeepLinks( - subPluginName: SecuritySubPluginNames, - appUpdater?: Subject, - licenseType?: LicenseType -) { - if (appUpdater !== undefined) { - appUpdater.next(() => ({ ...getDeepLinksAndKeywords(subPluginName, licenseType) })); - } -} diff --git a/x-pack/plugins/security_solution/public/app/translations.ts b/x-pack/plugins/security_solution/public/app/translations.ts index 80ddc19add3fdf..edbab928a5c694 100644 --- a/x-pack/plugins/security_solution/public/app/translations.ts +++ b/x-pack/plugins/security_solution/public/app/translations.ts @@ -19,12 +19,13 @@ export const NETWORK = i18n.translate('xpack.securitySolution.navigation.network defaultMessage: 'Network', }); -export const DETECTION_ENGINE = i18n.translate( - 'xpack.securitySolution.navigation.detectionEngine', - { - defaultMessage: 'Detections', - } -); +export const RULES = i18n.translate('xpack.securitySolution.navigation.rules', { + defaultMessage: 'Rules', +}); + +export const EXCEPTIONS = i18n.translate('xpack.securitySolution.navigation.exceptions', { + defaultMessage: 'Exceptions', +}); export const ALERTS = i18n.translate('xpack.securitySolution.navigation.alerts', { defaultMessage: 'Alerts', @@ -41,3 +42,31 @@ export const CASE = i18n.translate('xpack.securitySolution.navigation.case', { export const ADMINISTRATION = i18n.translate('xpack.securitySolution.navigation.administration', { defaultMessage: 'Administration', }); +export const ENDPOINTS = i18n.translate('xpack.securitySolution.search.administration.endpoints', { + defaultMessage: 'Endpoints', +}); +export const TRUSTED_APPLICATIONS = i18n.translate( + 'xpack.securitySolution.search.administration.trustedApps', + { + defaultMessage: 'Trusted Applications', + } +); +export const EVENT_FILTERS = i18n.translate( + 'xpack.securitySolution.search.administration.eventFilters', + { + defaultMessage: 'Event Filters', + } +); + +export const DETECT = i18n.translate('xpack.securitySolution.navigation.detect', { + defaultMessage: 'Detect', +}); +export const EXPLORE = i18n.translate('xpack.securitySolution.navigation.explore', { + defaultMessage: 'Explore', +}); +export const INVESTIGATE = i18n.translate('xpack.securitySolution.navigation.investigate', { + defaultMessage: 'Investigate', +}); +export const MANAGE = i18n.translate('xpack.securitySolution.navigation.manage', { + defaultMessage: 'Manage', +}); diff --git a/x-pack/plugins/security_solution/public/app/types.ts b/x-pack/plugins/security_solution/public/app/types.ts index 77d5b99e1c3a3b..62a61828830bed 100644 --- a/x-pack/plugins/security_solution/public/app/types.ts +++ b/x-pack/plugins/security_solution/public/app/types.ts @@ -16,9 +16,10 @@ import { StateFromReducersMapObject, CombinedState, } from 'redux'; - +import { RouteProps } from 'react-router-dom'; import { AppMountParameters, AppDeepLink } from '../../../../../src/core/public'; -import { StartServices } from '../types'; +import { UsageCollectionSetup } from '../../../../../src/plugins/usage_collection/public'; +import { StartedSubPlugins, StartServices } from '../types'; /** * The React properties used to render `SecurityApp` as well as the `element` to render it into. @@ -26,7 +27,8 @@ import { StartServices } from '../types'; export interface RenderAppProps extends AppMountParameters { services: StartServices; store: Store; - SubPluginRoutes: React.FC; + subPlugins: StartedSubPlugins; + usageCollection?: UsageCollectionSetup; } import { State, SubPluginsInitReducer } from '../common/store'; @@ -34,7 +36,7 @@ import { Immutable } from '../../common/endpoint/types'; import { AppAction } from '../common/store/actions'; import { TimelineState } from '../timelines/store/timeline/types'; import { SecurityPageName } from '../../common/constants'; -export { SecurityPageName } from '../../common/constants'; +export { SecurityPageName, SecurityPageGroupName } from '../../common/constants'; export interface SecuritySubPluginStore { initialState: Record; @@ -42,8 +44,10 @@ export interface SecuritySubPluginStore middleware?: Array>>>; } +export type SecuritySubPluginRoutes = RouteProps[]; + export interface SecuritySubPlugin { - SubPluginRoutes: React.FC; + routes: SecuritySubPluginRoutes; storageTimelines?: Pick; } @@ -55,14 +59,21 @@ export type SecuritySubPluginKeyStore = | 'alertList' | 'management'; -export type SecuritySubPluginNames = keyof typeof SecurityPageName; +export type SecurityDeepLinkName = + | SecurityPageName.overview + | SecurityPageName.detections + | SecurityPageName.hosts + | SecurityPageName.network + | SecurityPageName.timelines + | SecurityPageName.case + | SecurityPageName.administration; interface SecurityDeepLink { base: AppDeepLink[]; premium?: AppDeepLink[]; } -export type SecurityDeepLinks = { [key in SecuritySubPluginNames]: SecurityDeepLink }; +export type SecurityDeepLinks = { [key in SecurityDeepLinkName]: SecurityDeepLink }; /** * Returned by the various 'SecuritySubPlugin' classes from the `start` method. diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index aa84f639c4577a..3c788e05530794 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -15,7 +15,7 @@ import { } from '../../../common/components/link_to'; import { SecurityPageName } from '../../../app/types'; import { useKibana } from '../../../common/lib/kibana'; -import { APP_ID, CASES_APP_ID } from '../../../../common/constants'; +import { APP_ID } from '../../../../common/constants'; export interface AllCasesNavProps { detailName: string; @@ -36,7 +36,8 @@ export const AllCases = React.memo(({ userCanCrud }) => { const goToCreateCase = useCallback( async (ev) => { ev.preventDefault(); - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCreateCaseUrl(urlSearch), }); }, @@ -46,7 +47,8 @@ export const AllCases = React.memo(({ userCanCrud }) => { const goToCaseConfigure = useCallback( async (ev) => { ev.preventDefault(); - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getConfigureCasesUrl(urlSearch), }); }, @@ -59,7 +61,8 @@ export const AllCases = React.memo(({ userCanCrud }) => { return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); }, onClick: async ({ detailName, subCaseId, search }: AllCasesNavProps) => { - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), }); }, diff --git a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx index dec2d409b020d7..5474fcb47d87e1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/case_view/index.tsx @@ -23,11 +23,7 @@ import { Case, CaseViewRefreshPropInterface } from '../../../../../cases/common' import { TimelineId } from '../../../../common/types/timeline'; import { SecurityPageName } from '../../../app/types'; import { KibanaServices, useKibana } from '../../../common/lib/kibana'; -import { - APP_ID, - CASES_APP_ID, - DETECTION_ENGINE_QUERY_SIGNALS_URL, -} from '../../../../common/constants'; +import { APP_ID, DETECTION_ENGINE_QUERY_SIGNALS_URL } from '../../../../common/constants'; import { timelineActions } from '../../../timelines/store/timeline'; import { useSourcererScope } from '../../../common/containers/sourcerer'; import { SourcererScopeName } from '../../../common/store/sourcerer/model'; @@ -132,7 +128,7 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = const dispatch = useDispatch(); const { formatUrl, search } = useFormatUrl(SecurityPageName.case); const { formatUrl: detectionsFormatUrl, search: detectionsUrlSearch } = useFormatUrl( - SecurityPageName.detections + SecurityPageName.rules ); const allCasesLink = getCaseUrl(search); @@ -190,7 +186,8 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = if (e) { e.preventDefault(); } - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: allCasesLink, }); }, @@ -201,7 +198,8 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = if (e) { e.preventDefault(); } - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id: caseId }), }); }, @@ -213,7 +211,8 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = if (e) { e.preventDefault(); } - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getConfigureCasesUrl(search), }); }, @@ -227,7 +226,8 @@ export const CaseView = React.memo(({ caseId, subCaseId, userCanCrud }: Props) = if (e) { e.preventDefault(); } - return navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getRuleDetailsUrl(ruleId ?? ''), }); }, diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx index 0b6e98e1badcca..42579c6fbc0ac0 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.test.tsx @@ -16,7 +16,7 @@ import { Create } from '.'; import { useKibana } from '../../../common/lib/kibana'; import { Case } from '../../../../../cases/public/containers/types'; import { basicCase } from '../../../../../cases/public/containers/mock'; -import { APP_ID, CASES_APP_ID } from '../../../../common/constants'; +import { APP_ID, SecurityPageName } from '../../../../common/constants'; import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; jest.mock('../use_insert_timeline'); @@ -71,8 +71,9 @@ describe('Create case', () => { ); await waitFor(() => - expect(mockNavigateToApp).toHaveBeenCalledWith(CASES_APP_ID, { + expect(mockNavigateToApp).toHaveBeenCalledWith(APP_ID, { path: `?${mockRes}`, + deepLinkId: SecurityPageName.case, }) ); }); @@ -95,8 +96,9 @@ describe('Create case', () => { ); await waitFor(() => - expect(mockNavigateToApp).toHaveBeenNthCalledWith(1, CASES_APP_ID, { + expect(mockNavigateToApp).toHaveBeenNthCalledWith(1, APP_ID, { path: `/basic-case-id?${mockRes}`, + deepLinkId: SecurityPageName.case, }) ); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index dfd53ae5cc0b07..5e2b7e27fb1e52 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -12,9 +12,10 @@ import { getCaseDetailsUrl, getCaseUrl } from '../../../common/components/link_t import { useKibana } from '../../../common/lib/kibana'; import * as timelineMarkdownPlugin from '../../../common/components/markdown_editor/plugins/timeline'; import { useInsertTimeline } from '../use_insert_timeline'; -import { APP_ID, CASES_APP_ID } from '../../../../common/constants'; +import { APP_ID } from '../../../../common/constants'; import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; import { navTabs } from '../../../app/home/home_navigations'; +import { SecurityPageName } from '../../../app/types'; export const Create = React.memo(() => { const { @@ -24,14 +25,16 @@ export const Create = React.memo(() => { const search = useGetUrlSearch(navTabs.case); const onSuccess = useCallback( async ({ id }) => - navigateToApp(CASES_APP_ID, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id, search }), }), [navigateToApp, search] ); const handleSetIsCancel = useCallback( async () => - navigateToApp(CASES_APP_ID, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseUrl(search), }), [navigateToApp, search] diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx index 02047c774ca6f5..efcc95c1a7782e 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.test.tsx @@ -15,6 +15,7 @@ import { TestProviders } from '../../../common/mock'; import { AddToCaseAction } from './add_to_case_action'; import { basicCase } from '../../../../../cases/public/containers/mock'; import { Case, SECURITY_SOLUTION_OWNER } from '../../../../../cases/common'; +import { APP_ID, SecurityPageName } from '../../../../common/constants'; jest.mock('../../../common/lib/kibana'); jest.mock('../../../common/components/link_to', () => { @@ -177,8 +178,9 @@ describe('AddToCaseAction', () => { .first() .simulate('click'); - expect(mockNavigateToApp).toHaveBeenCalledWith('securitySolution:case', { + expect(mockNavigateToApp).toHaveBeenCalledWith(APP_ID, { path: '/basic-case-id', + deepLinkId: SecurityPageName.case, }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx index 7025bff1ce49a6..f0f56d2497e887 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/add_to_case_action.tsx @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import { Case, CaseStatuses, StatusAll } from '../../../../../cases/common'; -import { APP_ID, CASES_APP_ID } from '../../../../common/constants'; +import { APP_ID } from '../../../../common/constants'; import { Ecs } from '../../../../common/ecs'; import { SecurityPageName } from '../../../app/types'; import { @@ -80,7 +80,8 @@ const AddToCaseActionComponent: React.FC = ({ const onViewCaseClick = useCallback( (id) => { - navigateToApp(CASES_APP_ID, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id }), }); }, @@ -134,7 +135,8 @@ const AddToCaseActionComponent: React.FC = ({ const goToCreateCase = useCallback( async (ev) => { ev.preventDefault(); - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCreateCaseUrl(urlSearch), }); }, diff --git a/x-pack/plugins/security_solution/public/cases/index.ts b/x-pack/plugins/security_solution/public/cases/index.ts index a520932b486607..631276a6bf6b4d 100644 --- a/x-pack/plugins/security_solution/public/cases/index.ts +++ b/x-pack/plugins/security_solution/public/cases/index.ts @@ -6,14 +6,14 @@ */ import { SecuritySubPlugin } from '../app/types'; -import { CasesRoutes } from './routes'; +import { routes } from './routes'; export class Cases { public setup() {} public start(): SecuritySubPlugin { return { - SubPluginRoutes: CasesRoutes, + routes, }; } } diff --git a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx index f6bb27b7b7104f..e8680b148f9400 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx @@ -16,7 +16,7 @@ import { useGetUserCasesPermissions, useKibana } from '../../common/lib/kibana'; import { getCaseUrl } from '../../common/components/link_to'; import { navTabs } from '../../app/home/home_navigations'; import { CaseView } from '../components/case_view'; -import { CASES_APP_ID } from '../../../common/constants'; +import { APP_ID } from '../../../common/constants'; export const CaseDetailsPage = React.memo(() => { const { @@ -31,9 +31,12 @@ export const CaseDetailsPage = React.memo(() => { useEffect(() => { if (userPermissions != null && !userPermissions.read) { - navigateToApp(CASES_APP_ID, { path: getCaseUrl(search) }); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, + path: getCaseUrl(search), + }); } - }, [navigateToApp, userPermissions, search]); + }, [userPermissions, navigateToApp, search]); return caseId != null ? ( <> diff --git a/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx b/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx index d3f235a5da7dc1..13a549b6babc9d 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/configure_cases.tsx @@ -18,7 +18,8 @@ import { navTabs } from '../../app/home/home_navigations'; import { CaseHeaderPage } from '../components/case_header_page'; import { WhitePageWrapper, SectionWrapper } from '../components/wrappers'; import * as i18n from './translations'; -import { APP_ID, CASES_APP_ID } from '../../../common/constants'; +import { APP_ID } from '../../../common/constants'; +import { SiemNavTabKey } from '../../common/components/navigation/types'; const ConfigureCasesPageComponent: React.FC = () => { const { @@ -32,14 +33,15 @@ const ConfigureCasesPageComponent: React.FC = () => { () => ({ href: getCaseUrl(search), text: i18n.BACK_TO_ALL, - pageId: SecurityPageName.case, + pageId: SecurityPageName.case as SiemNavTabKey, }), [search] ); useEffect(() => { if (userPermissions != null && !userPermissions.read) { - navigateToApp(CASES_APP_ID, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseUrl(search), }); } diff --git a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx index 6c88c4afb63955..e46e5c2074f05f 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/create_case.tsx @@ -17,7 +17,8 @@ import { navTabs } from '../../app/home/home_navigations'; import { CaseHeaderPage } from '../components/case_header_page'; import { Create } from '../components/create'; import * as i18n from './translations'; -import { CASES_APP_ID } from '../../../common/constants'; +import { APP_ID } from '../../../common/constants'; +import { SiemNavTabKey } from '../../common/components/navigation/types'; export const CreateCasePage = React.memo(() => { const userPermissions = useGetUserCasesPermissions(); @@ -30,14 +31,15 @@ export const CreateCasePage = React.memo(() => { () => ({ href: getCaseUrl(search), text: i18n.BACK_TO_ALL, - pageId: SecurityPageName.case, + pageId: SecurityPageName.case as SiemNavTabKey, }), [search] ); useEffect(() => { if (userPermissions != null && !userPermissions.crud) { - navigateToApp(CASES_APP_ID, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseUrl(search), }); } diff --git a/x-pack/plugins/security_solution/public/cases/pages/index.tsx b/x-pack/plugins/security_solution/public/cases/pages/index.tsx index fca19cf5c70a7e..0faff93bb708cc 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/index.tsx @@ -14,14 +14,14 @@ import { CasesPage } from './case'; import { CreateCasePage } from './create_case'; import { ConfigureCasesPage } from './configure_cases'; import { useGetUserCasesPermissions, useKibana } from '../../common/lib/kibana'; +import { CASES_PATH } from '../../../common/constants'; -const casesPagePath = ''; -const caseDetailsPagePath = `${casesPagePath}/:detailName`; +const caseDetailsPagePath = `${CASES_PATH}/:detailName`; const subCaseDetailsPagePath = `${caseDetailsPagePath}/sub-cases/:subCaseId`; const caseDetailsPagePathWithCommentId = `${caseDetailsPagePath}/:commentId`; const subCaseDetailsPagePathWithCommentId = `${subCaseDetailsPagePath}/:commentId`; -const createCasePagePath = `${casesPagePath}/create`; -const configureCasesPagePath = `${casesPagePath}/configure`; +const createCasePagePath = `${CASES_PATH}/create`; +const configureCasesPagePath = `${CASES_PATH}/configure`; const CaseContainerComponent: React.FC = () => { const userPermissions = useGetUserCasesPermissions(); @@ -63,7 +63,7 @@ const CaseContainerComponent: React.FC = () => { - + diff --git a/x-pack/plugins/security_solution/public/cases/pages/utils.ts b/x-pack/plugins/security_solution/public/cases/pages/utils.ts index 1c848190cbef58..968712009e1103 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/utils.ts +++ b/x-pack/plugins/security_solution/public/cases/pages/utils.ts @@ -13,7 +13,8 @@ import { getCaseDetailsUrl, getCreateCaseUrl } from '../../common/components/lin import { RouteSpyState } from '../../common/utils/route/types'; import * as i18n from './translations'; import { GetUrlForApp } from '../../common/components/navigation/types'; -import { CASES_APP_ID } from '../../../common/constants'; +import { APP_ID } from '../../../common/constants'; +import { SecurityPageName } from '../../app/types'; export const getBreadcrumbs = ( params: RouteSpyState, @@ -25,7 +26,8 @@ export const getBreadcrumbs = ( let breadcrumb = [ { text: i18n.PAGE_TITLE, - href: getUrlForApp(CASES_APP_ID, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: queryParameters, }), }, @@ -35,7 +37,8 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: i18n.CREATE_BC_TITLE, - href: getUrlForApp(CASES_APP_ID, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCreateCaseUrl(queryParameters), }), }, @@ -45,7 +48,8 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: params.state?.caseTitle ?? '', - href: getUrlForApp(CASES_APP_ID, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id: params.detailName, search: queryParameters }), }), }, diff --git a/x-pack/plugins/security_solution/public/cases/routes.tsx b/x-pack/plugins/security_solution/public/cases/routes.tsx index c937631e9474ff..8ea30e60379ca0 100644 --- a/x-pack/plugins/security_solution/public/cases/routes.tsx +++ b/x-pack/plugins/security_solution/public/cases/routes.tsx @@ -6,16 +6,21 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; +import { CASES_PATH } from '../../common/constants'; import { Case } from './pages'; -import { NotFoundPage } from '../app/404'; -export const CasesRoutes: React.FC = () => ( - - - - - } /> - +export const CasesRoutes = () => ( + + + ); + +export const routes: SecuritySubPluginRoutes = [ + { + path: CASES_PATH, + render: CasesRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx index da8ef269352c7d..201738d3293b2b 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx @@ -8,10 +8,13 @@ import React, { memo, MouseEventHandler } from 'react'; import { EuiLink, EuiLinkProps, EuiButton, EuiButtonProps } from '@elastic/eui'; import { useNavigateToAppEventHandler } from '../../hooks/endpoint/use_navigate_to_app_event_handler'; +import { APP_ID } from '../../../../common/constants'; export type LinkToAppProps = (EuiLinkProps | EuiButtonProps) & { /** the app id - normally the value of the `id` in that plugin's `kibana.json` */ - appId: string; + appId?: string; + /** optional app deep link id */ + deepLinkId?: string; /** Any app specific path (route) */ appPath?: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -26,8 +29,17 @@ export type LinkToAppProps = (EuiLinkProps | EuiButtonProps) & { * a given app without causing a full browser refresh */ export const LinkToApp = memo( - ({ appId, appPath: path, appState: state, onClick, asButton, children, ...otherProps }) => { - const handleOnClick = useNavigateToAppEventHandler(appId, { path, state, onClick }); + ({ + appId = APP_ID, + deepLinkId, + appPath: path, + appState: state, + onClick, + asButton, + children, + ...otherProps + }) => { + const handleOnClick = useNavigateToAppEventHandler(appId, { deepLinkId, path, state, onClick }); return ( <> diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/route_capture.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/route_capture.tsx index 7a7c812f485288..a5e0c90402df42 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/route_capture.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/route_capture.tsx @@ -9,7 +9,8 @@ import React, { memo, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import { AppLocation } from '../../../../common/endpoint/types'; -import { AppAction } from '../../store/actions'; +import { timelineActions } from '../../../timelines/store/timeline'; +import { TimelineId } from '../../../../../timelines/common'; /** * This component should be used above all routes, but below the Provider. @@ -17,7 +18,11 @@ import { AppAction } from '../../store/actions'; */ export const RouteCapture = memo(({ children }) => { const location: AppLocation = useLocation(); - const dispatch: (action: AppAction) => unknown = useDispatch(); + const dispatch = useDispatch(); + + useEffect(() => { + dispatch(timelineActions.showTimeline({ id: TimelineId.active, show: false })); + }, [dispatch, location.pathname]); useEffect(() => { dispatch({ type: 'userChangedUrl', payload: location }); diff --git a/x-pack/plugins/security_solution/public/common/components/header_page/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/header_page/index.test.tsx index 8a1748de582c43..2c42353daee75f 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_page/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_page/index.test.tsx @@ -15,17 +15,7 @@ import { HeaderPage } from './index'; import { useMountAppended } from '../../utils/use_mount_appended'; import { SecurityPageName } from '../../../app/types'; -jest.mock('react-router-dom', () => { - const original = jest.requireActual('react-router-dom'); - - return { - ...original, - useHistory: () => ({ - useHistory: jest.fn(), - }), - }; -}); - +jest.mock('../../lib/kibana'); jest.mock('../link_to'); describe('HeaderPage', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx b/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx index 75453f2d759fbc..dc8e19249b6be0 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_page/index.tsx @@ -13,7 +13,6 @@ import { EuiSpacer, } from '@elastic/eui'; import React, { useCallback } from 'react'; -import { useHistory } from 'react-router-dom'; import styled, { css } from 'styled-components'; import { LinkIcon, LinkIconProps } from '../link_icon'; @@ -24,6 +23,8 @@ import { useFormatUrl } from '../link_to'; import { SecurityPageName } from '../../../app/types'; import { Sourcerer } from '../sourcerer'; import { SourcererScopeName } from '../../store/sourcerer/model'; +import { useKibana } from '../../lib/kibana'; +import { SiemNavTabKey } from '../navigation/types'; interface HeaderProps { border?: boolean; @@ -64,10 +65,10 @@ const HeaderSection = styled(EuiPageHeaderSection)` HeaderSection.displayName = 'HeaderSection'; interface BackOptions { - href: LinkIconProps['href']; text: LinkIconProps['children']; + href?: LinkIconProps['href']; dataTestSubj?: string; - pageId: SecurityPageName; + pageId: SiemNavTabKey; } export interface HeaderPageProps extends HeaderProps { @@ -99,16 +100,18 @@ const HeaderPageComponent: React.FC = ({ titleNode, ...rest }) => { - const history = useHistory(); + const { navigateToUrl } = useKibana().services.application; + const { formatUrl } = useFormatUrl(backOptions?.pageId ?? SecurityPageName.overview); + const backUrl = formatUrl(backOptions?.href ?? ''); const goTo = useCallback( (ev) => { ev.preventDefault(); if (backOptions) { - history.push(backOptions.href ?? ''); + navigateToUrl(backUrl); } }, - [backOptions, history] + [backOptions, navigateToUrl, backUrl] ); return ( <> @@ -119,7 +122,7 @@ const HeaderPageComponent: React.FC = ({ {backOptions.text} @@ -128,7 +131,6 @@ const HeaderPageComponent: React.FC = ({ )} {!backOptions && backComponent && <>{backComponent}} - {titleNode || ( ) => string; -export const useFormatUrl = (page: SecurityPageName) => { +export const useFormatUrl = (page: SiemNavTabKey) => { const { getUrlForApp } = useKibana().services.application; const search = useGetUrlSearch(navTabs[page]); const formatUrl = useCallback<FormatUrl>( @@ -48,12 +48,10 @@ export const useFormatUrl = (page: SecurityPageName) => { ? '' : `?${pathArr[1]}` }`; - return getUrlForApp(`${APP_ID}:${page}`, { - path: formattedPath, - absolute, - }); + return getUrlForApp(APP_ID, { deepLinkId: page, path: formattedPath, absolute }); }, [getUrlForApp, page, search] ); + return { formatUrl, search }; }; diff --git a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_detection_engine.tsx b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_detection_engine.tsx index 3a9837c605bdd9..b66d923cf0a15a 100644 --- a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_detection_engine.tsx +++ b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_detection_engine.tsx @@ -9,15 +9,12 @@ import { appendSearch } from './helpers'; export const getDetectionEngineUrl = (search?: string) => `${appendSearch(search)}`; -export const getDetectionEngineTabUrl = (tabPath: string, search?: string) => - `/${tabPath}${appendSearch(search)}`; +export const getRulesUrl = (search?: string) => `${appendSearch(search)}`; -export const getRulesUrl = (search?: string) => `/rules${appendSearch(search)}`; - -export const getCreateRuleUrl = (search?: string) => `/rules/create${appendSearch(search)}`; +export const getCreateRuleUrl = (search?: string) => `/create${appendSearch(search)}`; export const getRuleDetailsUrl = (detailName: string, search?: string) => - `/rules/id/${detailName}${appendSearch(search)}`; + `/id/${detailName}${appendSearch(search)}`; export const getEditRuleUrl = (detailName: string, search?: string) => - `/rules/id/${detailName}/edit${appendSearch(search)}`; + `/id/${detailName}/edit${appendSearch(search)}`; diff --git a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_hosts.tsx b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_hosts.tsx index a043aeb195820c..62057260b6383b 100644 --- a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_hosts.tsx +++ b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_hosts.tsx @@ -6,10 +6,10 @@ */ import { HostsTableType } from '../../../hosts/store/model'; - +import { HOSTS_PATH } from '../../../../common/constants'; import { appendSearch } from './helpers'; -export const getHostsUrl = (search?: string) => `${appendSearch(search)}`; +export const getHostsUrl = (search?: string) => `${HOSTS_PATH}${appendSearch(search)}`; export const getTabsOnHostsUrl = (tabName: HostsTableType, search?: string) => `/${tabName}${appendSearch(search)}`; diff --git a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx index adbc2e3a9b6700..ecc14781f7005c 100644 --- a/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx +++ b/x-pack/plugins/security_solution/public/common/components/link_to/redirect_to_timelines.tsx @@ -9,8 +9,6 @@ import { isEmpty } from 'lodash/fp'; import { TimelineTypeLiteral } from '../../../../common/types/timeline'; import { appendSearch } from './helpers'; -export const getTimelinesUrl = (search?: string) => `${appendSearch(search)}`; - export const getTimelineTabsUrl = (tabName: TimelineTypeLiteral, search?: string) => `/${tabName}${appendSearch(search)}`; diff --git a/x-pack/plugins/security_solution/public/common/components/links/index.tsx b/x-pack/plugins/security_solution/public/common/components/links/index.tsx index 13888c98c42437..0b6b77aab00e4f 100644 --- a/x-pack/plugins/security_solution/public/common/components/links/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/links/index.tsx @@ -20,7 +20,7 @@ import React, { useMemo, useCallback } from 'react'; import { isNil } from 'lodash/fp'; import styled from 'styled-components'; -import { IP_REPUTATION_LINKS_SETTING, APP_ID, CASES_APP_ID } from '../../../../common/constants'; +import { IP_REPUTATION_LINKS_SETTING, APP_ID } from '../../../../common/constants'; import { DefaultFieldRendererOverflow, DEFAULT_MORE_MAX_HEIGHT, @@ -71,7 +71,8 @@ const HostDetailsLinkComponent: React.FC<{ const goToHostDetails = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.hosts}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.hosts, path: getHostDetailsUrl(encodeURIComponent(hostName), search), }); }, @@ -142,7 +143,8 @@ const NetworkDetailsLinkComponent: React.FC<{ const goToNetworkDetails = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.network}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.network, path: getNetworkDetailsUrl(encodeURIComponent(encodeIpv6(ip)), flowTarget, search), }); }, @@ -179,7 +181,8 @@ const CaseDetailsLinkComponent: React.FC<{ const goToCaseDetails = useCallback( async (ev) => { ev.preventDefault(); - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), }); }, @@ -206,7 +209,8 @@ export const CreateCaseLink = React.memo<{ children: React.ReactNode }>(({ child const goToCreateCase = useCallback( async (ev) => { ev.preventDefault(); - return navigateToApp(CASES_APP_ID, { + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCreateCaseUrl(search), }); }, diff --git a/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx b/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx index 048be383441ec5..f92512cec5c72f 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx @@ -8,95 +8,98 @@ import { parse, stringify } from 'query-string'; import React from 'react'; -import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; +import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom'; + import { addEntitiesToKql } from './add_entities_to_kql'; import { replaceKQLParts } from './replace_kql_parts'; import { emptyEntity, multipleEntities, getMultipleEntities } from './entity_helpers'; import { HostsTableType } from '../../../../hosts/store/model'; - import { url as urlUtils } from '../../../../../../../../src/plugins/kibana_utils/public'; - +import { HOSTS_PATH } from '../../../../../common/constants'; interface QueryStringType { '?_g': string; query: string | null; timerange: string | null; } -type MlHostConditionalProps = Partial<RouteComponentProps<{}>> & { url: string }; - -export const MlHostConditionalContainer = React.memo<MlHostConditionalProps>(({ url }) => ( - <Switch> - <Route - strict - exact - path={url} - render={({ location }) => { - const queryStringDecoded = parse(location.search.substring(1), { - sort: false, - }) as Required<QueryStringType>; - - if (queryStringDecoded.query != null) { - queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); - } - const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { - sort: false, - encode: false, - }); - return <Redirect to={`?${reEncoded}`} />; - }} - /> - <Route - path={`${url}/:hostName`} - render={({ - location, - match: { - params: { hostName }, - }, - }) => { - const queryStringDecoded = parse(location.search.substring(1), { - sort: false, - }) as Required<QueryStringType>; - - if (queryStringDecoded.query != null) { - queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); - } - if (emptyEntity(hostName)) { - const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { +export const MlHostConditionalContainer = React.memo(() => { + const { path } = useRouteMatch(); + return ( + <Switch> + <Route + strict + exact + path={path} + render={({ location }) => { + const queryStringDecoded = parse(location.search.substring(1), { sort: false, - encode: false, - }); + }) as Required<QueryStringType>; - return <Redirect to={`/${HostsTableType.anomalies}?${reEncoded}`} />; - } else if (multipleEntities(hostName)) { - const hosts: string[] = getMultipleEntities(hostName); - queryStringDecoded.query = addEntitiesToKql( - ['host.name'], - hosts, - queryStringDecoded.query || '' - ); + if (queryStringDecoded.query != null) { + queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); + } const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { sort: false, encode: false, }); - - return <Redirect to={`/${HostsTableType.anomalies}?${reEncoded}`} />; - } else { - const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + return <Redirect to={`${HOSTS_PATH}?${reEncoded}`} />; + }} + /> + <Route + path={`${path}/:hostName`} + render={({ + location, + match: { + params: { hostName }, + }, + }) => { + const queryStringDecoded = parse(location.search.substring(1), { sort: false, - encode: false, - }); + }) as Required<QueryStringType>; + + if (queryStringDecoded.query != null) { + queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); + } + if (emptyEntity(hostName)) { + const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + sort: false, + encode: false, + }); + + return <Redirect to={`${HOSTS_PATH}/${HostsTableType.anomalies}?${reEncoded}`} />; + } else if (multipleEntities(hostName)) { + const hosts: string[] = getMultipleEntities(hostName); + queryStringDecoded.query = addEntitiesToKql( + ['host.name'], + hosts, + queryStringDecoded.query || '' + ); + const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + sort: false, + encode: false, + }); + + return <Redirect to={`${HOSTS_PATH}/${HostsTableType.anomalies}?${reEncoded}`} />; + } else { + const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + sort: false, + encode: false, + }); - return <Redirect to={`/${hostName}/${HostsTableType.anomalies}?${reEncoded}`} />; - } - }} - /> - <Route - path="/ml-hosts/" - render={({ location: { search = '' } }) => ( - <Redirect from="/ml-hosts/" to={`/ml-hosts${search}`} /> - )} - /> - </Switch> -)); + return ( + <Redirect to={`${HOSTS_PATH}/${hostName}/${HostsTableType.anomalies}?${reEncoded}`} /> + ); + } + }} + /> + <Route + path={`${HOSTS_PATH}/ml-hosts/`} + render={({ location: { search = '' } }) => ( + <Redirect from={`${HOSTS_PATH}/ml-hosts/`} to={`${HOSTS_PATH}/ml-hosts${search}`} /> + )} + /> + </Switch> + ); +}); MlHostConditionalContainer.displayName = 'MlHostConditionalContainer'; diff --git a/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx b/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx index 81327937e7c4cf..a144898b4d95c0 100644 --- a/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx +++ b/x-pack/plugins/security_solution/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx @@ -8,95 +8,102 @@ import { parse, stringify } from 'query-string'; import React from 'react'; -import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; +import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom'; import { addEntitiesToKql } from './add_entities_to_kql'; import { replaceKQLParts } from './replace_kql_parts'; import { emptyEntity, getMultipleEntities, multipleEntities } from './entity_helpers'; import { url as urlUtils } from '../../../../../../../../src/plugins/kibana_utils/public'; - +import { NETWORK_PATH } from '../../../../../common/constants'; interface QueryStringType { '?_g': string; query: string | null; timerange: string | null; } -type MlNetworkConditionalProps = Partial<RouteComponentProps<{}>> & { url: string }; - -export const MlNetworkConditionalContainer = React.memo<MlNetworkConditionalProps>(({ url }) => ( - <Switch> - <Route - strict - exact - path={url} - render={({ location }) => { - const queryStringDecoded = parse(location.search.substring(1), { - sort: false, - }) as Required<QueryStringType>; - - if (queryStringDecoded.query != null) { - queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); - } - - const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { - sort: false, - encode: false, - }); - - return <Redirect to={`?${reEncoded}`} />; - }} - /> - <Route - path={`${url}/ip/:ip`} - render={({ - location, - match: { - params: { ip }, - }, - }) => { - const queryStringDecoded = parse(location.search.substring(1), { - sort: false, - }) as Required<QueryStringType>; +export const MlNetworkConditionalContainer = React.memo(() => { + const { path } = useRouteMatch(); + return ( + <Switch> + <Route + strict + exact + path={path} + render={({ location }) => { + const queryStringDecoded = parse(location.search.substring(1), { + sort: false, + }) as Required<QueryStringType>; - if (queryStringDecoded.query != null) { - queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); - } + if (queryStringDecoded.query != null) { + queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); + } - if (emptyEntity(ip)) { const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { sort: false, encode: false, }); - return <Redirect to={`?${reEncoded}`} />; - } else if (multipleEntities(ip)) { - const ips: string[] = getMultipleEntities(ip); - queryStringDecoded.query = addEntitiesToKql( - ['source.ip', 'destination.ip'], - ips, - queryStringDecoded.query || '' - ); - const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { - sort: false, - encode: false, - }); - return <Redirect to={`?${reEncoded}`} />; - } else { - const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + return <Redirect to={`${NETWORK_PATH}?${reEncoded}`} />; + }} + /> + <Route + path={`${path}/ip/:ip`} + render={({ + location, + match: { + params: { ip }, + }, + }) => { + const queryStringDecoded = parse(location.search.substring(1), { sort: false, - encode: false, - }); - return <Redirect to={`/ip/${ip}?${reEncoded}`} />; - } - }} - /> - <Route - path="/ml-network/" - render={({ location: { search = '' } }) => ( - <Redirect from="/ml-network/" to={`/ml-network${search}`} /> - )} - /> - </Switch> -)); + }) as Required<QueryStringType>; + + if (queryStringDecoded.query != null) { + queryStringDecoded.query = replaceKQLParts(queryStringDecoded.query); + } + + if (emptyEntity(ip)) { + const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + sort: false, + encode: false, + }); + + return <Redirect to={`${NETWORK_PATH}?${reEncoded}`} />; + } else if (multipleEntities(ip)) { + const ips: string[] = getMultipleEntities(ip); + queryStringDecoded.query = addEntitiesToKql( + ['source.ip', 'destination.ip'], + ips, + queryStringDecoded.query || '' + ); + const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + sort: false, + encode: false, + }); + return <Redirect to={`${NETWORK_PATH}?${reEncoded}`} />; + } else { + const reEncoded = stringify(urlUtils.encodeQuery(queryStringDecoded), { + sort: false, + encode: false, + }); + return <Redirect to={`${NETWORK_PATH}/ip/${ip}?${reEncoded}`} />; + } + }} + /> + <Route + path={`${NETWORK_PATH}/ml-network/`} + render={({ location: { search = '' } }) => ( + <Redirect + from={`${NETWORK_PATH}/ml-network/`} + to={{ + pathname: `${NETWORK_PATH}/ml-network`, + search, + }} + /> + )} + /> + </Switch> + ); +}); MlNetworkConditionalContainer.displayName = 'MlNetworkConditionalContainer'; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts index c869df6ad388ee..6789d8e1d4524c 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts @@ -73,6 +73,27 @@ const getMockObject = ( name: 'Timelines', urlKey: 'timeline', }, + alerts: { + disabled: false, + href: '/app/security/alerts', + id: 'alerts', + name: 'Alerts', + urlKey: 'alerts', + }, + exceptions: { + disabled: false, + href: '/app/security/exceptions', + id: 'exceptions', + name: 'Exceptions', + urlKey: 'exceptions', + }, + rules: { + disabled: false, + href: '/app/security/rules', + id: 'rules', + name: 'Rules', + urlKey: 'rules', + }, }, pageName, pathName, @@ -112,8 +133,10 @@ const getMockObject = ( }); // The string returned is different from what getUrlForApp returns, but does not matter for the purposes of this test. -const getUrlForAppMock = (appId: string, options?: { path?: string; absolute?: boolean }) => - `${appId}${options?.path ?? ''}`; +const getUrlForAppMock = ( + appId: string, + options?: { deepLinkId?: string; path?: string; absolute?: boolean } +) => `${appId}${options?.deepLinkId ? `/${options.deepLinkId}` : ''}${options?.path ?? ''}`; describe('Navigation Breadcrumbs', () => { const hostName = 'siem-kibana'; @@ -130,12 +153,12 @@ describe('Navigation Breadcrumbs', () => { ); expect(breadcrumbs).toEqual([ { - href: 'securitySolutionoverview', + href: 'securitySolution/overview', text: 'Security', }, { href: - "securitySolution:hosts?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/hosts?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", text: 'Hosts', }, { @@ -151,11 +174,11 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Network', href: - "securitySolution:network?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/network?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, { text: 'Flows', @@ -170,11 +193,11 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Timelines', href: - "securitySolution:timelines?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/timelines?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, ]); }); @@ -185,16 +208,16 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Hosts', href: - "securitySolution:hosts?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/hosts?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, { text: 'siem-kibana', href: - "securitySolution:hosts/siem-kibana?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/hosts/siem-kibana?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, { text: 'Authentications', href: '' }, ]); @@ -206,15 +229,15 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Network', href: - "securitySolution:network?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/network?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, { text: ipv4, - href: `securitySolution:network/ip/${ipv4}/source?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, + href: `securitySolution/network/ip/${ipv4}/source?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, }, { text: 'Flows', href: '' }, ]); @@ -226,45 +249,152 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Network', href: - "securitySolution:network?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/network?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, { text: ipv6, - href: `securitySolution:network/ip/${ipv6Encoded}/source?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, + href: `securitySolution/network/ip/${ipv6Encoded}/source?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, }, { text: 'Flows', href: '' }, ]); }); - test('should return Alerts breadcrumbs when supplied detection pathname', () => { + test('should return Alerts breadcrumbs when supplied alerts pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('alerts', '/alerts', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: 'securitySolution/overview' }, + { + text: 'Alerts', + href: '', + }, + ]); + }); + + test('should return Exceptions breadcrumbs when supplied exceptions pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('exceptions', '/exceptions', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: 'securitySolution/overview' }, + { + text: 'Exceptions', + href: '', + }, + ]); + }); + + test('should return Rules breadcrumbs when supplied rules pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('rules', '/rules', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: 'securitySolution/overview' }, + { + text: 'Rules', + href: + "securitySolution/rules?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + ]); + }); + + test('should return Rules breadcrumbs when supplied rules Creation pathname', () => { + const breadcrumbs = getBreadcrumbsForRoute( + getMockObject('rules', '/rules/create', undefined), + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: 'securitySolution/overview' }, + { + text: 'Rules', + href: + "securitySolution/rules?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + { + text: 'Create', + href: + "securitySolution/rules/create?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + ]); + }); + + test('should return Rules breadcrumbs when supplied rules Details pathname', () => { + const mockDetailName = '5a4a0460-d822-11eb-8962-bfd4aff0a9b3'; + const mockRuleName = 'RULE_NAME'; const breadcrumbs = getBreadcrumbsForRoute( - getMockObject('detections', '/', undefined), + { + ...getMockObject('rules', `/rules/id/${mockDetailName}`, undefined), + detailName: mockDetailName, + state: { + ruleName: mockRuleName, + }, + }, getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { - text: 'Detections', + text: 'Rules', href: - "securitySolution:detections?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/rules?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + { + text: mockRuleName, + href: `securitySolution/rules/id/${mockDetailName}?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, }, ]); }); + + test('should return Rules breadcrumbs when supplied rules Edit pathname', () => { + const mockDetailName = '5a4a0460-d822-11eb-8962-bfd4aff0a9b3'; + const mockRuleName = 'RULE_NAME'; + const breadcrumbs = getBreadcrumbsForRoute( + { + ...getMockObject('rules', `/rules/id/${mockDetailName}/edit`, undefined), + detailName: mockDetailName, + state: { + ruleName: mockRuleName, + }, + }, + getUrlForAppMock + ); + expect(breadcrumbs).toEqual([ + { text: 'Security', href: 'securitySolution/overview' }, + { + text: 'Rules', + href: + "securitySolution/rules?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + }, + { + text: 'RULE_NAME', + href: `securitySolution/rules/id/${mockDetailName}?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, + }, + { + text: 'Edit', + href: `securitySolution/rules/id/${mockDetailName}/edit?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, + }, + ]); + }); + test('should return Cases breadcrumbs when supplied case pathname', () => { const breadcrumbs = getBreadcrumbsForRoute( getMockObject('case', '/', undefined), getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Cases', href: - "securitySolution:case?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/case?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, ]); }); @@ -281,15 +411,15 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Cases', href: - "securitySolution:case?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/case?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", }, { text: sampleCase.name, - href: `securitySolution:case/${sampleCase.id}?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, + href: `securitySolution/case/${sampleCase.id}?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))`, }, ]); }); @@ -299,10 +429,10 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Administration', - href: 'securitySolution:administration', + href: 'securitySolution/endpoints', }, ]); }); @@ -321,11 +451,11 @@ describe('Navigation Breadcrumbs', () => { getUrlForAppMock ); expect(breadcrumbs).toEqual([ - { text: 'Security', href: 'securitySolutionoverview' }, + { text: 'Security', href: 'securitySolution/overview' }, { text: 'Timelines', href: - "securitySolution:timelines?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))&timeline=(activeTab:query,graphEventId:GRAPH_EVENT_ID,id:TIMELINE_ID,isOpen:!f)", + "securitySolution/timelines?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))&timeline=(activeTab:query,graphEventId:GRAPH_EVENT_ID,id:TIMELINE_ID,isOpen:!f)", }, ]); }); @@ -333,20 +463,35 @@ describe('Navigation Breadcrumbs', () => { describe('setBreadcrumbs()', () => { test('should call chrome breadcrumb service with correct breadcrumbs', () => { - setBreadcrumbs(getMockObject('hosts', '/', hostName), chromeMock, getUrlForAppMock); + const navigateToUrlMock = jest.fn(); + setBreadcrumbs( + getMockObject('hosts', '/', hostName), + chromeMock, + getUrlForAppMock, + navigateToUrlMock + ); expect(setBreadcrumbsMock).toBeCalledWith([ - { text: 'Security', href: 'securitySolutionoverview' }, - { + expect.objectContaining({ + text: 'Security', + href: 'securitySolution/overview', + onClick: expect.any(Function), + }), + expect.objectContaining({ text: 'Hosts', href: - "securitySolution:hosts?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", - }, - { + "securitySolution/hosts?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + onClick: expect.any(Function), + }), + expect.objectContaining({ text: 'siem-kibana', href: - "securitySolution:hosts/siem-kibana?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + "securitySolution/hosts/siem-kibana?sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2019-05-16T23:10:43.696Z',fromStr:now-24h,kind:relative,to:'2019-05-17T23:10:43.697Z',toStr:now)))", + onClick: expect.any(Function), + }), + { + text: 'Authentications', + href: '', }, - { text: 'Authentications', href: '' }, ]); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts index a09945f705c582..4578e16dc5540f 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts @@ -28,16 +28,29 @@ import { getAppOverviewUrl } from '../../link_to'; import { TabNavigationProps } from '../tab_navigation/types'; import { getSearch } from '../helpers'; -import { GetUrlForApp, SearchNavTab } from '../types'; +import { GetUrlForApp, NavigateToUrl, SearchNavTab } from '../types'; export const setBreadcrumbs = ( spyState: RouteSpyState & TabNavigationProps, chrome: StartServices['chrome'], - getUrlForApp: GetUrlForApp + getUrlForApp: GetUrlForApp, + navigateToUrl: NavigateToUrl ) => { const breadcrumbs = getBreadcrumbsForRoute(spyState, getUrlForApp); if (breadcrumbs) { - chrome.setBreadcrumbs(breadcrumbs); + chrome.setBreadcrumbs( + breadcrumbs.map((breadcrumb) => ({ + ...breadcrumb, + ...(breadcrumb.href && !breadcrumb.onClick + ? { + onClick: (ev) => { + ev.preventDefault(); + navigateToUrl(breadcrumb.href!); + }, + } + : {}), + })) + ); } }; @@ -53,12 +66,12 @@ const isTimelinesRoutes = (spyState: RouteSpyState): spyState is TimelineRouteSp const isCaseRoutes = (spyState: RouteSpyState): spyState is RouteSpyState => spyState != null && spyState.pageName === SecurityPageName.case; -const isAlertsRoutes = (spyState: RouteSpyState) => - spyState != null && spyState.pageName === SecurityPageName.detections; - const isAdminRoutes = (spyState: RouteSpyState): spyState is AdministrationRouteSpyState => spyState != null && spyState.pageName === SecurityPageName.administration; +const isRulesRoutes = (spyState: RouteSpyState): spyState is AdministrationRouteSpyState => + spyState != null && spyState.pageName === SecurityPageName.rules; + // eslint-disable-next-line complexity export const getBreadcrumbsForRoute = ( objectParam: RouteSpyState & TabNavigationProps, @@ -69,7 +82,7 @@ export const getBreadcrumbsForRoute = ( // Sets `timeline.isOpen` to false in the state to avoid reopening the timeline on breadcrumb click. https://github.com/elastic/kibana/issues/100322 const object = { ...objectParam, timeline: { ...objectParam.timeline, isOpen: false } }; - const overviewPath = getUrlForApp(APP_ID, { path: SecurityPageName.overview }); + const overviewPath = getUrlForApp(APP_ID, { deepLinkId: SecurityPageName.overview }); const siemRootBreadcrumb: ChromeBreadcrumb = { text: APP_NAME, href: getAppOverviewUrl(overviewPath), @@ -80,6 +93,7 @@ export const getBreadcrumbsForRoute = ( if (spyState.tabName != null) { urlStateKeys = [...urlStateKeys, getOr(tempNav, spyState.tabName, object.navTabs)]; } + return [ siemRootBreadcrumb, ...getHostDetailsBreadcrumbs( @@ -110,8 +124,8 @@ export const getBreadcrumbsForRoute = ( ), ]; } - if (isAlertsRoutes(spyState) && object.navTabs) { - const tempNav: SearchNavTab = { urlKey: 'detections', isDetailPage: false }; + if (isRulesRoutes(spyState) && object.navTabs) { + const tempNav: SearchNavTab = { urlKey: SecurityPageName.rules, isDetailPage: false }; let urlStateKeys = [getOr(tempNav, spyState.pageName, object.navTabs)]; if (spyState.tabName != null) { urlStateKeys = [...urlStateKeys, getOr(tempNav, spyState.tabName, object.navTabs)]; @@ -129,6 +143,7 @@ export const getBreadcrumbsForRoute = ( ), ]; } + if (isCaseRoutes(spyState) && object.navTabs) { const tempNav: SearchNavTab = { urlKey: 'case', isDetailPage: false }; let urlStateKeys = [getOr(tempNav, spyState.pageName, object.navTabs)]; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/index.test.tsx index c75b38e03acb46..5bb0805acc378c 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/index.test.tsx @@ -32,7 +32,8 @@ jest.mock('./breadcrumbs', () => ({ setBreadcrumbs: jest.fn(), })); const mockGetUrlForApp = jest.fn(); -jest.mock('../../lib/kibana', () => { +const mockNavigateToUrl = jest.fn(); +jest.mock('../../lib/kibana/kibana_react', () => { return { useKibana: () => ({ services: { @@ -40,6 +41,7 @@ jest.mock('../../lib/kibana', () => { application: { navigateToApp: jest.fn(), getUrlForApp: mockGetUrlForApp, + navigateToUrl: mockNavigateToUrl, }, }, }), @@ -47,6 +49,13 @@ jest.mock('../../lib/kibana', () => { }); jest.mock('../link_to'); +jest.mock('react-router-dom', () => ({ + useLocation: jest.fn(() => ({ + search: '', + })), + useHistory: jest.fn(), +})); + describe('SIEM Navigation', () => { const mockProps: TabNavigationComponentProps & SecuritySolutionTabNavigationProps & @@ -97,57 +106,7 @@ describe('SIEM Navigation', () => { 1, { detailName: undefined, - navTabs: { - detections: { - disabled: false, - href: '/app/security/detections', - id: 'detections', - name: 'Detections', - urlKey: 'detections', - }, - case: { - disabled: false, - href: '/app/security/cases', - id: 'case', - name: 'Cases', - urlKey: 'case', - }, - administration: { - disabled: false, - href: '/app/security/administration', - id: 'administration', - name: 'Administration', - urlKey: 'administration', - }, - hosts: { - disabled: false, - href: '/app/security/hosts', - id: 'hosts', - name: 'Hosts', - urlKey: 'host', - }, - network: { - disabled: false, - href: '/app/security/network', - id: 'network', - name: 'Network', - urlKey: 'network', - }, - overview: { - disabled: false, - href: '/app/security/overview', - id: 'overview', - name: 'Overview', - urlKey: 'overview', - }, - timelines: { - disabled: false, - href: '/app/security/timelines', - id: 'timelines', - name: 'Timelines', - urlKey: 'timeline', - }, - }, + navTabs, pageName: 'hosts', pathName: '/', search: '', @@ -188,7 +147,8 @@ describe('SIEM Navigation', () => { }, }, undefined, - mockGetUrlForApp + mockGetUrlForApp, + mockNavigateToUrl ); }); test('it calls setBreadcrumbs with correct path on update', () => { @@ -204,57 +164,7 @@ describe('SIEM Navigation', () => { detailName: undefined, filters: [], flowTarget: undefined, - navTabs: { - detections: { - disabled: false, - href: '/app/security/detections', - id: 'detections', - name: 'Detections', - urlKey: 'detections', - }, - case: { - disabled: false, - href: '/app/security/cases', - id: 'case', - name: 'Cases', - urlKey: 'case', - }, - hosts: { - disabled: false, - href: '/app/security/hosts', - id: 'hosts', - name: 'Hosts', - urlKey: 'host', - }, - administration: { - disabled: false, - href: '/app/security/administration', - id: 'administration', - name: 'Administration', - urlKey: 'administration', - }, - network: { - disabled: false, - href: '/app/security/network', - id: 'network', - name: 'Network', - urlKey: 'network', - }, - overview: { - disabled: false, - href: '/app/security/overview', - id: 'overview', - name: 'Overview', - urlKey: 'overview', - }, - timelines: { - disabled: false, - href: '/app/security/timelines', - id: 'timelines', - name: 'Timelines', - urlKey: 'timeline', - }, - }, + navTabs, pageName: 'network', pathName: '/', query: { language: 'kuery', query: '' }, @@ -288,7 +198,8 @@ describe('SIEM Navigation', () => { }, }, undefined, - mockGetUrlForApp + mockGetUrlForApp, + mockNavigateToUrl ); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx index 233b4b2cb1d029..71a5309937fff3 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/index.tsx @@ -39,7 +39,7 @@ export const TabNavigationComponent: React.FC< }) => { const { chrome, - application: { getUrlForApp }, + application: { getUrlForApp, navigateToUrl }, } = useKibana().services; useEffect(() => { @@ -62,7 +62,8 @@ export const TabNavigationComponent: React.FC< timerange: urlState.timerange, }, chrome, - getUrlForApp + getUrlForApp, + navigateToUrl ); } }, [ @@ -77,6 +78,7 @@ export const TabNavigationComponent: React.FC< flowTarget, tabName, getUrlForApp, + navigateToUrl, ]); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.test.tsx index 3e66a024c7bd0e..18dd07a99824e1 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.test.tsx @@ -9,8 +9,6 @@ import { mount } from 'enzyme'; import React from 'react'; import { TimelineTabs } from '../../../../../common/types/timeline'; -import { navTabs } from '../../../../app/home/home_navigations'; -import { SecurityPageName } from '../../../../app/types'; import { navTabsHostDetails } from '../../../../hosts/pages/details/nav_tabs'; import { HostsTableType } from '../../../../hosts/store/model'; import { RouteSpyState } from '../../../utils/route/types'; @@ -18,153 +16,107 @@ import { CONSTANTS } from '../../url_state/constants'; import { TabNavigationComponent } from './'; import { TabNavigationProps } from './types'; -jest.mock('../../../lib/kibana'); jest.mock('../../link_to'); +jest.mock('../../../lib/kibana/kibana_react', () => { + const originalModule = jest.requireActual('../../../../common/lib/kibana/kibana_react'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + getUrlForApp: (appId: string, options?: { path?: string }) => + `/app/${appId}${options?.path}`, + navigateToApp: jest.fn(), + }, + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), + }; +}); + +const SEARCH_QUERY = '?search=test'; jest.mock('react-router-dom', () => { const original = jest.requireActual('react-router-dom'); return { ...original, - useHistory: () => ({ - push: jest.fn(), - }), + useLocation: jest.fn(() => ({ + search: SEARCH_QUERY, + })), }; }); -describe('Tab Navigation', () => { - const pageName = SecurityPageName.hosts; - const hostName = 'siem-window'; - const tabName = HostsTableType.authentications; - const pathName = `/${pageName}/${hostName}/${tabName}`; +const hostName = 'siem-window'; - describe('Page Navigation', () => { - const mockProps: TabNavigationProps & RouteSpyState = { - pageName, - pathName, - detailName: undefined, - search: '', - tabName, - navTabs, - [CONSTANTS.timerange]: { - global: { - [CONSTANTS.timerange]: { - from: '2019-05-16T23:10:43.696Z', - fromStr: 'now-24h', - kind: 'relative', - to: '2019-05-17T23:10:43.697Z', - toStr: 'now', - }, - linkTo: ['timeline'], - }, - timeline: { - [CONSTANTS.timerange]: { - from: '2019-05-16T23:10:43.696Z', - fromStr: 'now-24h', - kind: 'relative', - to: '2019-05-17T23:10:43.697Z', - toStr: 'now', - }, - linkTo: ['global'], +describe('Table Navigation', () => { + const mockHasMlUserPermissions = true; + const mockProps: TabNavigationProps & RouteSpyState = { + pageName: 'hosts', + pathName: '/hosts', + detailName: undefined, + search: '', + tabName: HostsTableType.authentications, + navTabs: navTabsHostDetails(hostName, mockHasMlUserPermissions), + [CONSTANTS.timerange]: { + global: { + [CONSTANTS.timerange]: { + from: '2019-05-16T23:10:43.696Z', + fromStr: 'now-24h', + kind: 'relative', + to: '2019-05-17T23:10:43.697Z', + toStr: 'now', }, + linkTo: ['timeline'], }, - [CONSTANTS.appQuery]: { query: 'host.name:"siem-es"', language: 'kuery' }, - [CONSTANTS.filters]: [], - [CONSTANTS.sourcerer]: {}, - [CONSTANTS.timeline]: { - activeTab: TimelineTabs.query, - id: '', - isOpen: false, - graphEventId: '', - }, - }; - test('it mounts with correct tab highlighted', () => { - const wrapper = mount(<TabNavigationComponent {...mockProps} />); - const hostsTab = wrapper.find('EuiTab[data-test-subj="navigation-hosts"]'); - expect(hostsTab.prop('isSelected')).toBeTruthy(); - }); - test('it changes active tab when nav changes by props', () => { - const wrapper = mount(<TabNavigationComponent {...mockProps} />); - const networkTab = () => wrapper.find('EuiTab[data-test-subj="navigation-network"]').first(); - expect(networkTab().prop('isSelected')).toBeFalsy(); - wrapper.setProps({ - pageName: 'network', - pathName: '/network', - tabName: undefined, - }); - wrapper.update(); - expect(networkTab().prop('isSelected')).toBeTruthy(); - }); - }); - - describe('Table Navigation', () => { - const mockHasMlUserPermissions = true; - const mockProps: TabNavigationProps & RouteSpyState = { - pageName: 'hosts', - pathName: '/hosts', - detailName: undefined, - search: '', - tabName: HostsTableType.authentications, - navTabs: navTabsHostDetails(hostName, mockHasMlUserPermissions), - [CONSTANTS.timerange]: { - global: { - [CONSTANTS.timerange]: { - from: '2019-05-16T23:10:43.696Z', - fromStr: 'now-24h', - kind: 'relative', - to: '2019-05-17T23:10:43.697Z', - toStr: 'now', - }, - linkTo: ['timeline'], + timeline: { + [CONSTANTS.timerange]: { + from: '2019-05-16T23:10:43.696Z', + fromStr: 'now-24h', + kind: 'relative', + to: '2019-05-17T23:10:43.697Z', + toStr: 'now', }, - timeline: { - [CONSTANTS.timerange]: { - from: '2019-05-16T23:10:43.696Z', - fromStr: 'now-24h', - kind: 'relative', - to: '2019-05-17T23:10:43.697Z', - toStr: 'now', - }, - linkTo: ['global'], - }, - }, - [CONSTANTS.appQuery]: { query: 'host.name:"siem-es"', language: 'kuery' }, - [CONSTANTS.filters]: [], - [CONSTANTS.sourcerer]: {}, - [CONSTANTS.timeline]: { - activeTab: TimelineTabs.query, - id: '', - isOpen: false, - graphEventId: '', + linkTo: ['global'], }, - }; - test('it mounts with correct tab highlighted', () => { - const wrapper = mount(<TabNavigationComponent {...mockProps} />); - const tableNavigationTab = wrapper.find( - `EuiTab[data-test-subj="navigation-${HostsTableType.authentications}"]` - ); + }, + [CONSTANTS.appQuery]: { query: 'host.name:"siem-es"', language: 'kuery' }, + [CONSTANTS.filters]: [], + [CONSTANTS.sourcerer]: {}, + [CONSTANTS.timeline]: { + activeTab: TimelineTabs.query, + id: '', + isOpen: false, + graphEventId: '', + }, + }; + test('it mounts with correct tab highlighted', () => { + const wrapper = mount(<TabNavigationComponent {...mockProps} />); + const tableNavigationTab = wrapper.find( + `EuiTab[data-test-subj="navigation-${HostsTableType.authentications}"]` + ); - expect(tableNavigationTab.prop('isSelected')).toBeTruthy(); - }); - test('it changes active tab when nav changes by props', () => { - const wrapper = mount(<TabNavigationComponent {...mockProps} />); - const tableNavigationTab = () => - wrapper.find(`[data-test-subj="navigation-${HostsTableType.events}"]`).first(); - expect(tableNavigationTab().prop('isSelected')).toBeFalsy(); - wrapper.setProps({ - pageName: SecurityPageName.hosts, - pathName: `/${SecurityPageName.hosts}`, - tabName: HostsTableType.events, - }); - wrapper.update(); - expect(tableNavigationTab().prop('isSelected')).toBeTruthy(); - }); - test('it carries the url state in the link', () => { - const wrapper = mount(<TabNavigationComponent {...mockProps} />); - const firstTab = wrapper.find( - `EuiTab[data-test-subj="navigation-${HostsTableType.authentications}"]` - ); - expect(firstTab.props().href).toBe('/siem-window/authentications'); + expect(tableNavigationTab.prop('isSelected')).toBeTruthy(); + }); + test('it changes active tab when nav changes by props', () => { + const wrapper = mount(<TabNavigationComponent {...mockProps} />); + const tableNavigationTab = () => + wrapper.find(`[data-test-subj="navigation-${HostsTableType.events}"]`).first(); + expect(tableNavigationTab().prop('isSelected')).toBeFalsy(); + wrapper.setProps({ + tabName: HostsTableType.events, }); + wrapper.update(); + expect(tableNavigationTab().prop('isSelected')).toBeTruthy(); + }); + test('it carries the url state in the link', () => { + const wrapper = mount(<TabNavigationComponent {...mockProps} />); + + const firstTab = wrapper.find( + `EuiTab[data-test-subj="navigation-${HostsTableType.authentications}"]` + ); + expect(firstTab.props().href).toBe( + `/app/securitySolution/hosts/siem-window/authentications${SEARCH_QUERY}` + ); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.tsx index 92596945a4769a..2ca0d878078aa7 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/index.tsx @@ -8,48 +8,35 @@ import { EuiTab, EuiTabs } from '@elastic/eui'; import { getOr } from 'lodash/fp'; import React, { useEffect, useState, useCallback, useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; +import { useLocation } from 'react-router-dom'; import deepEqual from 'fast-deep-equal'; -import { APP_ID } from '../../../../../common/constants'; +import { useNavigation } from '../../../lib/kibana/hooks'; import { track, METRIC_TYPE, TELEMETRY_EVENT } from '../../../lib/telemetry'; -import { getSearch } from '../helpers'; import { TabNavigationProps, TabNavigationItemProps } from './types'; -import { useKibana } from '../../../lib/kibana'; -import { SecurityPageName } from '../../../../app/types'; -import { useFormatUrl } from '../../link_to'; const TabNavigationItemComponent = ({ disabled, - href, hrefWithSearch, id, name, isSelected, - pageId, - urlSearch, }: TabNavigationItemProps) => { - const history = useHistory(); - const { navigateToApp, getUrlForApp } = useKibana().services.application; - const { formatUrl } = useFormatUrl(((pageId ?? id) as unknown) as SecurityPageName); + const { getAppUrl, navigateTo } = useNavigation(); + const handleClick = useCallback( (ev) => { ev.preventDefault(); - if (id in SecurityPageName && pageId == null) { - navigateToApp(`${APP_ID}:${id}`, { path: urlSearch }); - } else { - history.push(hrefWithSearch); - } + navigateTo({ path: hrefWithSearch }); track(METRIC_TYPE.CLICK, `${TELEMETRY_EVENT.TAB_CLICKED}${id}`); }, - [history, hrefWithSearch, id, navigateToApp, pageId, urlSearch] + [navigateTo, hrefWithSearch, id] ); - const appHref = - pageId != null - ? formatUrl(href) - : getUrlForApp(`${APP_ID}:${id}`, { - path: urlSearch, - }); + + const appHref = getAppUrl({ + path: hrefWithSearch, + }); + return ( <EuiTab data-href={appHref} @@ -68,28 +55,17 @@ const TabNavigationItem = React.memo(TabNavigationItemComponent); export const TabNavigationComponent: React.FC<TabNavigationProps> = ({ display, - filters, - query, navTabs, - pageName, - savedQuery, - sourcerer, tabName, - timeline, - timerange, }) => { const mapLocationToTab = useCallback( (): string => getOr( '', 'id', - Object.values(navTabs).find( - (item) => - (tabName === item.id && item.pageId != null) || - (pageName === item.id && item.pageId == null) - ) + Object.values(navTabs).find((item) => tabName === item.id) ), - [pageName, tabName, navTabs] + [tabName, navTabs] ); const [selectedTabId, setSelectedTabId] = useState(mapLocationToTab()); useEffect(() => { @@ -100,38 +76,27 @@ export const TabNavigationComponent: React.FC<TabNavigationProps> = ({ } // we do need navTabs in case the selectedTabId appears after initial load (ex. checking permissions for anomalies) - }, [pageName, tabName, navTabs, mapLocationToTab, selectedTabId]); + }, [tabName, navTabs, mapLocationToTab, selectedTabId]); + + const { search } = useLocation(); const renderTabs = useMemo( () => Object.values(navTabs).map((tab) => { const isSelected = selectedTabId === tab.id; - const search = getSearch(tab, { - filters, - query, - savedQuery, - sourcerer, - timeline, - timerange, - }); - const hrefWithSearch = - tab.href + getSearch(tab, { filters, query, savedQuery, sourcerer, timeline, timerange }); return ( <TabNavigationItem key={`navigation-${tab.id}`} id={tab.id} - href={tab.href} - hrefWithSearch={hrefWithSearch} + hrefWithSearch={tab.href + search} name={tab.name} disabled={tab.disabled} - pageId={tab.pageId} isSelected={isSelected} - urlSearch={search} /> ); }), - [navTabs, selectedTabId, filters, query, savedQuery, sourcerer, timeline, timerange] + [navTabs, selectedTabId, search] ); return <EuiTabs display={display}>{renderTabs}</EuiTabs>; @@ -143,15 +108,8 @@ export const TabNavigation = React.memo( TabNavigationComponent, (prevProps, nextProps) => prevProps.display === nextProps.display && - prevProps.pageName === nextProps.pageName && - prevProps.savedQuery === nextProps.savedQuery && prevProps.tabName === nextProps.tabName && - deepEqual(prevProps.filters, nextProps.filters) && - deepEqual(prevProps.query, nextProps.query) && - deepEqual(prevProps.navTabs, nextProps.navTabs) && - deepEqual(prevProps.sourcerer, nextProps.sourcerer) && - deepEqual(prevProps.timeline, nextProps.timeline) && - deepEqual(prevProps.timerange, nextProps.timerange) + deepEqual(prevProps.navTabs, nextProps.navTabs) ); TabNavigation.displayName = 'TabNavigation'; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/types.ts b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/types.ts index 53565d79e6948a..c99d50698db2b4 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/tab_navigation/types.ts @@ -27,12 +27,9 @@ export interface TabNavigationProps extends SecuritySolutionTabNavigationProps { } export interface TabNavigationItemProps { - href: string; hrefWithSearch: string; id: string; disabled: boolean; name: string; isSelected: boolean; - urlSearch: string; - pageId?: string; } diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/types.ts b/x-pack/plugins/security_solution/public/common/components/navigation/types.ts index 1c317700b1d150..1b1b3c9af4bfca 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/types.ts @@ -6,7 +6,7 @@ */ import { UrlStateType } from '../url_state/constants'; -import { SecurityPageName } from '../../../app/types'; +import { SecurityPageName, SecurityPageGroupName } from '../../../app/types'; import { UrlState } from '../url_state/types'; import { SiemRouteType } from '../../utils/route/types'; @@ -23,13 +23,25 @@ export interface TabNavigationComponentProps { export type SearchNavTab = NavTab | { urlKey: UrlStateType; isDetailPage: boolean }; +export interface NavGroupTab { + id: string; + name: string; +} + +export type SecurityNavTabGroupKey = + | SecurityPageGroupName.detect + | SecurityPageGroupName.explore + | SecurityPageGroupName.investigate + | SecurityPageGroupName.manage; + +export type NavTabGroups = Record<SecurityNavTabGroupKey, NavGroupTab>; + export interface NavTab { id: string; name: string; href: string; disabled: boolean; - urlKey: UrlStateType; - isDetailPage?: boolean; + urlKey?: UrlStateType; pageId?: SecurityPageName; } @@ -37,14 +49,21 @@ export type SiemNavTabKey = | SecurityPageName.overview | SecurityPageName.hosts | SecurityPageName.network - | SecurityPageName.detections + | SecurityPageName.alerts + | SecurityPageName.rules + | SecurityPageName.exceptions | SecurityPageName.timelines | SecurityPageName.case - | SecurityPageName.administration; + | SecurityPageName.administration + | SecurityPageName.endpoints + | SecurityPageName.trustedApps + | SecurityPageName.eventFilters; export type SiemNavTab = Record<SiemNavTabKey, NavTab>; export type GetUrlForApp = ( appId: string, - options?: { path?: string; absolute?: boolean } + options?: { deepLinkId?: string; path?: string; absolute?: boolean } ) => string; + +export type NavigateToUrl = (url: string) => void; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.test.tsx index ef00bef8413056..7e211a2e95152f 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.test.tsx @@ -74,8 +74,8 @@ describe('useSecuritySolutionNavigation', () => { services: { application: { navigateToApp: jest.fn(), - getUrlForApp: (appId: string, options?: { path?: string; absolute?: boolean }) => - `${appId}${options?.path ?? ''}`, + getUrlForApp: (appId: string, options?: { path?: string; deepLinkId?: boolean }) => + `${appId}/${options?.deepLinkId ?? ''}${options?.path ?? ''}`, }, chrome: { setBreadcrumbs: jest.fn(), @@ -97,67 +97,131 @@ describe('useSecuritySolutionNavigation', () => { "id": "securitySolution", "items": Array [ Object { - "data-href": "securitySolution:overview?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-href": "securitySolution/overview?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "data-test-subj": "navigation-overview", "disabled": false, - "href": "securitySolution:overview?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "href": "securitySolution/overview?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "id": "overview", "isSelected": false, "name": "Overview", "onClick": [Function], }, + ], + "name": "", + }, + Object { + "id": "detect", + "items": Array [ + Object { + "data-href": "securitySolution/alerts?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-test-subj": "navigation-alerts", + "disabled": false, + "href": "securitySolution/alerts?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "id": "alerts", + "isSelected": false, + "name": "Alerts", + "onClick": [Function], + }, Object { - "data-href": "securitySolution:detections?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", - "data-test-subj": "navigation-detections", + "data-href": "securitySolution/rules?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-test-subj": "navigation-rules", "disabled": false, - "href": "securitySolution:detections?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", - "id": "detections", + "href": "securitySolution/rules?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "id": "rules", "isSelected": false, - "name": "Detections", + "name": "Rules", "onClick": [Function], }, Object { - "data-href": "securitySolution:hosts?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-href": "securitySolution/exceptions?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-test-subj": "navigation-exceptions", + "disabled": false, + "href": "securitySolution/exceptions?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "id": "exceptions", + "isSelected": false, + "name": "Exceptions", + "onClick": [Function], + }, + ], + "name": "Detect", + }, + Object { + "id": "explore", + "items": Array [ + Object { + "data-href": "securitySolution/hosts?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "data-test-subj": "navigation-hosts", "disabled": false, - "href": "securitySolution:hosts?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "href": "securitySolution/hosts?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "id": "hosts", "isSelected": true, "name": "Hosts", "onClick": [Function], }, Object { - "data-href": "securitySolution:network?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-href": "securitySolution/network?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "data-test-subj": "navigation-network", "disabled": false, - "href": "securitySolution:network?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "href": "securitySolution/network?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "id": "network", "isSelected": false, "name": "Network", "onClick": [Function], }, + ], + "name": "Explore", + }, + Object { + "id": "investigate", + "items": Array [ Object { - "data-href": "securitySolution:timelines?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-href": "securitySolution/timelines?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "data-test-subj": "navigation-timelines", "disabled": false, - "href": "securitySolution:timelines?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "href": "securitySolution/timelines?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "id": "timelines", "isSelected": false, "name": "Timelines", "onClick": [Function], }, + ], + "name": "Investigate", + }, + Object { + "id": "manage", + "items": Array [ Object { - "data-href": "securitySolution:administration", - "data-test-subj": "navigation-administration", + "data-href": "securitySolution/endpoints", + "data-test-subj": "navigation-endpoints", "disabled": false, - "href": "securitySolution:administration", - "id": "administration", + "href": "securitySolution/endpoints", + "id": "endpoints", "isSelected": false, - "name": "Administration", + "name": "Endpoints", + "onClick": [Function], + }, + Object { + "data-href": "securitySolution/trusted_apps", + "data-test-subj": "navigation-trusted_apps", + "disabled": false, + "href": "securitySolution/trusted_apps", + "id": "trusted_apps", + "isSelected": false, + "name": "Trusted Applications", + "onClick": [Function], + }, + Object { + "data-href": "securitySolution/event_filters", + "data-test-subj": "navigation-event_filters", + "disabled": false, + "href": "securitySolution/event_filters", + "id": "event_filters", + "isSelected": false, + "name": "Event Filters", "onClick": [Function], }, ], - "name": "", + "name": "Manage", }, ], "name": "Security", @@ -177,15 +241,15 @@ describe('useSecuritySolutionNavigation', () => { useSecuritySolutionNavigation() ); - const caseNavItem = (result.current?.items || [])[0].items?.find( + const caseNavItem = (result.current?.items || [])[3].items?.find( (item) => item['data-test-subj'] === 'navigation-case' ); expect(caseNavItem).toMatchInlineSnapshot(` Object { - "data-href": "securitySolution:case?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "data-href": "securitySolution/case?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "data-test-subj": "navigation-case", "disabled": false, - "href": "securitySolution:case?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", + "href": "securitySolution/case?query=(language:kuery,query:'host.name:%22security-solution-es%22')&sourcerer=()&timerange=(global:(linkTo:!(timeline),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)),timeline:(linkTo:!(global),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now-24h,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now)))", "id": "case", "isSelected": false, "name": "Cases", @@ -204,7 +268,7 @@ describe('useSecuritySolutionNavigation', () => { useSecuritySolutionNavigation() ); - const caseNavItem = (result.current?.items || [])[0].items?.find( + const caseNavItem = (result.current?.items || [])[3].items?.find( (item) => item['data-test-subj'] === 'navigation-case' ); expect(caseNavItem).toBeFalsy(); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.tsx index f2aee86912dd7a..39c6885e8dff5d 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/index.tsx @@ -6,15 +6,13 @@ */ import { useEffect } from 'react'; -import { pickBy } from 'lodash/fp'; import { usePrimaryNavigation } from './use_primary_navigation'; -import { useGetUserCasesPermissions, useKibana } from '../../../lib/kibana'; +import { useKibana } from '../../../lib/kibana'; import { setBreadcrumbs } from '../breadcrumbs'; import { makeMapStateToProps } from '../../url_state/helpers'; import { useRouteSpy } from '../../../utils/route/use_route_spy'; import { navTabs } from '../../../../app/home/home_navigations'; import { useDeepEqualSelector } from '../../../hooks/use_selector'; -import { SecurityPageName } from '../../../../../common/constants'; /** * @description - This hook provides the structure necessary by the KibanaPageTemplate for rendering the primary security_solution side navigation. @@ -26,7 +24,7 @@ export const useSecuritySolutionNavigation = () => { const { urlState } = useDeepEqualSelector(urlMapState); const { chrome, - application: { getUrlForApp }, + application: { getUrlForApp, navigateToUrl }, } = useKibana().services; const { detailName, flowTarget, pageName, pathName, search, state, tabName } = routeProps; @@ -51,7 +49,8 @@ export const useSecuritySolutionNavigation = () => { timerange: urlState.timerange, }, chrome, - getUrlForApp + getUrlForApp, + navigateToUrl ); } }, [ @@ -65,25 +64,17 @@ export const useSecuritySolutionNavigation = () => { flowTarget, tabName, getUrlForApp, + navigateToUrl, ]); - const hasCasesReadPermissions = useGetUserCasesPermissions()?.read; - - // build a list of tabs to exclude - const tabsToExclude = new Set<string>([ - ...(!hasCasesReadPermissions ? [SecurityPageName.case] : []), - ]); - - // include the tab if it is not in the set of excluded ones - const tabsToDisplay = pickBy((_, key) => !tabsToExclude.has(key), navTabs); - return usePrimaryNavigation({ query: urlState.query, filters: urlState.filters, - navTabs: tabsToDisplay, + navTabs, pageName, sourcerer: urlState.sourcerer, savedQuery: urlState.savedQuery, + tabName, timeline: urlState.timeline, timerange: urlState.timerange, }); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/types.ts b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/types.ts index f639b8a37f0da4..f2c68f881528d7 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/types.ts @@ -12,4 +12,4 @@ export type PrimaryNavigationItemsProps = Omit< 'pathName' | 'pageName' | 'tabName' > & { selectedTabId: string }; -export type PrimaryNavigationProps = Omit<TabNavigationProps, 'pathName' | 'tabName'>; +export type PrimaryNavigationProps = Omit<TabNavigationProps, 'pathName'>; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_navigation_items.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_navigation_items.tsx index 42ca7f4c65460e..e04ec7727a08f7 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_navigation_items.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_navigation_items.tsx @@ -5,62 +5,85 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback, useMemo } from 'react'; +import { EuiSideNavItemType } from '@elastic/eui/src/components/side_nav/side_nav_types'; +import { navTabGroups } from '../../../../app/home/home_navigations'; import { APP_ID } from '../../../../../common/constants'; -import { track, METRIC_TYPE, TELEMETRY_EVENT } from '../../../lib/telemetry'; import { getSearch } from '../helpers'; import { PrimaryNavigationItemsProps } from './types'; -import { useKibana } from '../../../lib/kibana'; +import { useGetUserCasesPermissions, useKibana } from '../../../lib/kibana'; +import { NavTab } from '../types'; export const usePrimaryNavigationItems = ({ - filters, navTabs, - query, - savedQuery, selectedTabId, - sourcerer, - timeline, - timerange, -}: PrimaryNavigationItemsProps) => { + ...urlStateProps +}: PrimaryNavigationItemsProps): Array<EuiSideNavItemType<{}>> => { const { navigateToApp, getUrlForApp } = useKibana().services.application; - const navItems = Object.values(navTabs).map((tab) => { - const { id, name, disabled } = tab; - const isSelected = selectedTabId === id; - const urlSearch = getSearch(tab, { - filters, - query, - savedQuery, - sourcerer, - timeline, - timerange, - }); + const getSideNav = useCallback( + (tab: NavTab) => { + const { id, name, disabled } = tab; + const isSelected = selectedTabId === id; + const urlSearch = getSearch(tab, urlStateProps); - const handleClick = (ev: React.MouseEvent) => { - ev.preventDefault(); - navigateToApp(`${APP_ID}:${id}`, { path: urlSearch }); - track(METRIC_TYPE.CLICK, `${TELEMETRY_EVENT.TAB_CLICKED}${id}`); - }; + const handleClick = (ev: React.MouseEvent) => { + ev.preventDefault(); + navigateToApp(APP_ID, { deepLinkId: id, path: urlSearch }); + }; - const appHref = getUrlForApp(`${APP_ID}:${id}`, { path: urlSearch }); + const appHref = getUrlForApp(APP_ID, { deepLinkId: id, path: urlSearch }); - return { - 'data-href': appHref, - 'data-test-subj': `navigation-${id}`, - disabled, - href: appHref, - id, - isSelected, - name, - onClick: handleClick, - }; - }); + return { + 'data-href': appHref, + 'data-test-subj': `navigation-${id}`, + disabled, + href: appHref, + id, + isSelected, + name, + onClick: handleClick, + }; + }, + [getUrlForApp, navigateToApp, selectedTabId, urlStateProps] + ); + + const navItemsToDisplay = usePrimaryNavigationItemsToDisplay(navTabs); + + return useMemo( + () => + navItemsToDisplay.map((item) => ({ + ...item, + items: item.items.map((t: NavTab) => getSideNav(t)), + })), + [getSideNav, navItemsToDisplay] + ); +}; + +function usePrimaryNavigationItemsToDisplay(navTabs: Record<string, NavTab>) { + const hasCasesReadPermissions = useGetUserCasesPermissions()?.read; return [ { - id: APP_ID, // TODO: When separating into sub-sections (detect, explore, investigate). Those names can also serve as the section id - items: navItems, + id: APP_ID, name: '', + items: [navTabs.overview], + }, + { + ...navTabGroups.detect, + items: [navTabs.alerts, navTabs.rules, navTabs.exceptions], + }, + { + ...navTabGroups.explore, + items: [navTabs.hosts, navTabs.network], + }, + { + ...navTabGroups.investigate, + items: hasCasesReadPermissions ? [navTabs.timelines, navTabs.case] : [navTabs.timelines], + }, + { + ...navTabGroups.manage, + items: [navTabs.endpoints, navTabs.trusted_apps, navTabs.event_filters], }, ]; -}; +} diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_primary_navigation.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_primary_navigation.tsx index 390f44b48b0b17..c1abcc1177c802 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_primary_navigation.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/use_security_solution_navigation/use_primary_navigation.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import { getOr } from 'lodash/fp'; import { useEffect, useState, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; @@ -24,17 +23,13 @@ export const usePrimaryNavigation = ({ pageName, savedQuery, sourcerer, + tabName, timeline, timerange, }: PrimaryNavigationProps): KibanaPageTemplateProps['solutionNav'] => { const mapLocationToTab = useCallback( - (): string => - getOr( - '', - 'id', - Object.values(navTabs).find((item) => pageName === item.id && item.pageId == null) - ), - [pageName, navTabs] + (): string => ((tabName && navTabs[tabName]) || navTabs[pageName])?.id ?? '', + [pageName, tabName, navTabs] ); const [selectedTabId, setSelectedTabId] = useState(mapLocationToTab()); @@ -50,11 +45,11 @@ export const usePrimaryNavigation = ({ }, [pageName, navTabs, mapLocationToTab, selectedTabId]); const navItems = usePrimaryNavigationItems({ - filters, navTabs, + selectedTabId, + filters, query, savedQuery, - selectedTabId, sourcerer, timeline, timerange, diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/constants.ts b/x-pack/plugins/security_solution/public/common/components/url_state/constants.ts index 6149300f68e363..6107b61638888e 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/constants.ts +++ b/x-pack/plugins/security_solution/public/common/components/url_state/constants.ts @@ -7,9 +7,9 @@ export enum CONSTANTS { appQuery = 'query', + alertsPage = 'alerts.page', caseDetails = 'case.details', casePage = 'case.page', - detectionsPage = 'detections.page', filters = 'filters', hostsDetails = 'hosts.details', hostsPage = 'hosts.page', @@ -27,7 +27,9 @@ export enum CONSTANTS { export type UrlStateType = | 'case' - | 'detections' + | 'alerts' + | 'rules' + | 'exceptions' | 'host' | 'network' | 'overview' diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/helpers.ts b/x-pack/plugins/security_solution/public/common/components/url_state/helpers.ts index a5fbaf9ebb76b7..8908b83fc9b561 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/components/url_state/helpers.ts @@ -92,8 +92,12 @@ export const getUrlType = (pageName: string): UrlStateType => { return 'host'; } else if (pageName === SecurityPageName.network) { return 'network'; - } else if (pageName === SecurityPageName.detections) { - return 'detections'; + } else if (pageName === SecurityPageName.alerts) { + return 'alerts'; + } else if (pageName === SecurityPageName.rules) { + return 'rules'; + } else if (pageName === SecurityPageName.exceptions) { + return 'exceptions'; } else if (pageName === SecurityPageName.timelines) { return 'timeline'; } else if (pageName === SecurityPageName.case) { diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/index.test.tsx index 2157b21179f15e..b40799895e8a2c 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/index.test.tsx @@ -170,7 +170,7 @@ describe('UrlStateContainer', () => { }); }); - describe('After Initialization, keep Relative Date up to date for global only on detections page', () => { + describe('After Initialization, keep Relative Date up to date for global only on alerts page', () => { test.each(testCases)( '%o', async (page, namespaceLower, namespaceUpper, examplePath, type, pageName, detailName) => { @@ -196,7 +196,7 @@ describe('UrlStateContainer', () => { }); wrapper.update(); - if (CONSTANTS.detectionsPage === page) { + if (CONSTANTS.alertsPage === page) { await waitFor(() => { expect(mockSetRelativeRangeDatePicker.mock.calls[3][0]).toEqual({ from: '2020-01-01T00:00:00.000Z', diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx index 8a7c6bcb4a9b52..9fc2e24221bcb2 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/initialize_redux_by_url.tsx @@ -45,7 +45,7 @@ export const dispatchSetInitialStateFromUrl = ( const sourcererState = decodeRisonUrlState<SourcererScopePatterns>(newUrlStateString); if (sourcererState != null) { const activeScopes: SourcererScopeName[] = Object.keys(sourcererState).filter( - (key) => !(key === SourcererScopeName.default && pageName === SecurityPageName.detections) + (key) => !(key === SourcererScopeName.default && pageName === SecurityPageName.alerts) ) as SourcererScopeName[]; activeScopes.forEach((scope) => dispatch( diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/types.ts b/x-pack/plugins/security_solution/public/common/components/url_state/types.ts index 1a8d512d211e68..63511c54d28dbb 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/url_state/types.ts @@ -34,7 +34,23 @@ export const ALL_URL_STATE_KEYS: KeyUrlState[] = [ ]; export const URL_STATE_KEYS: Record<UrlStateType, KeyUrlState[]> = { - detections: [ + alerts: [ + CONSTANTS.appQuery, + CONSTANTS.filters, + CONSTANTS.savedQuery, + CONSTANTS.sourcerer, + CONSTANTS.timerange, + CONSTANTS.timeline, + ], + rules: [ + CONSTANTS.appQuery, + CONSTANTS.filters, + CONSTANTS.savedQuery, + CONSTANTS.sourcerer, + CONSTANTS.timerange, + CONSTANTS.timeline, + ], + exceptions: [ CONSTANTS.appQuery, CONSTANTS.filters, CONSTANTS.savedQuery, @@ -88,7 +104,7 @@ export const URL_STATE_KEYS: Record<UrlStateType, KeyUrlState[]> = { export type LocationTypes = | CONSTANTS.caseDetails | CONSTANTS.casePage - | CONSTANTS.detectionsPage + | CONSTANTS.alertsPage | CONSTANTS.hostsDetails | CONSTANTS.hostsPage | CONSTANTS.networkDetails diff --git a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx index 7785fa6af2569a..10d586c2d74419 100644 --- a/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx +++ b/x-pack/plugins/security_solution/public/common/components/url_state/use_url_state.tsx @@ -221,7 +221,7 @@ export const useUrlStateHooks = ({ } }); } else if (pathName !== prevProps.pathName) { - handleInitialize(type, pageName === SecurityPageName.detections); + handleInitialize(type, pageName === SecurityPageName.alerts); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isInitializing, history, pathName, pageName, prevProps, urlState]); diff --git a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx index 3bc92dafd351fd..f619e6565b06b3 100644 --- a/x-pack/plugins/security_solution/public/common/containers/source/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/source/index.tsx @@ -158,8 +158,10 @@ export const useFetchIndex = ( next: (response) => { if (isCompleteResponse(response)) { const stringifyIndices = response.indicesExist.sort().join(); + previousIndexesName.current = response.indicesExist; setLoading(false); + setState({ browserFields: getBrowserFields(stringifyIndices, response.indexFields), docValueFields: getDocValueFields(stringifyIndices, response.indexFields), @@ -167,6 +169,7 @@ export const useFetchIndex = ( indexExists: response.indicesExist.length > 0, indexPatterns: getIndexFields(stringifyIndices, response.indexFields), }); + searchSubscription$.current.unsubscribe(); } else if (isErrorResponse(response)) { setLoading(false); @@ -187,7 +190,7 @@ export const useFetchIndex = ( abortCtrl.current.abort(); asyncSearch(); }, - [data.search, addError, addWarning, onlyCheckIfIndicesExist] + [data.search, addError, addWarning, onlyCheckIfIndicesExist, setLoading, setState] ); useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/common/hooks/endpoint/use_navigate_to_app_event_handler.ts b/x-pack/plugins/security_solution/public/common/hooks/endpoint/use_navigate_to_app_event_handler.ts index 862bb43a08d389..148deda9aec761 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/endpoint/use_navigate_to_app_event_handler.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/endpoint/use_navigate_to_app_event_handler.ts @@ -37,7 +37,7 @@ export const useNavigateToAppEventHandler = <S = unknown>( options?: NavigateToAppHandlerOptions<S> ): EventHandlerCallback => { const { services } = useKibana(); - const { path, state, onClick } = options || {}; + const { path, state, onClick, deepLinkId } = options || {}; return useCallback( (ev) => { try { @@ -70,8 +70,8 @@ export const useNavigateToAppEventHandler = <S = unknown>( } ev.preventDefault(); - services.application.navigateToApp(appId, { path, state }); + services.application.navigateToApp(appId, { deepLinkId, path, state }); }, - [appId, onClick, path, services.application, state] + [appId, deepLinkId, onClick, path, services.application, state] ); }; diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts index 09c3d2537e2726..61ce5a8238b52f 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/__mocks__/index.ts @@ -17,6 +17,8 @@ import { createStartServicesMock, createWithKibanaMock, } from '../kibana_react.mock'; +import { APP_ID } from '../../../../../common/constants'; + const mockStartServicesMock = createStartServicesMock(); export const KibanaServices = { get: jest.fn(), getKibanaVersion: jest.fn(() => '8.0.0') }; export const useKibana = jest.fn().mockReturnValue({ @@ -60,3 +62,10 @@ export const useCurrentUser = jest.fn(); export const withKibana = jest.fn(createWithKibanaMock()); export const KibanaContextProvider = jest.fn(createKibanaContextProviderMock()); export const useGetUserCasesPermissions = jest.fn(); +export const useAppUrl = jest.fn().mockReturnValue({ + getAppUrl: jest + .fn() + .mockImplementation(({ appId = APP_ID, ...options }) => + mockStartServicesMock.application.getUrlForApp(appId, options) + ), +}); diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts index 4a2caefba1b973..1b05c6a857263c 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import { camelCase, isArray, isObject } from 'lodash'; import { set } from '@elastic/safer-lodash-set'; -import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../../common/constants'; +import { APP_ID, DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../../common/constants'; import { errorToToaster, useStateToaster } from '../../components/toasters'; import { AuthenticatedUser } from '../../../../../security/common/model'; import { StartServices } from '../../../types'; @@ -160,3 +160,57 @@ export const useGetUserCasesPermissions = () => { return casesPermissions; }; + +/** + * Returns a full URL to the provided page path by using + * kibana's `getUrlForApp()` + */ +export const useAppUrl = () => { + const { getUrlForApp } = useKibana().services.application; + + const getAppUrl = useCallback( + ({ appId = APP_ID, ...options }: { appId?: string; deepLinkId?: string; path?: string }) => + getUrlForApp(appId, options), + [getUrlForApp] + ); + return { getAppUrl }; +}; + +/** + * Navigate to any app using kibana's `navigateToApp()` + * or by url using `navigateToUrl()` + */ +export const useNavigateTo = () => { + const { navigateToApp, navigateToUrl } = useKibana().services.application; + + const navigateTo = useCallback( + ({ + url, + appId = APP_ID, + ...options + }: { + url?: string; + appId?: string; + deepLinkId?: string; + path?: string; + }) => { + if (url) { + navigateToUrl(url); + } else { + navigateToApp(appId, options); + } + }, + [navigateToApp, navigateToUrl] + ); + return { navigateTo }; +}; + +/** + * Returns navigateTo and getAppUrl navigation hooks + * + */ +export const useNavigation = () => { + const { navigateTo } = useNavigateTo(); + const { getAppUrl } = useAppUrl(); + return { navigateTo, getAppUrl }; +}; diff --git a/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx b/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx index 3e582ee9b20c8e..44a100e27e95b0 100644 --- a/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx +++ b/x-pack/plugins/security_solution/public/common/mock/endpoint/app_context_render.tsx @@ -6,9 +6,10 @@ */ import React from 'react'; -import { createMemoryHistory } from 'history'; +import { createMemoryHistory, MemoryHistory } from 'history'; import { render as reactRender, RenderOptions, RenderResult } from '@testing-library/react'; import { Action, Reducer, Store } from 'redux'; +import { AppDeepLink } from 'kibana/public'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { StartPlugins, StartServices } from '../../../types'; import { depsStartMock } from './dependencies_start_mock'; @@ -21,10 +22,10 @@ import { createStartServicesMock } from '../../lib/kibana/kibana_react.mock'; import { SUB_PLUGINS_REDUCER, mockGlobalState, createSecuritySolutionStorageMock } from '..'; import { ExperimentalFeatures } from '../../../../common/experimental_features'; import { PLUGIN_ID } from '../../../../../fleet/common'; -import { APP_ID } from '../../../../common/constants'; +import { APP_ID, APP_PATH } from '../../../../common/constants'; import { KibanaContextProvider, KibanaServices } from '../../lib/kibana'; -import { MANAGEMENT_APP_ID } from '../../../management/common/constants'; import { fleetGetPackageListHttpMock } from '../../../management/pages/endpoint_hosts/mocks'; +import { getDeepLinks } from '../../../app/deep_links'; type UiRender = (ui: React.ReactElement, options?: RenderOptions) => RenderResult; @@ -93,7 +94,7 @@ const experimentalFeaturesReducer: Reducer<State['app'], UpdateExperimentalFeatu */ export const createAppRootMockRenderer = (): AppContextTestRender => { const history = createMemoryHistory<never>(); - const coreStart = createCoreStartMock(); + const coreStart = createCoreStartMock(history); const depsStart = depsStartMock(); const middlewareSpy = createSpyMiddleware(); const { storage } = createSecuritySolutionStorageMock(); @@ -166,26 +167,56 @@ export const createAppRootMockRenderer = (): AppContextTestRender => { }; }; -const createCoreStartMock = (): ReturnType<typeof coreMock.createStart> => { +const createCoreStartMock = ( + history: MemoryHistory<never> +): ReturnType<typeof coreMock.createStart> => { const coreStart = coreMock.createStart({ basePath: '/mock' }); + const deepLinkPaths = getDeepLinkPaths(getDeepLinks()); + // Mock the certain APP Ids returned by `application.getUrlForApp()` - coreStart.application.getUrlForApp.mockImplementation((appId) => { + coreStart.application.getUrlForApp.mockImplementation((appId, { deepLinkId, path } = {}) => { switch (appId) { case PLUGIN_ID: return '/app/fleet'; case APP_ID: - return '/app/security'; - case MANAGEMENT_APP_ID: - return '/app/security/administration'; + return `${APP_PATH}${ + deepLinkId && deepLinkPaths[deepLinkId] ? deepLinkPaths[deepLinkId] : '' + }${path ?? ''}`; default: return `${appId} not mocked!`; } }); + coreStart.application.navigateToApp.mockImplementation((appId, { deepLinkId, path } = {}) => { + if (appId === APP_ID) { + history.push( + `${deepLinkId && deepLinkPaths[deepLinkId] ? deepLinkPaths[deepLinkId] : ''}${path ?? ''}` + ); + } + return Promise.resolve(); + }); + + coreStart.application.navigateToUrl.mockImplementation((url) => { + history.push(url.replace(APP_PATH, '')); + return Promise.resolve(); + }); + return coreStart; }; +const getDeepLinkPaths = (deepLinks: AppDeepLink[]): Record<string, string> => { + return deepLinks.reduce((result: Record<string, string>, deepLink) => { + if (deepLink.path) { + result[deepLink.id] = deepLink.path; + } + if (deepLink.deepLinks) { + return { ...result, ...getDeepLinkPaths(deepLink.deepLinks) }; + } + return result; + }, {}); +}; + const applyDefaultCoreHttpMocks = (http: AppContextTestRender['coreStart']['http']) => { // Need to mock getting the endpoint package from the fleet API because it is used as soon // as the store middleware for Endpoint list is initialized, thus mocking it here would avoid diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx index 19d1e9c2191912..31d1ce6d411536 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx @@ -12,6 +12,8 @@ import { shallow, mount } from 'enzyme'; import '../../../common/mock/match_media'; import { esQuery } from '../../../../../../../src/plugins/data/public'; import { TestProviders } from '../../../common/mock'; +import { SecurityPageName } from '../../../app/types'; + import { AlertsHistogramPanel, buildCombinedQueries, parseCombinedQueries } from './index'; import * as helpers from './helpers'; @@ -83,7 +85,10 @@ describe('AlertsHistogramPanel', () => { preventDefault: jest.fn(), }); - expect(mockNavigateToApp).toBeCalledWith('securitySolution:detections', { path: '' }); + expect(mockNavigateToApp).toBeCalledWith('securitySolution', { + deepLinkId: SecurityPageName.alerts, + path: '', + }); }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx index d766104e356ebb..8a328c14726c93 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx @@ -152,7 +152,7 @@ export const AlertsHistogramPanel = memo<AlertsHistogramPanelProps>( }); const kibana = useKibana(); const { navigateToApp } = kibana.services.application; - const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.detections); + const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.alerts); const totalAlerts = useMemo( () => @@ -175,7 +175,8 @@ export const AlertsHistogramPanel = memo<AlertsHistogramPanelProps>( const goToDetectionEngine = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.alerts, path: getDetectionEngineUrl(urlSearch), }); }, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx index cbdfe5b246affb..880817af856f8f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx @@ -27,6 +27,7 @@ jest.mock('react-router-dom', () => { }); jest.mock('../../../../common/components/link_to'); +jest.mock('../../../../common/lib/kibana'); jest.mock('../../../containers/detection_engine/rules/api', () => ({ getPrePackagedRulesStatus: jest.fn().mockResolvedValue({ @@ -52,11 +53,14 @@ describe('PrePackagedRulesPrompt', () => { let appToastsMock: jest.Mocked<ReturnType<typeof useAppToastsMock.create>>; beforeEach(() => { - jest.resetAllMocks(); appToastsMock = useAppToastsMock.create(); (useAppToasts as jest.Mock).mockReturnValue(appToastsMock); }); + afterEach(() => { + jest.clearAllMocks(); + }); + it('renders correctly', () => { const wrapper = shallow(<PrePackagedRulesPrompt {...props} />); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx index 56875bcc4f88c8..5688b4065ab764 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx @@ -9,7 +9,6 @@ import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { memo, useCallback, useMemo } from 'react'; import styled from 'styled-components'; -import { useHistory } from 'react-router-dom'; import { getCreateRuleUrl } from '../../../../common/components/link_to/redirect_to_detection_engine'; import * as i18n from './translations'; import { LinkButton } from '../../../../common/components/links'; @@ -17,6 +16,8 @@ import { SecurityPageName } from '../../../../app/types'; import { useFormatUrl } from '../../../../common/components/link_to'; import { usePrePackagedRules } from '../../../containers/detection_engine/rules'; import { useUserData } from '../../user_info'; +import { APP_ID } from '../../../../../common/constants'; +import { useKibana } from '../../../../common/lib/kibana'; const EmptyPrompt = styled(EuiEmptyPrompt)` align-self: center; /* Corrects horizontal centering in IE11 */ @@ -35,18 +36,18 @@ const PrePackagedRulesPromptComponent: React.FC<PrePackagedRulesPromptProps> = ( loading = false, userHasPermissions = false, }) => { - const history = useHistory(); const handlePreBuiltCreation = useCallback(() => { createPrePackagedRules(); }, [createPrePackagedRules]); - const { formatUrl } = useFormatUrl(SecurityPageName.detections); + const { formatUrl } = useFormatUrl(SecurityPageName.rules); + const { navigateToApp } = useKibana().services.application; const goToCreateRule = useCallback( (ev) => { ev.preventDefault(); - history.push(getCreateRuleUrl()); + navigateToApp(APP_ID, { deepLinkId: SecurityPageName.rules, path: getCreateRuleUrl() }); }, - [history] + [navigateToApp] ); const [ diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.test.tsx index 3a27469ba25397..c545de7fd8d7d4 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.test.tsx @@ -16,6 +16,20 @@ import { import { RuleActionsOverflow } from './index'; import { mockRule } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; +jest.mock('../../../../common/lib/kibana', () => { + const actual = jest.requireActual('../../../../common/lib/kibana'); + return { + ...actual, + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + navigateToApp: jest.fn(), + }, + }, + }), + }; +}); + jest.mock('react-router-dom', () => ({ useHistory: () => ({ push: jest.fn(), @@ -28,21 +42,14 @@ jest.mock('../../../pages/detection_engine/rules/all/actions', () => ({ editRuleAction: jest.fn(), })); -jest.mock('../../../../common/lib/kibana', () => { - return { - KibanaServices: { - get: () => ({ - http: { fetch: jest.fn() }, - }), - }, - }; -}); - const duplicateRulesActionMock = duplicateRulesAction as jest.Mock; const flushPromises = () => new Promise(setImmediate); describe('RuleActionsOverflow', () => { afterEach(() => { + jest.clearAllMocks(); + }); + afterAll(() => { jest.resetAllMocks(); }); @@ -229,7 +236,7 @@ describe('RuleActionsOverflow', () => { await flushPromises(); expect(duplicateRulesAction).toHaveBeenCalled(); - expect(editRuleAction).toHaveBeenCalledWith(ruleDuplicate, expect.anything()); + expect(editRuleAction).toHaveBeenCalledWith(ruleDuplicate.id, expect.anything()); }); describe('rules details export rule', () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx index e0841824d512f1..2146123deafd58 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_actions_overflow/index.tsx @@ -30,6 +30,7 @@ import { import { getRulesUrl } from '../../../../common/components/link_to/redirect_to_detection_engine'; import { getToolTipContent } from '../../../../common/utils/privileges'; import { useBoolState } from '../../../../common/hooks/use_bool_state'; +import { useKibana } from '../../../../common/lib/kibana'; const MyEuiButtonIcon = styled(EuiButtonIcon)` &.euiButtonIcon { @@ -58,6 +59,7 @@ const RuleActionsOverflowComponent = ({ }: RuleActionsOverflowComponentProps) => { const [isPopoverOpen, , closePopover, togglePopover] = useBoolState(); const history = useHistory(); + const { navigateToApp } = useKibana().services.application; const [, dispatchToaster] = useStateToaster(); const onRuleDeletedCallback = useCallback(() => { @@ -82,7 +84,7 @@ const RuleActionsOverflowComponent = ({ dispatchToaster ); if (createdRules?.length) { - editRuleAction(createdRules[0], history); + editRuleAction(createdRules[0].id, navigateToApp); } }} > @@ -123,7 +125,7 @@ const RuleActionsOverflowComponent = ({ canDuplicateRuleWithActions, closePopover, dispatchToaster, - history, + navigateToApp, onRuleDeletedCallback, rule, userHasPermissions, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx index 162f86c543308e..6e21987db1668b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx @@ -302,7 +302,6 @@ const StepDefineRuleComponent: FC<StepDefineRuleProps> = ({ ), [threatBrowserFields, threatIndexPatternsLoading, threatIndexPatterns, indexPatterns] ); - return isReadOnlyView ? ( <StepContentWrapper data-test-subj="definitionRule" addPadding={addPadding}> <StepRuleDescription @@ -343,7 +342,6 @@ const StepDefineRuleComponent: FC<StepDefineRuleProps> = ({ 'data-test-subj': 'detectionEngineStepDefineRuleIndices', euiFieldProps: { fullWidth: true, - isDisabled: isLoading, placeholder: '', }, }} diff --git a/x-pack/plugins/security_solution/public/detections/index.ts b/x-pack/plugins/security_solution/public/detections/index.ts index b6b26fde73edbc..ca35efe4d92941 100644 --- a/x-pack/plugins/security_solution/public/detections/index.ts +++ b/x-pack/plugins/security_solution/public/detections/index.ts @@ -8,10 +8,10 @@ import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { getTimelinesInStorageByIds } from '../timelines/containers/local_storage'; import { TimelineIdLiteral, TimelineId } from '../../common/types/timeline'; -import { AlertsRoutes } from './routes'; +import { routes } from './routes'; import { SecuritySubPlugin } from '../app/types'; -const DETECTIONS_TIMELINE_IDS: TimelineIdLiteral[] = [ +export const DETECTIONS_TIMELINE_IDS: TimelineIdLiteral[] = [ TimelineId.detectionsRulesDetailsPage, TimelineId.detectionsPage, ]; @@ -21,10 +21,10 @@ export class Detections { public start(storage: Storage): SecuritySubPlugin { return { - SubPluginRoutes: AlertsRoutes, storageTimelines: { timelineById: getTimelinesInStorageByIds(storage, DETECTIONS_TIMELINE_IDS), }, + routes, }; } } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx index 0c12d8256d66d2..f52b09e2d62b45 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx @@ -10,10 +10,8 @@ import styled from 'styled-components'; import { noop } from 'lodash/fp'; import React, { useCallback, useMemo, useRef, useState } from 'react'; import { useDispatch } from 'react-redux'; -import { useHistory } from 'react-router-dom'; -import { isTab } from '../../../../../timelines/public'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; - +import { isTab } from '../../../../../timelines/public'; import { useDeepEqualSelector, useShallowEqualSelector } from '../../../common/hooks/use_selector'; import { SecurityPageName } from '../../../app/types'; import { TimelineId } from '../../../../common/types/timeline'; @@ -25,7 +23,6 @@ import { SiemSearchBar } from '../../../common/components/search_bar'; import { SecuritySolutionPageWrapper } from '../../../common/components/page_wrapper'; import { inputsSelectors } from '../../../common/store/inputs'; import { setAbsoluteRangeDatePicker } from '../../../common/store/inputs/actions'; -import { SpyRoute } from '../../../common/utils/route/spy_routes'; import { useAlertInfo } from '../../components/alerts_info'; import { AlertsTable } from '../../components/alerts_table'; import { NoApiIntegrationKeyCallOut } from '../../components/callouts/no_api_integration_callout'; @@ -59,6 +56,7 @@ import { useSourcererScope } from '../../../common/containers/sourcerer'; import { SourcererScopeName } from '../../../common/store/sourcerer/model'; import { NeedAdminForUpdateRulesCallOut } from '../../components/callouts/need_admin_for_update_callout'; import { MissingPrivilegesCallOut } from '../../components/callouts/missing_privileges_callout'; +import { useKibana } from '../../../common/lib/kibana'; /** * Need a 100% height here to account for the graph/analyze tool, which sets no explicit height parameters, but fills the available space. @@ -103,12 +101,12 @@ const DetectionEnginePageComponent = () => { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration, } = useListsConfig(); - const history = useHistory(); const [lastAlerts] = useAlertInfo({}); - const { formatUrl } = useFormatUrl(SecurityPageName.detections); + const { formatUrl } = useFormatUrl(SecurityPageName.rules); const [showBuildingBlockAlerts, setShowBuildingBlockAlerts] = useState(false); const [showOnlyThreatIndicatorAlerts, setShowOnlyThreatIndicatorAlerts] = useState(false); const loading = userInfoLoading || listsConfigLoading; + const { navigateToUrl } = useKibana().services.application; const updateDateRangeCallback = useCallback<UpdateDateRange>( ({ x }) => { @@ -130,9 +128,9 @@ const DetectionEnginePageComponent = () => { const goToRules = useCallback( (ev) => { ev.preventDefault(); - history.push(getRulesUrl()); + navigateToUrl(formatUrl(getRulesUrl())); }, - [history] + [formatUrl, navigateToUrl] ); const alertsHistogramDefaultFilters = useMemo( @@ -288,7 +286,6 @@ const DetectionEnginePageComponent = () => { <OverviewEmpty /> </SecuritySolutionPageWrapper> )} - <SpyRoute pageName={SecurityPageName.detections} /> </> ); }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.test.tsx deleted file mode 100644 index 57e23452806b6b..00000000000000 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.test.tsx +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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 { shallow } from 'enzyme'; - -import '../../../common/mock/match_media'; -import { DetectionEngineContainer } from './index'; - -describe('DetectionEngineContainer', () => { - it('renders correctly', () => { - const wrapper = shallow(<DetectionEngineContainer />); - - expect(wrapper.find('Switch')).toHaveLength(1); - }); -}); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.tsx deleted file mode 100644 index 2a3d418f9c3d3f..00000000000000 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/index.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 { Route, Switch } from 'react-router-dom'; - -import { CreateRulePage } from './rules/create'; -import { DetectionEnginePage } from './detection_engine'; -import { EditRulePage } from './rules/edit'; -import { RuleDetailsPage } from './rules/details'; -import { RulesPage } from './rules'; - -const DetectionEngineContainerComponent: React.FC = () => ( - <Switch> - <Route path="/rules/id/:detailName/edit"> - <EditRulePage /> - </Route> - <Route path="/rules/id/:detailName"> - <RuleDetailsPage /> - </Route> - <Route path="/rules/create"> - <CreateRulePage /> - </Route> - <Route path="/rules"> - <RulesPage /> - </Route> - <Route exact path="" strict> - <DetectionEnginePage /> - </Route> - </Switch> -); - -export const DetectionEngineContainer = React.memo(DetectionEngineContainerComponent); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.tsx index 78fac10815d455..214a7ac24da8a6 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/actions.tsx @@ -5,10 +5,12 @@ * 2.0. */ -import * as H from 'history'; import React, { Dispatch } from 'react'; +import { NavigateToAppOptions } from '../../../../../../../../../src/core/public'; +import { APP_ID } from '../../../../../../common/constants'; import { BulkAction } from '../../../../../../common/detection_engine/schemas/common/schemas'; import { CreateRulesSchema } from '../../../../../../common/detection_engine/schemas/request'; +import { SecurityPageName } from '../../../../../app/types'; import { getEditRuleUrl } from '../../../../../common/components/link_to/redirect_to_detection_engine'; import { ActionToaster, @@ -31,8 +33,14 @@ import { transformOutput } from '../../../../containers/detection_engine/rules/t import * as i18n from '../translations'; import { bucketRulesResponse, getExportedRulesCount } from './helpers'; -export const editRuleAction = (rule: Rule, history: H.History) => { - history.push(getEditRuleUrl(rule.id)); +export const editRuleAction = ( + ruleId: string, + navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise<void> +) => { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getEditRuleUrl(ruleId ?? ''), + }); }; export const duplicateRulesAction = async ( diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx index 8eb80bd0d51352..3920aa40e1f15c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx @@ -39,26 +39,31 @@ describe('AllRulesTable Columns', () => { test('duplicate rule onClick should call rule edit after the rule is duplicated', async () => { const ruleDuplicate = mockRule('newRule'); + const navigateToApp = jest.fn(); duplicateRulesActionMock.mockImplementation(() => Promise.resolve([ruleDuplicate])); const duplicateRulesActionObject = getActions( dispatch, dispatchToaster, history, + navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, true )[1]; await duplicateRulesActionObject.onClick(rule); expect(duplicateRulesActionMock).toHaveBeenCalled(); - expect(editRuleActionMock).toHaveBeenCalledWith(ruleDuplicate, history); + expect(editRuleActionMock).toHaveBeenCalledWith(ruleDuplicate.id, navigateToApp); }); test('delete rule onClick should call refetch after the rule is deleted', async () => { + const navigateToApp = jest.fn(); + const deleteRulesActionObject = getActions( dispatch, dispatchToaster, history, + navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, true diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx index 28a65c3e64e1f8..8d0492267258fd 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx @@ -40,11 +40,14 @@ import { LinkAnchor } from '../../../../../common/components/links'; import { getToolTipContent, canEditRuleWithActions } from '../../../../../common/utils/privileges'; import { TagsDisplay } from './tag_display'; import { getRuleStatusText } from '../../../../../../common/detection_engine/utils'; +import { APP_ID, SecurityPageName } from '../../../../../../common/constants'; +import { NavigateToAppOptions } from '../../../../../../../../../src/core/public'; export const getActions = ( dispatch: React.Dispatch<RulesTableAction>, dispatchToaster: Dispatch<ActionToaster>, history: H.History, + navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise<void>, reFetchRules: () => Promise<void>, refetchPrePackagedRulesStatus: () => Promise<void>, actionsPrivileges: @@ -64,7 +67,7 @@ export const getActions = ( i18n.EDIT_RULE_SETTINGS ), icon: 'controlsHorizontal', - onClick: (rowItem: Rule) => editRuleAction(rowItem, history), + onClick: (rowItem: Rule) => editRuleAction(rowItem.id, navigateToApp), enabled: (rowItem: Rule) => canEditRuleWithActions(rowItem, actionsPrivileges), }, { @@ -87,7 +90,7 @@ export const getActions = ( dispatchToaster ); if (createdRules?.length) { - editRuleAction(createdRules[0], history); + editRuleAction(createdRules[0].id, navigateToApp); } }, }, @@ -127,6 +130,7 @@ interface GetColumns { hasMlPermissions: boolean; hasPermissions: boolean; loadingRuleIds: string[]; + navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise<void>; reFetchRules: () => Promise<void>; refetchPrePackagedRulesStatus: () => Promise<void>; hasReadActionsPrivileges: @@ -144,6 +148,7 @@ export const getColumns = ({ hasMlPermissions, hasPermissions, loadingRuleIds, + navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, hasReadActionsPrivileges, @@ -157,7 +162,10 @@ export const getColumns = ({ data-test-subj="ruleName" onClick={(ev: { preventDefault: () => void }) => { ev.preventDefault(); - history.push(getRuleDetailsUrl(item.id)); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getRuleDetailsUrl(item.id), + }); }} href={formatUrl(getRuleDetailsUrl(item.id))} > @@ -292,6 +300,7 @@ export const getColumns = ({ dispatch, dispatchToaster, history, + navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, hasReadActionsPrivileges diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/columns.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/columns.tsx index f64586db9b06c8..c4c938d5bb05ec 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/columns.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/columns.tsx @@ -9,7 +9,6 @@ import React from 'react'; import { EuiButtonIcon, EuiBasicTableColumn, EuiToolTip } from '@elastic/eui'; -import { History } from 'history'; import type { NamespaceType } from '@kbn/securitysolution-io-ts-list-types'; import { Spacer } from '../../../../../../common/components/page'; @@ -24,8 +23,8 @@ export type AllExceptionListsColumns = EuiBasicTableColumn<ExceptionListInfo>; export const getAllExceptionListsColumns = ( onExport: (arg: { id: string; listId: string; namespaceType: NamespaceType }) => () => void, onDelete: (arg: { id: string; listId: string; namespaceType: NamespaceType }) => () => void, - history: History, - formatUrl: FormatUrl + formatUrl: FormatUrl, + navigateToUrl: (url: string) => Promise<void> ): AllExceptionListsColumns[] => [ { align: 'left', @@ -81,7 +80,7 @@ export const getAllExceptionListsColumns = ( data-test-subj="ruleName" onClick={(ev: { preventDefault: () => void }) => { ev.preventDefault(); - history.push(getRuleDetailsUrl(id)); + navigateToUrl(formatUrl(getRuleDetailsUrl(id))); }} href={formatUrl(getRuleDetailsUrl(id))} > diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_search_bar.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_search_bar.tsx index 9c2b427948fd8f..d86e7b1b7259cd 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_search_bar.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_search_bar.tsx @@ -42,6 +42,7 @@ export const ExceptionsSearchBar = React.memo<ExceptionListsTableSearchProps>(({ aria-label={i18n.EXCEPTIONS_LISTS_SEARCH_PLACEHOLDER} onChange={onSearch} box={{ + [`data-test-subj`]: 'exceptionsHeaderSearchInput', placeholder: i18n.EXCEPTION_LIST_SEARCH_PLACEHOLDER, incremental: false, schema: EXCEPTIONS_SEARCH_SCHEMA, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.test.tsx index 8cc3113a5706a3..a3f1c8406b0554 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.test.tsx @@ -13,13 +13,20 @@ import { mockHistory } from '../../../../../../common/utils/route/index.test'; import { getExceptionListSchemaMock } from '../../../../../../../../lists/common/schemas/response/exception_list_schema.mock'; import { ExceptionListsTable } from './exceptions_table'; -import { useKibana } from '../../../../../../common/lib/kibana'; import { useApi, useExceptionLists } from '@kbn/securitysolution-list-hooks'; import { useAllExceptionLists } from './use_all_exception_lists'; +import { useHistory } from 'react-router-dom'; jest.mock('../../../../../../common/lib/kibana'); jest.mock('./use_all_exception_lists'); jest.mock('@kbn/securitysolution-list-hooks'); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + return { + ...originalModule, + useHistory: jest.fn(), + }; +}); jest.mock('@kbn/i18n/react', () => { const originalModule = jest.requireActual('@kbn/i18n/react'); const FormattedRelative = jest.fn().mockImplementation(() => '20 hours ago'); @@ -29,25 +36,29 @@ jest.mock('@kbn/i18n/react', () => { FormattedRelative, }; }); + +jest.mock('../../../../../containers/detection_engine/lists/use_lists_config', () => ({ + useListsConfig: jest.fn().mockReturnValue({ loading: false }), +})); + +jest.mock('../../../../../components/user_info', () => ({ + useUserData: jest.fn().mockReturnValue([ + { + loading: false, + canUserCRUD: false, + }, + ]), +})); + describe('ExceptionListsTable', () => { const exceptionList1 = getExceptionListSchemaMock(); const exceptionList2 = { ...getExceptionListSchemaMock(), list_id: 'not_endpoint_list', id: '2' }; - beforeEach(() => { - (useKibana as jest.Mock).mockReturnValue({ - services: { - http: {}, - notifications: { - toasts: { - addError: jest.fn(), - }, - }, - timelines: { - getLastUpdated: () => null, - }, - }, - }); + beforeAll(() => { + (useHistory as jest.Mock).mockReturnValue(mockHistory); + }); + beforeEach(() => { (useApi as jest.Mock).mockReturnValue({ deleteExceptionList: jest.fn(), exportExceptionList: jest.fn(), @@ -80,15 +91,9 @@ describe('ExceptionListsTable', () => { it('renders delete option disabled if list is "endpoint_list"', async () => { const wrapper = mount( <TestProviders> - <ExceptionListsTable - history={mockHistory} - hasPermissions - loading={false} - formatUrl={jest.fn()} - /> + <ExceptionListsTable /> </TestProviders> ); - expect(wrapper.find('[data-test-subj="exceptionsTableListId"]').at(0).text()).toEqual( 'endpoint_list' ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.tsx index f38bde4839f18b..b4f5efe2348bb6 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/exceptions/exceptions_table.tsx @@ -12,18 +12,19 @@ import { EuiLoadingContent, EuiProgress, EuiSearchBarProps, + EuiSpacer, } from '@elastic/eui'; -import { History } from 'history'; import type { NamespaceType, ExceptionListFilter } from '@kbn/securitysolution-io-ts-list-types'; import { useApi, useExceptionLists } from '@kbn/securitysolution-list-hooks'; import { useAppToasts } from '../../../../../../common/hooks/use_app_toasts'; import { AutoDownload } from '../../../../../../common/components/auto_download/auto_download'; import { useKibana } from '../../../../../../common/lib/kibana'; -import { FormatUrl } from '../../../../../../common/components/link_to'; -import { HeaderSection } from '../../../../../../common/components/header_section'; +import { useFormatUrl } from '../../../../../../common/components/link_to'; import { Loader } from '../../../../../../common/components/loader'; import { Panel } from '../../../../../../common/components/panel'; +import { DetectionEngineHeaderPage } from '../../../../../components/detection_engine_header_page'; + import * as i18n from './translations'; import { AllRulesUtilityBar } from '../utility_bar'; import { AllExceptionListsColumns, getAllExceptionListsColumns } from './columns'; @@ -32,16 +33,13 @@ import { ReferenceErrorModal } from '../../../../../components/value_lists_manag import { patchRule } from '../../../../../containers/detection_engine/rules/api'; import { ExceptionsSearchBar } from './exceptions_search_bar'; import { getSearchFilters } from '../helpers'; +import { SecurityPageName } from '../../../../../../../common/constants'; +import { useUserData } from '../../../../../components/user_info'; +import { userHasPermissions } from '../../helpers'; +import { useListsConfig } from '../../../../../containers/detection_engine/lists/use_lists_config'; export type Func = () => Promise<void>; -interface ExceptionListsTableProps { - history: History; - hasPermissions: boolean; - loading: boolean; - formatUrl: FormatUrl; -} - interface ReferenceModalState { contentText: string; rulesReferences: string[]; @@ -58,343 +56,346 @@ const exceptionReferenceModalInitialState: ReferenceModalState = { listNamespaceType: 'single', }; -export const ExceptionListsTable = React.memo<ExceptionListsTableProps>( - ({ formatUrl, history, hasPermissions, loading }) => { - const { - services: { http, notifications, timelines }, - } = useKibana(); - const { exportExceptionList, deleteExceptionList } = useApi(http); - - const [showReferenceErrorModal, setShowReferenceErrorModal] = useState(false); - const [referenceModalState, setReferenceModalState] = useState<ReferenceModalState>( - exceptionReferenceModalInitialState - ); - const [filters, setFilters] = useState<ExceptionListFilter | undefined>(undefined); - const [loadingExceptions, exceptions, pagination, refreshExceptions] = useExceptionLists({ - errorMessage: i18n.ERROR_EXCEPTION_LISTS, - filterOptions: filters, - http, - namespaceTypes: ['single', 'agnostic'], - notifications, - showTrustedApps: false, - showEventFilters: false, - }); - const [loadingTableInfo, exceptionListsWithRuleRefs, exceptionsListsRef] = useAllExceptionLists( - { - exceptionLists: exceptions ?? [], - } - ); - const [initLoading, setInitLoading] = useState(true); - const [lastUpdated, setLastUpdated] = useState(Date.now()); - const [deletingListIds, setDeletingListIds] = useState<string[]>([]); - const [exportingListIds, setExportingListIds] = useState<string[]>([]); - const [exportDownload, setExportDownload] = useState<{ name?: string; blob?: Blob }>({}); - const { addError } = useAppToasts(); - - const handleDeleteSuccess = useCallback( - (listId?: string) => () => { - notifications.toasts.addSuccess({ - title: i18n.exceptionDeleteSuccessMessage(listId ?? referenceModalState.listId), - }); - }, - [notifications.toasts, referenceModalState.listId] - ); +export const ExceptionListsTable = React.memo(() => { + const { formatUrl } = useFormatUrl(SecurityPageName.rules); + const [{ loading: userInfoLoading, canUserCRUD }] = useUserData(); + const hasPermissions = userHasPermissions(canUserCRUD); + + const { loading: listsConfigLoading } = useListsConfig(); + const loading = userInfoLoading || listsConfigLoading; + + const { + services: { http, notifications, timelines, application }, + } = useKibana(); + const { exportExceptionList, deleteExceptionList } = useApi(http); + + const [showReferenceErrorModal, setShowReferenceErrorModal] = useState(false); + const [referenceModalState, setReferenceModalState] = useState<ReferenceModalState>( + exceptionReferenceModalInitialState + ); + const [filters, setFilters] = useState<ExceptionListFilter | undefined>(undefined); + const [loadingExceptions, exceptions, pagination, refreshExceptions] = useExceptionLists({ + errorMessage: i18n.ERROR_EXCEPTION_LISTS, + filterOptions: filters, + http, + namespaceTypes: ['single', 'agnostic'], + notifications, + showTrustedApps: false, + showEventFilters: false, + }); + const [loadingTableInfo, exceptionListsWithRuleRefs, exceptionsListsRef] = useAllExceptionLists({ + exceptionLists: exceptions ?? [], + }); + const [initLoading, setInitLoading] = useState(true); + const [lastUpdated, setLastUpdated] = useState(Date.now()); + const [deletingListIds, setDeletingListIds] = useState<string[]>([]); + const [exportingListIds, setExportingListIds] = useState<string[]>([]); + const [exportDownload, setExportDownload] = useState<{ name?: string; blob?: Blob }>({}); + const { navigateToUrl } = application; + const { addError } = useAppToasts(); + + const handleDeleteSuccess = useCallback( + (listId?: string) => () => { + notifications.toasts.addSuccess({ + title: i18n.exceptionDeleteSuccessMessage(listId ?? referenceModalState.listId), + }); + }, + [notifications.toasts, referenceModalState.listId] + ); + + const handleDeleteError = useCallback( + (err: Error & { body?: { message: string } }): void => { + addError(err, { + title: i18n.EXCEPTION_DELETE_ERROR, + }); + }, + [addError] + ); + + const handleDelete = useCallback( + ({ + id, + listId, + namespaceType, + }: { + id: string; + listId: string; + namespaceType: NamespaceType; + }) => async () => { + try { + setDeletingListIds((ids) => [...ids, id]); + if (refreshExceptions != null) { + await refreshExceptions(); + } - const handleDeleteError = useCallback( - (err: Error & { body?: { message: string } }): void => { - addError(err, { - title: i18n.EXCEPTION_DELETE_ERROR, - }); - }, - [addError] - ); + if (exceptionsListsRef[id] != null && exceptionsListsRef[id].rules.length === 0) { + await deleteExceptionList({ + id, + namespaceType, + onError: handleDeleteError, + onSuccess: handleDeleteSuccess(listId), + }); - const handleDelete = useCallback( - ({ - id, - listId, - namespaceType, - }: { - id: string; - listId: string; - namespaceType: NamespaceType; - }) => async () => { - try { - setDeletingListIds((ids) => [...ids, id]); if (refreshExceptions != null) { - await refreshExceptions(); + refreshExceptions(); } - - if (exceptionsListsRef[id] != null && exceptionsListsRef[id].rules.length === 0) { - await deleteExceptionList({ - id, - namespaceType, - onError: handleDeleteError, - onSuccess: handleDeleteSuccess(listId), - }); - - if (refreshExceptions != null) { - refreshExceptions(); - } - } else { - setReferenceModalState({ - contentText: i18n.referenceErrorMessage(exceptionsListsRef[id].rules.length), - rulesReferences: exceptionsListsRef[id].rules.map(({ name }) => name), - isLoading: true, - listId: id, - listNamespaceType: namespaceType, - }); - setShowReferenceErrorModal(true); - } - // route to patch rules with associated exception list - } catch (error) { - handleDeleteError(error); - } finally { - setDeletingListIds((ids) => [...ids.filter((_id) => _id !== id)]); + } else { + setReferenceModalState({ + contentText: i18n.referenceErrorMessage(exceptionsListsRef[id].rules.length), + rulesReferences: exceptionsListsRef[id].rules.map(({ name }) => name), + isLoading: true, + listId: id, + listNamespaceType: namespaceType, + }); + setShowReferenceErrorModal(true); } - }, - [ - deleteExceptionList, - exceptionsListsRef, - handleDeleteError, - handleDeleteSuccess, - refreshExceptions, - ] - ); - - const handleExportSuccess = useCallback( - (listId: string) => (blob: Blob): void => { - setExportDownload({ name: listId, blob }); - }, - [] - ); - - const handleExportError = useCallback( - (err: Error) => { - addError(err, { title: i18n.EXCEPTION_EXPORT_ERROR }); - }, - [addError] - ); - - const handleExport = useCallback( - ({ + // route to patch rules with associated exception list + } catch (error) { + handleDeleteError(error); + } finally { + setDeletingListIds((ids) => [...ids.filter((_id) => _id !== id)]); + } + }, + [ + deleteExceptionList, + exceptionsListsRef, + handleDeleteError, + handleDeleteSuccess, + refreshExceptions, + ] + ); + + const handleExportSuccess = useCallback( + (listId: string) => (blob: Blob): void => { + setExportDownload({ name: listId, blob }); + }, + [] + ); + + const handleExportError = useCallback( + (err: Error) => { + addError(err, { title: i18n.EXCEPTION_EXPORT_ERROR }); + }, + [addError] + ); + + const handleExport = useCallback( + ({ + id, + listId, + namespaceType, + }: { + id: string; + listId: string; + namespaceType: NamespaceType; + }) => async () => { + setExportingListIds((ids) => [...ids, id]); + await exportExceptionList({ id, listId, namespaceType, - }: { - id: string; - listId: string; - namespaceType: NamespaceType; - }) => async () => { - setExportingListIds((ids) => [...ids, id]); - await exportExceptionList({ - id, - listId, - namespaceType, - onError: handleExportError, - onSuccess: handleExportSuccess(listId), - }); - }, - [exportExceptionList, handleExportError, handleExportSuccess] + onError: handleExportError, + onSuccess: handleExportSuccess(listId), + }); + }, + [exportExceptionList, handleExportError, handleExportSuccess] + ); + + const exceptionsColumns = useMemo((): AllExceptionListsColumns[] => { + return getAllExceptionListsColumns(handleExport, handleDelete, formatUrl, navigateToUrl); + }, [handleExport, handleDelete, formatUrl, navigateToUrl]); + + const handleRefresh = useCallback((): void => { + if (refreshExceptions != null) { + setLastUpdated(Date.now()); + refreshExceptions(); + } + }, [refreshExceptions]); + + useEffect(() => { + if (initLoading && !loading && !loadingExceptions && !loadingTableInfo) { + setInitLoading(false); + } + }, [initLoading, loading, loadingExceptions, loadingTableInfo]); + + const emptyPrompt = useMemo((): JSX.Element => { + return ( + <EuiEmptyPrompt + title={<h3>{i18n.NO_EXCEPTION_LISTS}</h3>} + titleSize="xs" + body={i18n.NO_LISTS_BODY} + /> ); - - const exceptionsColumns = useMemo((): AllExceptionListsColumns[] => { - return getAllExceptionListsColumns(handleExport, handleDelete, history, formatUrl); - }, [handleExport, handleDelete, history, formatUrl]); - - const handleRefresh = useCallback((): void => { - if (refreshExceptions != null) { - setLastUpdated(Date.now()); - refreshExceptions(); - } - }, [refreshExceptions]); - - useEffect(() => { - if (initLoading && !loading && !loadingExceptions && !loadingTableInfo) { - setInitLoading(false); - } - }, [initLoading, loading, loadingExceptions, loadingTableInfo]); - - const emptyPrompt = useMemo((): JSX.Element => { - return ( - <EuiEmptyPrompt - title={<h3>{i18n.NO_EXCEPTION_LISTS}</h3>} - titleSize="xs" - body={i18n.NO_LISTS_BODY} - /> - ); - }, []); - - const handleSearch = useCallback( - async ({ + }, []); + + const handleSearch = useCallback( + async ({ + query, + queryText, + }: Parameters<NonNullable<EuiSearchBarProps['onChange']>>[0]): Promise<void> => { + const filterOptions = { + name: null, + list_id: null, + created_by: null, + type: null, + tags: null, + }; + const searchTerms = getSearchFilters({ + defaultSearchTerm: 'name', + filterOptions, query, - queryText, - }: Parameters<NonNullable<EuiSearchBarProps['onChange']>>[0]): Promise<void> => { - const filterOptions = { - name: null, - list_id: null, - created_by: null, - type: null, - tags: null, - }; - const searchTerms = getSearchFilters({ - defaultSearchTerm: 'name', - filterOptions, - query, - searchValue: queryText, - }); - setFilters(searchTerms); - }, - [] - ); + searchValue: queryText, + }); + setFilters(searchTerms); + }, + [] + ); + + const handleCloseReferenceErrorModal = useCallback((): void => { + setDeletingListIds([]); + setShowReferenceErrorModal(false); + setReferenceModalState({ + contentText: '', + rulesReferences: [], + isLoading: false, + listId: '', + listNamespaceType: 'single', + }); + }, []); + + const handleReferenceDelete = useCallback(async (): Promise<void> => { + const exceptionListId = referenceModalState.listId; + const exceptionListNamespaceType = referenceModalState.listNamespaceType; + const relevantRules = exceptionsListsRef[exceptionListId].rules; + + try { + await Promise.all( + relevantRules.map((rule) => { + const abortCtrl = new AbortController(); + const exceptionLists = (rule.exceptions_list ?? []).filter( + ({ id }) => id !== exceptionListId + ); + + return patchRule({ + ruleProperties: { + rule_id: rule.rule_id, + exceptions_list: exceptionLists, + }, + signal: abortCtrl.signal, + }); + }) + ); - const handleCloseReferenceErrorModal = useCallback((): void => { + await deleteExceptionList({ + id: exceptionListId, + namespaceType: exceptionListNamespaceType, + onError: handleDeleteError, + onSuccess: handleDeleteSuccess(), + }); + } catch (err) { + handleDeleteError(err); + } finally { + setReferenceModalState(exceptionReferenceModalInitialState); setDeletingListIds([]); setShowReferenceErrorModal(false); - setReferenceModalState({ - contentText: '', - rulesReferences: [], - isLoading: false, - listId: '', - listNamespaceType: 'single', - }); - }, []); - - const handleReferenceDelete = useCallback(async (): Promise<void> => { - const exceptionListId = referenceModalState.listId; - const exceptionListNamespaceType = referenceModalState.listNamespaceType; - const relevantRules = exceptionsListsRef[exceptionListId].rules; - - try { - await Promise.all( - relevantRules.map((rule) => { - const abortCtrl = new AbortController(); - const exceptionLists = (rule.exceptions_list ?? []).filter( - ({ id }) => id !== exceptionListId - ); - - return patchRule({ - ruleProperties: { - rule_id: rule.rule_id, - exceptions_list: exceptionLists, - }, - signal: abortCtrl.signal, - }); - }) - ); - - await deleteExceptionList({ - id: exceptionListId, - namespaceType: exceptionListNamespaceType, - onError: handleDeleteError, - onSuccess: handleDeleteSuccess(), - }); - } catch (err) { - handleDeleteError(err); - } finally { - setReferenceModalState(exceptionReferenceModalInitialState); - setDeletingListIds([]); - setShowReferenceErrorModal(false); - if (refreshExceptions != null) { - refreshExceptions(); - } + if (refreshExceptions != null) { + refreshExceptions(); } - }, [ - referenceModalState.listId, - referenceModalState.listNamespaceType, - exceptionsListsRef, - deleteExceptionList, - handleDeleteError, - handleDeleteSuccess, - refreshExceptions, - ]); - - const paginationMemo = useMemo( - () => ({ - pageIndex: pagination.page - 1, - pageSize: pagination.perPage, - totalItemCount: pagination.total || 0, - pageSizeOptions: [5, 10, 20, 50, 100, 200, 300], - }), - [pagination] - ); - - const handleOnDownload = useCallback(() => { - setExportDownload({}); - }, []); - - const tableItems = (exceptionListsWithRuleRefs ?? []).map((item) => ({ - ...item, - isDeleting: deletingListIds.includes(item.id), - isExporting: exportingListIds.includes(item.id), - })); - - return ( - <> - <Panel loading={!initLoading && loadingTableInfo} data-test-subj="allExceptionListsPanel"> - <> - {loadingTableInfo && ( - <EuiProgress - data-test-subj="loadingRulesInfoProgress" - size="xs" - position="absolute" - color="accent" + } + }, [ + referenceModalState.listId, + referenceModalState.listNamespaceType, + exceptionsListsRef, + deleteExceptionList, + handleDeleteError, + handleDeleteSuccess, + refreshExceptions, + ]); + + const paginationMemo = useMemo( + () => ({ + pageIndex: pagination.page - 1, + pageSize: pagination.perPage, + totalItemCount: pagination.total || 0, + pageSizeOptions: [5, 10, 20, 50, 100, 200, 300], + }), + [pagination] + ); + + const handleOnDownload = useCallback(() => { + setExportDownload({}); + }, []); + + const tableItems = (exceptionListsWithRuleRefs ?? []).map((item) => ({ + ...item, + isDeleting: deletingListIds.includes(item.id), + isExporting: exportingListIds.includes(item.id), + })); + + return ( + <> + <DetectionEngineHeaderPage + title={i18n.ALL_EXCEPTIONS} + subtitle={timelines.getLastUpdated({ showUpdating: loading, updatedAt: lastUpdated })} + /> + <Panel loading={!initLoading && loadingTableInfo} data-test-subj="allExceptionListsPanel"> + <> + {loadingTableInfo && ( + <EuiProgress + data-test-subj="loadingRulesInfoProgress" + size="xs" + position="absolute" + color="accent" + /> + )} + {!initLoading && <ExceptionsSearchBar onSearch={handleSearch} />} + <EuiSpacer size="m" /> + + {loadingTableInfo && !initLoading && !showReferenceErrorModal && ( + <Loader data-test-subj="loadingPanelAllRulesTable" overlay size="xl" /> + )} + + {initLoading ? ( + <EuiLoadingContent data-test-subj="initialLoadingPanelAllRulesTable" lines={10} /> + ) : ( + <> + <AllRulesUtilityBar + showBulkActions={false} + canBulkEdit={hasPermissions} + paginationTotal={exceptionListsWithRuleRefs.length ?? 0} + numberSelectedItems={0} + onRefresh={handleRefresh} /> - )} - <HeaderSection - split - title={i18n.ALL_EXCEPTIONS} - subtitle={timelines.getLastUpdated({ showUpdating: loading, updatedAt: lastUpdated })} - > - {!initLoading && <ExceptionsSearchBar onSearch={handleSearch} />} - </HeaderSection> - - {loadingTableInfo && !initLoading && !showReferenceErrorModal && ( - <Loader data-test-subj="loadingPanelAllRulesTable" overlay size="xl" /> - )} - - {initLoading ? ( - <EuiLoadingContent data-test-subj="initialLoadingPanelAllRulesTable" lines={10} /> - ) : ( - <> - <AllRulesUtilityBar - showBulkActions={false} - canBulkEdit={hasPermissions} - paginationTotal={exceptionListsWithRuleRefs.length ?? 0} - numberSelectedItems={0} - onRefresh={handleRefresh} - /> - <EuiBasicTable - data-test-subj="exceptions-table" - columns={exceptionsColumns} - isSelectable={hasPermissions} - itemId="id" - items={tableItems} - noItemsMessage={emptyPrompt} - onChange={() => {}} - pagination={paginationMemo} - /> - </> - )} - </> - </Panel> - <AutoDownload - blob={exportDownload.blob} - name={`${exportDownload.name}.ndjson`} - onDownload={handleOnDownload} - /> - <ReferenceErrorModal - cancelText={i18n.REFERENCE_MODAL_CANCEL_BUTTON} - confirmText={i18n.REFERENCE_MODAL_CONFIRM_BUTTON} - contentText={referenceModalState.contentText} - onCancel={handleCloseReferenceErrorModal} - onClose={handleCloseReferenceErrorModal} - onConfirm={handleReferenceDelete} - references={referenceModalState.rulesReferences} - showModal={showReferenceErrorModal} - titleText={i18n.REFERENCE_MODAL_TITLE} - /> - </> - ); - } -); + <EuiBasicTable + data-test-subj="exceptions-table" + columns={exceptionsColumns} + isSelectable={hasPermissions} + itemId="id" + items={tableItems} + noItemsMessage={emptyPrompt} + onChange={() => {}} + pagination={paginationMemo} + /> + </> + )} + </> + </Panel> + <AutoDownload + blob={exportDownload.blob} + name={`${exportDownload.name}.ndjson`} + onDownload={handleOnDownload} + /> + <ReferenceErrorModal + cancelText={i18n.REFERENCE_MODAL_CANCEL_BUTTON} + confirmText={i18n.REFERENCE_MODAL_CONFIRM_BUTTON} + contentText={referenceModalState.contentText} + onCancel={handleCloseReferenceErrorModal} + onClose={handleCloseReferenceErrorModal} + onConfirm={handleReferenceDelete} + references={referenceModalState.rulesReferences} + showModal={showReferenceErrorModal} + titleText={i18n.REFERENCE_MODAL_TITLE} + /> + </> + ); +}); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx index 9597c221843be7..200bf0c7193201 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx @@ -326,33 +326,4 @@ describe('AllRules', () => { expect(wrapper.exists('[data-test-subj="rules-table"]')).toBeFalsy(); }); }); - - it('renders exceptions lists tab when tab clicked', async () => { - const wrapper = mount( - <TestProviders> - <AllRules - createPrePackagedRules={jest.fn()} - hasPermissions - loading={false} - loadingCreatePrePackagedRules={false} - refetchPrePackagedRulesStatus={jest.fn()} - rulesCustomInstalled={1} - rulesInstalled={0} - rulesNotInstalled={0} - rulesNotUpdated={0} - setRefreshRulesData={jest.fn()} - /> - </TestProviders> - ); - - await waitFor(() => { - const exceptionsTab = wrapper.find('[data-test-subj="allRulesTableTab-exceptions"] button'); - exceptionsTab.simulate('click'); - - wrapper.update(); - expect(wrapper.exists('[data-test-subj="allExceptionListsPanel"]')).toBeTruthy(); - expect(wrapper.exists('[data-test-subj="rules-table"]')).toBeFalsy(); - expect(wrapper.exists('[data-test-subj="monitoring-table"]')).toBeFalsy(); - }); - }); }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx index 144aa05cb3b072..76a049936a722f 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.tsx @@ -14,7 +14,6 @@ import { useFormatUrl } from '../../../../../common/components/link_to'; import { CreatePreBuiltRules } from '../../../../containers/detection_engine/rules'; import { RulesTables } from './rules_tables'; import * as i18n from '../translations'; -import { ExceptionListsTable } from './exceptions/exceptions_table'; interface AllRulesProps { createPrePackagedRules: CreatePreBuiltRules | null; @@ -46,13 +45,7 @@ const allRulesTabs = [ name: i18n.MONITORING_TAB, disabled: false, }, - { - id: AllRulesTabs.exceptions, - name: i18n.EXCEPTIONS_TAB, - disabled: false, - }, ]; - /** * Table Component for displaying all Rules for a given cluster. Provides the ability to filter * by name, sort by enabled, and perform the following actions: @@ -75,7 +68,7 @@ export const AllRules = React.memo<AllRulesProps>( setRefreshRulesData, }) => { const history = useHistory(); - const { formatUrl } = useFormatUrl(SecurityPageName.detections); + const { formatUrl } = useFormatUrl(SecurityPageName.rules); const [allRulesTab, setAllRulesTab] = useState(AllRulesTabs.rules); const tabs = useMemo( @@ -100,35 +93,23 @@ export const AllRules = React.memo<AllRulesProps>( return ( <> - <EuiSpacer /> {tabs} <EuiSpacer /> - - {(allRulesTab === AllRulesTabs.rules || allRulesTab === AllRulesTabs.monitoring) && ( - <RulesTables - history={history} - formatUrl={formatUrl} - selectedTab={allRulesTab} - createPrePackagedRules={createPrePackagedRules} - hasPermissions={hasPermissions} - loading={loading} - loadingCreatePrePackagedRules={loadingCreatePrePackagedRules} - refetchPrePackagedRulesStatus={refetchPrePackagedRulesStatus} - rulesCustomInstalled={rulesCustomInstalled} - rulesInstalled={rulesInstalled} - rulesNotInstalled={rulesNotInstalled} - rulesNotUpdated={rulesNotUpdated} - setRefreshRulesData={setRefreshRulesData} - /> - )} - {allRulesTab === AllRulesTabs.exceptions && ( - <ExceptionListsTable - formatUrl={formatUrl} - history={history} - hasPermissions={hasPermissions} - loading={loading} - /> - )} + <RulesTables + history={history} + formatUrl={formatUrl} + selectedTab={allRulesTab} + createPrePackagedRules={createPrePackagedRules} + hasPermissions={hasPermissions} + loading={loading} + loadingCreatePrePackagedRules={loadingCreatePrePackagedRules} + refetchPrePackagedRulesStatus={refetchPrePackagedRulesStatus} + rulesCustomInstalled={rulesCustomInstalled} + rulesInstalled={rulesInstalled} + rulesNotInstalled={rulesNotInstalled} + rulesNotUpdated={rulesNotUpdated} + setRefreshRulesData={setRefreshRulesData} + /> </> ); } diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx index 2ec34aaece60b4..77ca5be0c0ac16 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx @@ -148,6 +148,7 @@ export const RulesTables = React.memo<RulesTableProps>( const { loading: isLoadingRulesStatuses, rulesStatuses } = useRulesStatuses(rules); const [, dispatchToaster] = useStateToaster(); const mlCapabilities = useMlCapabilities(); + const { navigateToApp } = useKibana().services.application; // TODO: Refactor license check + hasMlAdminPermissions to common check const hasMlPermissions = hasMlLicense(mlCapabilities) && hasMlAdminPermissions(mlCapabilities); @@ -279,6 +280,7 @@ export const RulesTables = React.memo<RulesTableProps>( (loadingRulesAction === 'enable' || loadingRulesAction === 'disable') ? loadingRuleIds : [], + navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, hasReadActionsPrivileges: hasActionsPrivileges, @@ -294,6 +296,7 @@ export const RulesTables = React.memo<RulesTableProps>( history, loadingRuleIds, loadingRulesAction, + navigateToApp, reFetchRules, ]); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.test.tsx index 9622610f3c637f..45713b6b0667f8 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.test.tsx @@ -25,7 +25,7 @@ jest.mock('react-router-dom', () => { }), }; }); - +jest.mock('../../../../../common/lib/kibana'); jest.mock('../../../../containers/detection_engine/lists/use_lists_config'); jest.mock('../../../../../common/components/link_to'); jest.mock('../../../../components/user_info'); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx index 23edf785a7f3a2..3d488f1f08c983 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx @@ -14,7 +14,6 @@ import { EuiFlexGroup, } from '@elastic/eui'; import React, { useCallback, useRef, useState, useMemo } from 'react'; -import { useHistory } from 'react-router-dom'; import styled, { StyledComponent } from 'styled-components'; import { useCreateRule } from '../../../../containers/detection_engine/rules'; @@ -48,6 +47,8 @@ import { formatRule, stepIsValid } from './helpers'; import * as i18n from './translations'; import { SecurityPageName } from '../../../../../app/types'; import { ruleStepsOrder } from '../utils'; +import { APP_ID } from '../../../../../../common/constants'; +import { useKibana } from '../../../../../common/lib/kibana'; const formHookNoop = async (): Promise<undefined> => undefined; @@ -100,6 +101,7 @@ const CreateRulePageComponent: React.FC = () => { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration, } = useListsConfig(); + const { navigateToApp } = useKibana().services.application; const loading = userInfoLoading || listsConfigLoading; const [, dispatchToaster] = useStateToaster(); const [activeStep, setActiveStep] = useState<RuleStep>(RuleStep.defineRule); @@ -143,7 +145,6 @@ const CreateRulePageComponent: React.FC = () => { const ruleType = stepsData.current[RuleStep.defineRule].data?.ruleType; const ruleName = stepsData.current[RuleStep.aboutRule].data?.name; const actionMessageParams = useMemo(() => getActionMessageParams(ruleType), [ruleType]); - const history = useHistory(); const handleAccordionToggle = useCallback( (step: RuleStep, isOpen: boolean) => @@ -235,6 +236,10 @@ const CreateRulePageComponent: React.FC = () => { [activeStep] ); + const submitStepDefineRule = useCallback(() => { + submitStep(RuleStep.defineRule); + }, [submitStep]); + const defineRuleButton = ( <AccordionTitle name="1" @@ -266,7 +271,10 @@ const CreateRulePageComponent: React.FC = () => { if (ruleName && ruleId) { displaySuccessToast(i18n.SUCCESSFULLY_CREATED_RULES(ruleName), dispatchToaster); - history.replace(getRuleDetailsUrl(ruleId)); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getRuleDetailsUrl(ruleId), + }); return null; } @@ -278,13 +286,18 @@ const CreateRulePageComponent: React.FC = () => { needsListsConfiguration ) ) { - history.replace(getDetectionEngineUrl()); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.alerts, + path: getDetectionEngineUrl(), + }); return null; } else if (!userHasPermissions(canUserCRUD)) { - history.replace(getRulesUrl()); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getRulesUrl(), + }); return null; } - return ( <> <SecuritySolutionPageWrapper> @@ -294,7 +307,7 @@ const CreateRulePageComponent: React.FC = () => { backOptions={{ href: getRulesUrl(), text: i18n.BACK_TO_RULES, - pageId: SecurityPageName.detections, + pageId: SecurityPageName.rules, }} isLoading={isLoading || loading} title={i18n.PAGE_TITLE} @@ -327,7 +340,7 @@ const CreateRulePageComponent: React.FC = () => { isReadOnlyView={activeStep !== RuleStep.defineRule} isLoading={isLoading || loading} setForm={setFormHook} - onSubmit={() => submitStep(RuleStep.defineRule)} + onSubmit={submitStepDefineRule} descriptionColumns="singleSplit" /> </StepDefineRuleAccordion> @@ -437,7 +450,7 @@ const CreateRulePageComponent: React.FC = () => { </EuiFlexGroup> </SecuritySolutionPageWrapper> - <SpyRoute pageName={SecurityPageName.detections} /> + <SpyRoute pageName={SecurityPageName.rules} /> </> ); }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 92679cb2662d7a..a7a9b31d1f408a 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -22,7 +22,7 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { noop } from 'lodash/fp'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { useParams, useHistory } from 'react-router-dom'; +import { useParams } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import styled from 'styled-components'; import deepEqual from 'fast-deep-equal'; @@ -86,7 +86,7 @@ import { SecurityPageName } from '../../../../../app/types'; import { LinkButton } from '../../../../../common/components/links'; import { useFormatUrl } from '../../../../../common/components/link_to'; import { ExceptionsViewer } from '../../../../../common/components/exceptions/viewer'; -import { DEFAULT_INDEX_PATTERN } from '../../../../../../common/constants'; +import { APP_ID, DEFAULT_INDEX_PATTERN } from '../../../../../../common/constants'; import { useGlobalFullScreen } from '../../../../../common/containers/use_full_screen'; import { Display } from '../../../../../hosts/pages/display'; @@ -153,6 +153,7 @@ const ruleDetailTabs = [ ]; const RuleDetailsPageComponent = () => { + const { navigateToApp } = useKibana().services.application; const dispatch = useDispatch(); const containerElement = useRef<HTMLDivElement | null>(null); const getTimeline = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []); @@ -220,8 +221,7 @@ const RuleDetailsPageComponent = () => { const [showBuildingBlockAlerts, setShowBuildingBlockAlerts] = useState(false); const [showOnlyThreatIndicatorAlerts, setShowOnlyThreatIndicatorAlerts] = useState(false); const mlCapabilities = useMlCapabilities(); - const history = useHistory(); - const { formatUrl } = useFormatUrl(SecurityPageName.detections); + const { formatUrl } = useFormatUrl(SecurityPageName.rules); const { globalFullScreen } = useGlobalFullScreen(); // TODO: Once we are past experimental phase this code should be removed @@ -442,9 +442,12 @@ const RuleDetailsPageComponent = () => { const goToEditRule = useCallback( (ev) => { ev.preventDefault(); - history.push(getEditRuleUrl(ruleId ?? '')); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getEditRuleUrl(ruleId ?? ''), + }); }, - [history, ruleId] + [navigateToApp, ruleId] ); const editRule = useMemo(() => { @@ -548,7 +551,10 @@ const RuleDetailsPageComponent = () => { needsListsConfiguration ) ) { - history.replace(getDetectionEngineUrl()); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.alerts, + path: getDetectionEngineUrl(), + }); return null; } @@ -574,7 +580,7 @@ const RuleDetailsPageComponent = () => { backOptions={{ href: getRulesUrl(), text: i18n.BACK_TO_RULES, - pageId: SecurityPageName.detections, + pageId: SecurityPageName.rules, dataTestSubj: 'ruleDetailsBackToAllRules', }} border @@ -744,7 +750,7 @@ const RuleDetailsPageComponent = () => { </SecuritySolutionPageWrapper> )} - <SpyRoute pageName={SecurityPageName.detections} state={{ ruleName: rule?.name }} /> + <SpyRoute pageName={SecurityPageName.rules} state={{ ruleName: rule?.name }} /> </> ); }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.test.tsx index e7cdfbe268fe68..e56742b9f0a516 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.test.tsx @@ -16,6 +16,7 @@ import { useParams } from 'react-router-dom'; import { useAppToastsMock } from '../../../../../common/hooks/use_app_toasts.mock'; import { useAppToasts } from '../../../../../common/hooks/use_app_toasts'; +jest.mock('../../../../../common/lib/kibana'); jest.mock('../../../../containers/detection_engine/lists/use_lists_config'); jest.mock('../../../../../common/components/link_to'); jest.mock('../../../../components/user_info'); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx index 41710a822e5394..4786d7f2eae788 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx @@ -16,7 +16,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { useParams, useHistory } from 'react-router-dom'; +import { useParams } from 'react-router-dom'; import { UpdateRulesSchema } from '../../../../../../common/detection_engine/schemas/request'; import { useRule, useUpdateRule } from '../../../../containers/detection_engine/rules'; @@ -55,11 +55,12 @@ import { RuleStep, RuleStepsFormHooks, RuleStepsFormData, RuleStepsData } from ' import * as i18n from './translations'; import { SecurityPageName } from '../../../../../app/types'; import { ruleStepsOrder } from '../utils'; +import { useKibana } from '../../../../../common/lib/kibana'; +import { APP_ID } from '../../../../../../common/constants'; const formHookNoop = async (): Promise<undefined> => undefined; const EditRulePageComponent: FC = () => { - const history = useHistory(); const [, dispatchToaster] = useStateToaster(); const [ { @@ -74,6 +75,8 @@ const EditRulePageComponent: FC = () => { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration, } = useListsConfig(); + const { navigateToApp } = useKibana().services.application; + const { detailName: ruleId } = useParams<{ detailName: string | undefined }>(); const [ruleLoading, rule] = useRule(ruleId); const loading = ruleLoading || userInfoLoading || listsConfigLoading; @@ -299,9 +302,12 @@ const EditRulePageComponent: FC = () => { const goToDetailsRule = useCallback( (ev) => { ev.preventDefault(); - history.replace(getRuleDetailsUrl(ruleId ?? '')); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getRuleDetailsUrl(ruleId ?? ''), + }); }, - [history, ruleId] + [navigateToApp, ruleId] ); useEffect(() => { @@ -314,7 +320,10 @@ const EditRulePageComponent: FC = () => { if (isSaved) { displaySuccessToast(i18n.SUCCESSFULLY_SAVED_RULE(rule?.name ?? ''), dispatchToaster); - history.replace(getRuleDetailsUrl(ruleId ?? '')); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getRuleDetailsUrl(ruleId ?? ''), + }); return null; } @@ -326,10 +335,16 @@ const EditRulePageComponent: FC = () => { needsListsConfiguration ) ) { - history.replace(getDetectionEngineUrl()); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.alerts, + path: getDetectionEngineUrl(), + }); return null; } else if (!userHasPermissions(canUserCRUD)) { - history.replace(getRuleDetailsUrl(ruleId ?? '')); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + path: getRuleDetailsUrl(ruleId ?? ''), + }); return null; } @@ -342,7 +357,7 @@ const EditRulePageComponent: FC = () => { backOptions={{ href: getRuleDetailsUrl(ruleId ?? ''), text: `${i18n.BACK_TO} ${rule?.name ?? ''}`, - pageId: SecurityPageName.detections, + pageId: SecurityPageName.rules, dataTestSubj: 'ruleEditBackToRuleDetails', }} isLoading={isLoading} @@ -412,7 +427,7 @@ const EditRulePageComponent: FC = () => { </EuiFlexGroup> </SecuritySolutionPageWrapper> - <SpyRoute pageName={SecurityPageName.detections} state={{ ruleName: rule?.name }} /> + <SpyRoute pageName={SecurityPageName.rules} state={{ ruleName: rule?.name }} /> </> ); }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.test.tsx index bcd5ccdc0b5ac5..550a289a11a974 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.test.tsx @@ -30,6 +30,8 @@ jest.mock('react-router-dom', () => { jest.mock('../../../containers/detection_engine/lists/use_lists_config'); jest.mock('../../../../common/components/link_to'); jest.mock('../../../components/user_info'); + +jest.mock('../../../../common/lib/kibana'); jest.mock('../../../../common/components/toasters', () => { const actual = jest.requireActual('../../../../common/components/toasters'); return { diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx index 29fd8e2e8b247c..f957f77ac4c1a3 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/index.tsx @@ -7,7 +7,6 @@ import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import React, { useCallback, useMemo, useRef, useState } from 'react'; -import { useHistory } from 'react-router-dom'; import { usePrePackagedRules, importRules } from '../../../containers/detection_engine/rules'; import { useListsConfig } from '../../../containers/detection_engine/lists/use_lists_config'; @@ -37,14 +36,17 @@ import { useFormatUrl } from '../../../../common/components/link_to'; import { NeedAdminForUpdateRulesCallOut } from '../../../components/callouts/need_admin_for_update_callout'; import { MlJobCompatibilityCallout } from '../../../components/callouts/ml_job_compatibility_callout'; import { MissingPrivilegesCallOut } from '../../../components/callouts/missing_privileges_callout'; +import { APP_ID } from '../../../../../common/constants'; +import { useKibana } from '../../../../common/lib/kibana'; type Func = () => Promise<void>; const RulesPageComponent: React.FC = () => { - const history = useHistory(); const [showImportModal, setShowImportModal] = useState(false); const [showValueListsModal, setShowValueListsModal] = useState(false); const refreshRulesData = useRef<null | Func>(null); + const { navigateToApp } = useKibana().services.application; + const [ { loading: userInfoLoading, @@ -93,7 +95,7 @@ const RulesPageComponent: React.FC = () => { timelinesNotInstalled, timelinesNotUpdated ); - const { formatUrl } = useFormatUrl(SecurityPageName.detections); + const { formatUrl } = useFormatUrl(SecurityPageName.rules); const handleRefreshRules = useCallback(async () => { if (refreshRulesData.current != null) { @@ -123,9 +125,9 @@ const RulesPageComponent: React.FC = () => { const goToNewRule = useCallback( (ev) => { ev.preventDefault(); - history.push(getCreateRuleUrl()); + navigateToApp(APP_ID, { deepLinkId: SecurityPageName.rules, path: getCreateRuleUrl() }); }, - [history] + [navigateToApp] ); const loadPrebuiltRulesAndTemplatesButton = useMemo( @@ -154,7 +156,10 @@ const RulesPageComponent: React.FC = () => { needsListsConfiguration ) ) { - history.replace(getDetectionEngineUrl()); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.alerts, + path: getDetectionEngineUrl(), + }); return null; } @@ -183,14 +188,7 @@ const RulesPageComponent: React.FC = () => { title={i18n.IMPORT_RULE} /> <SecuritySolutionPageWrapper> - <DetectionEngineHeaderPage - backOptions={{ - href: getDetectionEngineUrl(), - text: i18n.BACK_TO_DETECTIONS, - pageId: SecurityPageName.detections, - }} - title={i18n.PAGE_TITLE} - > + <DetectionEngineHeaderPage title={i18n.PAGE_TITLE}> <EuiFlexGroup alignItems="center" gutterSize="s" responsive={false} wrap={true}> {loadPrebuiltRulesAndTemplatesButton && ( <EuiFlexItem grow={false}>{loadPrebuiltRulesAndTemplatesButton}</EuiFlexItem> @@ -260,7 +258,7 @@ const RulesPageComponent: React.FC = () => { /> </SecuritySolutionPageWrapper> - <SpyRoute pageName={SecurityPageName.detections} /> + <SpyRoute pageName={SecurityPageName.rules} /> </> ); }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts index defd976a04c4b6..8379bbcb590e10 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/translations.ts @@ -44,7 +44,7 @@ export const ADD_NEW_RULE = i18n.translate( ); export const PAGE_TITLE = i18n.translate('xpack.securitySolution.detectionEngine.rules.pageTitle', { - defaultMessage: 'Detection rules', + defaultMessage: 'Rules', }); export const ADD_PAGE_TITLE = i18n.translate( diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.test.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.test.ts index 217f786cb0a6ad..d405837a4f7f20 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.test.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.test.ts @@ -11,7 +11,7 @@ const getUrlForAppMock = (appId: string, options?: { path?: string; absolute?: b `${appId}${options?.path ?? ''}`; describe('getBreadcrumbs', () => { - it('returns default value for incorrect params', () => { + it('Does not render for incorrect params', () => { expect( getBreadcrumbs( { @@ -24,6 +24,6 @@ describe('getBreadcrumbs', () => { [], getUrlForAppMock ) - ).toEqual([{ href: 'securitySolution:detections', text: 'Detections' }]); + ).toEqual([]); }); }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts index 421ca6209e0af5..bbc085eaa0be88 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts @@ -9,18 +9,16 @@ import { isEmpty } from 'lodash/fp'; import { ChromeBreadcrumb } from '../../../../../../../../src/core/public'; import { - getDetectionEngineTabUrl, getRulesUrl, getRuleDetailsUrl, getCreateRuleUrl, getEditRuleUrl, } from '../../../../common/components/link_to/redirect_to_detection_engine'; -import * as i18nDetections from '../translations'; import * as i18nRules from './translations'; import { RouteSpyState } from '../../../../common/utils/route/types'; import { GetUrlForApp } from '../../../../common/components/navigation/types'; import { SecurityPageName } from '../../../../app/types'; -import { APP_ID } from '../../../../../common/constants'; +import { APP_ID, RULES_PATH } from '../../../../../common/constants'; import { RuleStep, RuleStepsOrder } from './types'; export const ruleStepsOrder: RuleStepsOrder = [ @@ -30,22 +28,14 @@ export const ruleStepsOrder: RuleStepsOrder = [ RuleStep.ruleActions, ]; -const getTabBreadcrumb = (pathname: string, search: string[], getUrlForApp: GetUrlForApp) => { +const getRulesBreadcrumb = (pathname: string, search: string[], getUrlForApp: GetUrlForApp) => { const tabPath = pathname.split('/')[1]; - if (tabPath === 'alerts') { - return { - text: i18nDetections.ALERT, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { - path: getDetectionEngineTabUrl(tabPath, !isEmpty(search[0]) ? search[0] : ''), - }), - }; - } - if (tabPath === 'rules') { return { text: i18nRules.PAGE_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getRulesUrl(!isEmpty(search[0]) ? search[0] : ''), }), }; @@ -53,29 +43,22 @@ const getTabBreadcrumb = (pathname: string, search: string[], getUrlForApp: GetU }; const isRuleCreatePage = (pathname: string) => - pathname.includes('/rules') && pathname.includes('/create'); + pathname.includes(RULES_PATH) && pathname.includes('/create'); const isRuleEditPage = (pathname: string) => - pathname.includes('/rules') && pathname.includes('/edit'); + pathname.includes(RULES_PATH) && pathname.includes('/edit'); export const getBreadcrumbs = ( params: RouteSpyState, search: string[], getUrlForApp: GetUrlForApp ): ChromeBreadcrumb[] => { - let breadcrumb = [ - { - text: i18nDetections.BREADCRUMB_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { - path: !isEmpty(search[0]) ? search[0] : '', - }), - }, - ]; + let breadcrumb: ChromeBreadcrumb[] = []; - const tabBreadcrumb = getTabBreadcrumb(params.pathName, search, getUrlForApp); + const rulesBreadcrumb = getRulesBreadcrumb(params.pathName, search, getUrlForApp); - if (tabBreadcrumb) { - breadcrumb = [...breadcrumb, tabBreadcrumb]; + if (rulesBreadcrumb) { + breadcrumb = [...breadcrumb, rulesBreadcrumb]; } if (params.detailName && params.state?.ruleName) { @@ -83,7 +66,8 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: params.state.ruleName, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getRuleDetailsUrl(params.detailName, !isEmpty(search[0]) ? search[0] : ''), }), }, @@ -95,7 +79,8 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: i18nRules.ADD_PAGE_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getCreateRuleUrl(!isEmpty(search[0]) ? search[0] : ''), }), }, @@ -107,7 +92,8 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: i18nRules.EDIT_PAGE_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getEditRuleUrl(params.detailName, !isEmpty(search[0]) ? search[0] : ''), }), }, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts index 4b07369ae3039a..9475701baf2fd6 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/translations.ts @@ -17,7 +17,7 @@ export const BREADCRUMB_TITLE = i18n.translate( export const PAGE_TITLE = i18n.translate( 'xpack.securitySolution.detectionEngine.detectionsPageTitle', { - defaultMessage: 'Detection alerts', + defaultMessage: 'Alerts', } ); @@ -37,7 +37,7 @@ export const SIGNAL = i18n.translate('xpack.securitySolution.detectionEngine.sig }); export const ALERT = i18n.translate('xpack.securitySolution.detectionEngine.alertTitle', { - defaultMessage: 'Detection alerts', + defaultMessage: 'Alerts', }); export const BUTTON_MANAGE_RULES = i18n.translate( diff --git a/x-pack/plugins/security_solution/public/detections/routes.tsx b/x-pack/plugins/security_solution/public/detections/routes.tsx index e91c612bc49ab4..329e1c939c2016 100644 --- a/x-pack/plugins/security_solution/public/detections/routes.tsx +++ b/x-pack/plugins/security_solution/public/detections/routes.tsx @@ -6,18 +6,35 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; +import { Redirect, RouteProps, RouteComponentProps } from 'react-router-dom'; +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { ALERTS_PATH, DETECTIONS_PATH, SecurityPageName } from '../../common/constants'; -import { DetectionEngineContainer } from './pages/detection_engine'; -import { NotFoundPage } from '../app/404'; +import { SpyRoute } from '../common/utils/route/spy_routes'; -export const AlertsRoutes: React.FC = () => ( - <Switch> - <Route path="/"> - <DetectionEngineContainer /> - </Route> - <Route> - <NotFoundPage /> - </Route> - </Switch> +import { DetectionEnginePage } from './pages/detection_engine/detection_engine'; + +const renderAlertsRoutes = () => ( + <TrackApplicationView viewId={SecurityPageName.alerts}> + <DetectionEnginePage /> + <SpyRoute pageName={SecurityPageName.alerts} /> + </TrackApplicationView> ); + +const DetectionsRedirects = ({ location }: RouteComponentProps) => + location.pathname === DETECTIONS_PATH ? ( + <Redirect to={{ ...location, pathname: ALERTS_PATH }} /> + ) : ( + <Redirect to={{ ...location, pathname: location.pathname.replace(DETECTIONS_PATH, '') }} /> + ); + +export const routes: RouteProps[] = [ + { + path: ALERTS_PATH, + render: renderAlertsRoutes, + }, + { + path: DETECTIONS_PATH, + component: DetectionsRedirects, + }, +]; diff --git a/x-pack/plugins/security_solution/public/exceptions/index.ts b/x-pack/plugins/security_solution/public/exceptions/index.ts new file mode 100644 index 00000000000000..eccb2ba7578c71 --- /dev/null +++ b/x-pack/plugins/security_solution/public/exceptions/index.ts @@ -0,0 +1,25 @@ +/* + * 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 { Storage } from '../../../../../src/plugins/kibana_utils/public'; + +import { SecuritySubPlugin } from '../app/types'; +import { DETECTIONS_TIMELINE_IDS } from '../detections'; +import { getTimelinesInStorageByIds } from '../timelines/containers/local_storage'; +import { routes } from './routes'; + +export class Exceptions { + public setup() {} + + public start(storage: Storage): SecuritySubPlugin { + return { + storageTimelines: { + timelineById: getTimelinesInStorageByIds(storage, DETECTIONS_TIMELINE_IDS), + }, + routes, + }; + } +} diff --git a/x-pack/plugins/security_solution/public/exceptions/routes.tsx b/x-pack/plugins/security_solution/public/exceptions/routes.tsx new file mode 100644 index 00000000000000..0afc152ed38708 --- /dev/null +++ b/x-pack/plugins/security_solution/public/exceptions/routes.tsx @@ -0,0 +1,28 @@ +/* + * 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 { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { EXCEPTIONS_PATH, SecurityPageName } from '../../common/constants'; +import { ExceptionListsTable } from '../detections/pages/detection_engine/rules/all/exceptions/exceptions_table'; +import { SpyRoute } from '../common/utils/route/spy_routes'; + +export const ExceptionsRoutes = () => { + return ( + <TrackApplicationView viewId={SecurityPageName.exceptions}> + <ExceptionListsTable /> + <SpyRoute pageName={SecurityPageName.exceptions} /> + </TrackApplicationView> + ); +}; + +export const routes = [ + { + path: EXCEPTIONS_PATH, + render: ExceptionsRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/helpers.ts b/x-pack/plugins/security_solution/public/helpers.ts index e12b2f7fc37f81..d941550fdb2e34 100644 --- a/x-pack/plugins/security_solution/public/helpers.ts +++ b/x-pack/plugins/security_solution/public/helpers.ts @@ -6,9 +6,10 @@ */ import { isEmpty } from 'lodash/fp'; +import { matchPath } from 'react-router-dom'; import { CoreStart } from '../../../../src/core/public'; -import { APP_ID } from '../common/constants'; +import { ALERTS_PATH, APP_ID, EXCEPTIONS_PATH, RULES_PATH } from '../common/constants'; import { FactoryQueryTypes, StrategyResponseType, @@ -47,61 +48,85 @@ export const parseRoute = (location: Pick<Location, 'hash' | 'pathname' | 'searc export const manageOldSiemRoutes = async (coreStart: CoreStart) => { const { application } = coreStart; - const { pageName, path, search } = parseRoute(window.location); + const { pageName, path } = parseRoute(window.location); switch (pageName) { case SecurityPageName.overview: - application.navigateToApp(`${APP_ID}:${SecurityPageName.overview}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.overview, replace: true, path, }); break; case 'ml-hosts': - application.navigateToApp(`${APP_ID}:${SecurityPageName.hosts}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.hosts, replace: true, path: `/ml-hosts${path}`, }); break; case SecurityPageName.hosts: - application.navigateToApp(`${APP_ID}:${SecurityPageName.hosts}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.hosts, replace: true, path, }); break; case 'ml-network': - application.navigateToApp(`${APP_ID}:${SecurityPageName.network}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.network, replace: true, path: `/ml-network${path}`, }); break; case SecurityPageName.network: - application.navigateToApp(`${APP_ID}:${SecurityPageName.network}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.network, replace: true, path, }); break; case SecurityPageName.timelines: - application.navigateToApp(`${APP_ID}:${SecurityPageName.timelines}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.timelines, replace: true, path, }); break; case SecurityPageName.case: - application.navigateToApp(`${APP_ID}:${SecurityPageName.case}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, replace: true, path, }); break; - case 'detections': - application.navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { + case SecurityPageName.detections: + case SecurityPageName.alerts: + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.alerts, + replace: true, + path, + }); + break; + case SecurityPageName.rules: + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, + replace: true, + path, + }); + break; + case SecurityPageName.exceptions: + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.exceptions, replace: true, path, }); break; default: - application.navigateToApp(`${APP_ID}:${SecurityPageName.overview}`, { + application.navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.overview, replace: true, - path: `${search}`, + path, }); break; } @@ -115,3 +140,10 @@ export const getInspectResponse = <T extends FactoryQueryTypes>( response: response != null ? [JSON.stringify(response.rawResponse, null, 2)] : prevResponse?.response, }); + +export const isDetectionsPath = (pathname: string): boolean => { + return !!matchPath(pathname, { + path: `(${ALERTS_PATH}|${RULES_PATH}|${EXCEPTIONS_PATH})`, + strict: false, + }); +}; diff --git a/x-pack/plugins/security_solution/public/hosts/index.ts b/x-pack/plugins/security_solution/public/hosts/index.ts index 64b805bf5e2d6d..cbb539f8e41074 100644 --- a/x-pack/plugins/security_solution/public/hosts/index.ts +++ b/x-pack/plugins/security_solution/public/hosts/index.ts @@ -9,7 +9,7 @@ import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { TimelineIdLiteral, TimelineId } from '../../common/types/timeline'; import { SecuritySubPluginWithStore } from '../app/types'; import { getTimelinesInStorageByIds } from '../timelines/containers/local_storage'; -import { HostsRoutes } from './routes'; +import { routes } from './routes'; import { initialHostsState, hostsReducer, HostsState } from './store'; const HOST_TIMELINE_IDS: TimelineIdLiteral[] = [ @@ -22,7 +22,7 @@ export class Hosts { public start(storage: Storage): SecuritySubPluginWithStore<'hosts', HostsState> { return { - SubPluginRoutes: HostsRoutes, + routes, storageTimelines: { timelineById: getTimelinesInStorageByIds(storage, HOST_TIMELINE_IDS), }, diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx b/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx index b51e20b801f408..3b76ec8a0d13f5 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx @@ -80,7 +80,7 @@ describe('body', () => { test(`it should pass expected object properties to ${componentName}`, () => { const wrapper = mount( <TestProviders> - <MemoryRouter initialEntries={[`/host-1/${path}`]}> + <MemoryRouter initialEntries={[`/hosts/host-1/${path}`]}> <HostDetailsTabs isInitializing={false} detailName={'host-1'} diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/nav_tabs.tsx b/x-pack/plugins/security_solution/public/hosts/pages/details/nav_tabs.tsx index 2f6d5e5bcdc33d..02f8fa740c024b 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/nav_tabs.tsx @@ -9,10 +9,10 @@ import { omit } from 'lodash/fp'; import * as i18n from '../translations'; import { HostDetailsNavTab } from './types'; import { HostsTableType } from '../../store/model'; -import { SecurityPageName } from '../../../app/types'; +import { HOSTS_PATH } from '../../../../common/constants'; const getTabsOnHostDetailsUrl = (hostName: string, tabName: HostsTableType) => - `/${hostName}/${tabName}`; + `${HOSTS_PATH}/${hostName}/${tabName}`; export const navTabsHostDetails = ( hostName: string, @@ -24,44 +24,30 @@ export const navTabsHostDetails = ( name: i18n.NAVIGATION_AUTHENTICATIONS_TITLE, href: getTabsOnHostDetailsUrl(hostName, HostsTableType.authentications), disabled: false, - urlKey: 'host', - isDetailPage: true, - pageId: SecurityPageName.hosts, }, [HostsTableType.uncommonProcesses]: { id: HostsTableType.uncommonProcesses, name: i18n.NAVIGATION_UNCOMMON_PROCESSES_TITLE, href: getTabsOnHostDetailsUrl(hostName, HostsTableType.uncommonProcesses), disabled: false, - urlKey: 'host', - isDetailPage: true, - pageId: SecurityPageName.hosts, }, [HostsTableType.anomalies]: { id: HostsTableType.anomalies, name: i18n.NAVIGATION_ANOMALIES_TITLE, href: getTabsOnHostDetailsUrl(hostName, HostsTableType.anomalies), disabled: false, - urlKey: 'host', - isDetailPage: true, - pageId: SecurityPageName.hosts, }, [HostsTableType.events]: { id: HostsTableType.events, name: i18n.NAVIGATION_EVENTS_TITLE, href: getTabsOnHostDetailsUrl(hostName, HostsTableType.events), disabled: false, - urlKey: 'host', - isDetailPage: true, - pageId: SecurityPageName.hosts, }, [HostsTableType.alerts]: { id: HostsTableType.alerts, name: i18n.NAVIGATION_ALERTS_TITLE, href: getTabsOnHostDetailsUrl(hostName, HostsTableType.alerts), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, }; diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts b/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts index 5e3541feeb0aa1..f4e14605cab477 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts @@ -37,8 +37,9 @@ export const getBreadcrumbs = ( let breadcrumb = [ { text: i18n.PAGE_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.hosts}`, { + href: getUrlForApp(APP_ID, { path: !isEmpty(search[0]) ? search[0] : '', + deepLinkId: SecurityPageName.hosts, }), }, ]; @@ -48,12 +49,14 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: params.detailName, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.hosts}`, { + href: getUrlForApp(APP_ID, { path: getHostDetailsUrl(params.detailName, !isEmpty(search[0]) ? search[0] : ''), + deepLinkId: SecurityPageName.hosts, }), }, ]; } + if (params.tabName != null) { const tabName = get('tabName', params); if (!tabName) return breadcrumb; diff --git a/x-pack/plugins/security_solution/public/hosts/pages/hosts_tabs.tsx b/x-pack/plugins/security_solution/public/hosts/pages/hosts_tabs.tsx index 67a2b9419f9b8e..876730a8f66c49 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/hosts_tabs.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/hosts_tabs.tsx @@ -15,7 +15,7 @@ import { HostsTableType } from '../store/model'; import { AnomaliesQueryTabBody } from '../../common/containers/anomalies/anomalies_query_tab_body'; import { AnomaliesHostTable } from '../../common/components/ml/tables/anomalies_host_table'; import { UpdateDateRange } from '../../common/components/charts/common'; - +import { HOSTS_PATH } from '../../../common/constants'; import { HostsQueryTabBody, AuthenticationsQueryTabBody, @@ -79,22 +79,22 @@ export const HostsTabs = memo<HostsTabsProps>( return ( <Switch> - <Route path={`/:tabName(${HostsTableType.hosts})`}> + <Route path={`${HOSTS_PATH}/:tabName(${HostsTableType.hosts})`}> <HostsQueryTabBody docValueFields={docValueFields} {...tabProps} /> </Route> - <Route path={`/:tabName(${HostsTableType.authentications})`}> + <Route path={`${HOSTS_PATH}/:tabName(${HostsTableType.authentications})`}> <AuthenticationsQueryTabBody docValueFields={docValueFields} {...tabProps} /> </Route> - <Route path={`/:tabName(${HostsTableType.uncommonProcesses})`}> + <Route path={`${HOSTS_PATH}/:tabName(${HostsTableType.uncommonProcesses})`}> <UncommonProcessQueryTabBody {...tabProps} /> </Route> - <Route path={`/:tabName(${HostsTableType.anomalies})`}> + <Route path={`${HOSTS_PATH}/:tabName(${HostsTableType.anomalies})`}> <AnomaliesQueryTabBody {...tabProps} AnomaliesTableComponent={AnomaliesHostTable} /> </Route> - <Route path={`/:tabName(${HostsTableType.events})`}> + <Route path={`${HOSTS_PATH}/:tabName(${HostsTableType.events})`}> <EventsQueryTabBody {...tabProps} /> </Route> - <Route path={`/:tabName(${HostsTableType.alerts})`}> + <Route path={`${HOSTS_PATH}/:tabName(${HostsTableType.alerts})`}> <HostAlertsQueryTabBody {...tabProps} /> </Route> </Switch> diff --git a/x-pack/plugins/security_solution/public/hosts/pages/index.tsx b/x-pack/plugins/security_solution/public/hosts/pages/index.tsx index e4f447528ead6d..23be8f09ce1405 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/index.tsx @@ -6,17 +6,17 @@ */ import React from 'react'; -import { Route, Switch, RouteComponentProps, useHistory } from 'react-router-dom'; - +import { Route, Switch, Redirect } from 'react-router-dom'; +import { HOSTS_PATH } from '../../../common/constants'; import { HostDetails } from './details'; import { HostsTableType } from '../store/model'; import { MlHostConditionalContainer } from '../../common/components/ml/conditional_links/ml_host_conditional_container'; import { Hosts } from './hosts'; -import { hostsPagePath, hostDetailsPagePath } from './types'; +import { hostDetailsPagePath } from './types'; const getHostsTabPath = () => - `/:tabName(` + + `${HOSTS_PATH}/:tabName(` + `${HostsTableType.hosts}|` + `${HostsTableType.authentications}|` + `${HostsTableType.uncommonProcesses}|` + @@ -24,7 +24,7 @@ const getHostsTabPath = () => `${HostsTableType.events}|` + `${HostsTableType.alerts})`; -const getHostDetailsTabPath = (pagePath: string) => +const getHostDetailsTabPath = () => `${hostDetailsPagePath}/:tabName(` + `${HostsTableType.authentications}|` + `${HostsTableType.uncommonProcesses}|` + @@ -32,24 +32,26 @@ const getHostDetailsTabPath = (pagePath: string) => `${HostsTableType.events}|` + `${HostsTableType.alerts})`; -type Props = Partial<RouteComponentProps<{}>> & { url: string }; - -export const HostsContainer = React.memo<Props>(({ url }) => { - const history = useHistory(); - +export const HostsContainer = React.memo(() => { return ( <Switch> <Route - path="/ml-hosts" - render={({ location, match }) => ( - <MlHostConditionalContainer location={location} url={match.url} /> + exact + strict + path={HOSTS_PATH} + render={({ location: { search = '' } }) => ( + <Redirect to={{ pathname: `${HOSTS_PATH}/${HostsTableType.hosts}`, search }} /> )} /> + + <Route path={`${HOSTS_PATH}/ml-hosts`}> + <MlHostConditionalContainer /> + </Route> <Route path={getHostsTabPath()}> <Hosts /> </Route> <Route - path={getHostDetailsTabPath(hostsPagePath)} + path={getHostDetailsTabPath()} render={({ match: { params: { detailName }, @@ -63,20 +65,14 @@ export const HostsContainer = React.memo<Props>(({ url }) => { params: { detailName }, }, location: { search = '' }, - }) => { - history.replace(`${detailName}/${HostsTableType.authentications}${search}`); - return null; - }} - /> - - <Route - exact - strict - path="" - render={({ location: { search = '' } }) => { - history.replace(`${HostsTableType.hosts}${search}`); - return null; - }} + }) => ( + <Redirect + to={{ + pathname: `${HOSTS_PATH}/${detailName}/${HostsTableType.authentications}`, + search, + }} + /> + )} /> </Switch> ); diff --git a/x-pack/plugins/security_solution/public/hosts/pages/nav_tabs.tsx b/x-pack/plugins/security_solution/public/hosts/pages/nav_tabs.tsx index 41f0dda8ea0cc4..c43a6431d2da8c 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/nav_tabs.tsx @@ -9,9 +9,9 @@ import { omit } from 'lodash/fp'; import * as i18n from './translations'; import { HostsTableType } from '../store/model'; import { HostsNavTab } from './navigation/types'; -import { SecurityPageName } from '../../app/types'; +import { HOSTS_PATH } from '../../../common/constants'; -const getTabsOnHostsUrl = (tabName: HostsTableType) => `/${tabName}`; +const getTabsOnHostsUrl = (tabName: HostsTableType) => `${HOSTS_PATH}/${tabName}`; export const navTabsHosts = (hasMlUserPermissions: boolean): HostsNavTab => { const hostsNavTabs = { @@ -20,48 +20,36 @@ export const navTabsHosts = (hasMlUserPermissions: boolean): HostsNavTab => { name: i18n.NAVIGATION_ALL_HOSTS_TITLE, href: getTabsOnHostsUrl(HostsTableType.hosts), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, [HostsTableType.authentications]: { id: HostsTableType.authentications, name: i18n.NAVIGATION_AUTHENTICATIONS_TITLE, href: getTabsOnHostsUrl(HostsTableType.authentications), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, [HostsTableType.uncommonProcesses]: { id: HostsTableType.uncommonProcesses, name: i18n.NAVIGATION_UNCOMMON_PROCESSES_TITLE, href: getTabsOnHostsUrl(HostsTableType.uncommonProcesses), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, [HostsTableType.anomalies]: { id: HostsTableType.anomalies, name: i18n.NAVIGATION_ANOMALIES_TITLE, href: getTabsOnHostsUrl(HostsTableType.anomalies), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, [HostsTableType.events]: { id: HostsTableType.events, name: i18n.NAVIGATION_EVENTS_TITLE, href: getTabsOnHostsUrl(HostsTableType.events), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, [HostsTableType.alerts]: { id: HostsTableType.alerts, name: i18n.NAVIGATION_ALERTS_TITLE, href: getTabsOnHostsUrl(HostsTableType.alerts), disabled: false, - urlKey: 'host', - pageId: SecurityPageName.hosts, }, }; diff --git a/x-pack/plugins/security_solution/public/hosts/pages/types.ts b/x-pack/plugins/security_solution/public/hosts/pages/types.ts index f810a73d12596e..c7fd743ee5e444 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/types.ts +++ b/x-pack/plugins/security_solution/public/hosts/pages/types.ts @@ -11,9 +11,9 @@ import { hostsModel } from '../store'; import { GlobalTimeArgs } from '../../common/containers/use_global_time'; import { InputsModelId } from '../../common/store/inputs/constants'; import { DocValueFields } from '../../common/containers/source'; +import { HOSTS_PATH } from '../../../common/constants'; -export const hostsPagePath = '/'; -export const hostDetailsPagePath = `/:detailName`; +export const hostDetailsPagePath = `${HOSTS_PATH}/:detailName`; export type HostsTabsProps = GlobalTimeArgs & { docValueFields: DocValueFields[]; diff --git a/x-pack/plugins/security_solution/public/hosts/routes.tsx b/x-pack/plugins/security_solution/public/hosts/routes.tsx index e15acdebeeb402..1eeddf2155613e 100644 --- a/x-pack/plugins/security_solution/public/hosts/routes.tsx +++ b/x-pack/plugins/security_solution/public/hosts/routes.tsx @@ -6,14 +6,20 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; - import { HostsContainer } from './pages'; -import { NotFoundPage } from '../app/404'; +import { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { HOSTS_PATH } from '../../common/constants'; export const HostsRoutes = () => ( - <Switch> - <Route path="/" render={({ match }) => <HostsContainer url={match.url} />} /> - <Route render={() => <NotFoundPage />} /> - </Switch> + <TrackApplicationView viewId={SecurityPageName.hosts}> + <HostsContainer /> + </TrackApplicationView> ); + +export const routes: SecuritySubPluginRoutes = [ + { + path: HOSTS_PATH, + render: HostsRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx b/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx index 536d1d084f0c5d..daf2c55a443338 100644 --- a/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx +++ b/x-pack/plugins/security_solution/public/lazy_application_dependencies.tsx @@ -13,5 +13,4 @@ import { renderApp } from './app'; import { createStore, createInitialState } from './common/store'; - export { renderApp, createStore, createInitialState }; diff --git a/x-pack/plugins/security_solution/public/lazy_sub_plugins.tsx b/x-pack/plugins/security_solution/public/lazy_sub_plugins.tsx index c36900a7ce8d51..47026cbec49adc 100644 --- a/x-pack/plugins/security_solution/public/lazy_sub_plugins.tsx +++ b/x-pack/plugins/security_solution/public/lazy_sub_plugins.tsx @@ -10,11 +10,15 @@ * By loading these later we can reduce the initial bundle size and allow users to delay loading these dependencies until they are needed. */ -import { Detections } from './detections'; import { Cases } from './cases'; +import { Detections } from './detections'; +import { Exceptions } from './exceptions'; + import { Hosts } from './hosts'; import { Network } from './network'; import { Overview } from './overview'; +import { Rules } from './rules'; + import { Timelines } from './timelines'; import { Management } from './management'; @@ -24,9 +28,11 @@ import { Management } from './management'; const subPluginClasses = { Detections, Cases, + Exceptions, Hosts, Network, Overview, + Rules, Timelines, Management, }; diff --git a/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts b/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts index 3bcbd81621588b..d437c45792766b 100644 --- a/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts +++ b/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts @@ -29,7 +29,8 @@ export function getBreadcrumbs( return [ { text: ADMINISTRATION, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.administration}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.endpoints, path: !isEmpty(search[0]) ? search[0] : '', }), }, diff --git a/x-pack/plugins/security_solution/public/management/common/constants.ts b/x-pack/plugins/security_solution/public/management/common/constants.ts index 2ed00309992a8b..f6b147d729322f 100644 --- a/x-pack/plugins/security_solution/public/management/common/constants.ts +++ b/x-pack/plugins/security_solution/public/management/common/constants.ts @@ -5,18 +5,15 @@ * 2.0. */ +import { MANAGEMENT_PATH } from '../../../common/constants'; import { ManagementStoreGlobalNamespace, AdministrationSubTab } from '../types'; -import { APP_ID } from '../../../common/constants'; -import { SecurityPageName } from '../../app/types'; // --[ ROUTING ]--------------------------------------------------------------------------- -export const MANAGEMENT_APP_ID = `${APP_ID}:${SecurityPageName.administration}`; -export const MANAGEMENT_ROUTING_ROOT_PATH = ''; -export const MANAGEMENT_ROUTING_ENDPOINTS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.endpoints})`; -export const MANAGEMENT_ROUTING_POLICIES_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.policies})`; -export const MANAGEMENT_ROUTING_POLICY_DETAILS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId`; -export const MANAGEMENT_ROUTING_TRUSTED_APPS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.trustedApps})`; -export const MANAGEMENT_ROUTING_EVENT_FILTERS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.eventFilters})`; +export const MANAGEMENT_ROUTING_ENDPOINTS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.endpoints})`; +export const MANAGEMENT_ROUTING_POLICIES_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.policies})`; +export const MANAGEMENT_ROUTING_POLICY_DETAILS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId`; +export const MANAGEMENT_ROUTING_TRUSTED_APPS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.trustedApps})`; +export const MANAGEMENT_ROUTING_EVENT_FILTERS_PATH = `${MANAGEMENT_PATH}/:tabName(${AdministrationSubTab.eventFilters})`; // --[ STORE ]--------------------------------------------------------------------------- /** The SIEM global store namespace where the management state will be mounted */ diff --git a/x-pack/plugins/security_solution/public/management/common/routing.test.ts b/x-pack/plugins/security_solution/public/management/common/routing.test.ts index a1662c21012bee..82b7a15d642e40 100644 --- a/x-pack/plugins/security_solution/public/management/common/routing.test.ts +++ b/x-pack/plugins/security_solution/public/management/common/routing.test.ts @@ -98,27 +98,35 @@ describe('routing', () => { describe('getTrustedAppsListPath()', () => { it('builds proper path when no parameters provided', () => { - expect(getTrustedAppsListPath()).toEqual('/trusted_apps'); + expect(getTrustedAppsListPath()).toEqual('/administration/trusted_apps'); }); it('builds proper path when empty parameters provided', () => { - expect(getTrustedAppsListPath({})).toEqual('/trusted_apps'); + expect(getTrustedAppsListPath({})).toEqual('/administration/trusted_apps'); }); it('builds proper path when only page size provided', () => { - expect(getTrustedAppsListPath({ page_size: 20 })).toEqual('/trusted_apps?page_size=20'); + expect(getTrustedAppsListPath({ page_size: 20 })).toEqual( + '/administration/trusted_apps?page_size=20' + ); }); it('builds proper path when only page index provided', () => { - expect(getTrustedAppsListPath({ page_index: 2 })).toEqual('/trusted_apps?page_index=2'); + expect(getTrustedAppsListPath({ page_index: 2 })).toEqual( + '/administration/trusted_apps?page_index=2' + ); }); it('builds proper path when only "show" provided', () => { - expect(getTrustedAppsListPath({ show: 'create' })).toEqual('/trusted_apps?show=create'); + expect(getTrustedAppsListPath({ show: 'create' })).toEqual( + '/administration/trusted_apps?show=create' + ); }); it('builds proper path when only view type provided', () => { - expect(getTrustedAppsListPath({ view_type: 'list' })).toEqual('/trusted_apps?view_type=list'); + expect(getTrustedAppsListPath({ view_type: 'list' })).toEqual( + '/administration/trusted_apps?view_type=list' + ); }); it('builds proper path when all params provided', () => { @@ -131,7 +139,7 @@ describe('routing', () => { }; expect(getTrustedAppsListPath(location)).toEqual( - '/trusted_apps?page_index=2&page_size=20&view_type=list&show=create' + '/administration/trusted_apps?page_index=2&page_size=20&view_type=list&show=create' ); }); @@ -143,7 +151,7 @@ describe('routing', () => { view_type: 'list', }); - expect(path).toEqual('/trusted_apps?page_size=20&view_type=list&show=create'); + expect(path).toEqual('/administration/trusted_apps?page_size=20&view_type=list&show=create'); }); it('builds proper path when page size is equal to default', () => { @@ -154,7 +162,7 @@ describe('routing', () => { view_type: 'list', }); - expect(path).toEqual('/trusted_apps?page_index=2&view_type=list&show=create'); + expect(path).toEqual('/administration/trusted_apps?page_index=2&view_type=list&show=create'); }); it('builds proper path when "show" is equal to default', () => { @@ -165,7 +173,7 @@ describe('routing', () => { view_type: 'list', }); - expect(path).toEqual('/trusted_apps?page_index=2&page_size=20&view_type=list'); + expect(path).toEqual('/administration/trusted_apps?page_index=2&page_size=20&view_type=list'); }); it('builds proper path when view type is equal to default', () => { @@ -176,7 +184,7 @@ describe('routing', () => { view_type: 'grid', }); - expect(path).toEqual('/trusted_apps?page_index=2&page_size=20&show=create'); + expect(path).toEqual('/administration/trusted_apps?page_index=2&page_size=20&show=create'); }); it('builds proper path when params are equal to default', () => { @@ -187,7 +195,7 @@ describe('routing', () => { view_type: 'grid', }); - expect(path).toEqual('/trusted_apps'); + expect(path).toEqual('/administration/trusted_apps'); }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/components/administration_list_page.tsx b/x-pack/plugins/security_solution/public/management/components/administration_list_page.tsx index 021c900824f8df..09b47b76c486fb 100644 --- a/x-pack/plugins/security_solution/public/management/components/administration_list_page.tsx +++ b/x-pack/plugins/security_solution/public/management/components/administration_list_page.tsx @@ -6,25 +6,13 @@ */ import React, { FC, memo } from 'react'; -import { EuiPanel, EuiSpacer, CommonProps } from '@elastic/eui'; +import { EuiPanel, CommonProps } from '@elastic/eui'; import styled from 'styled-components'; import { SecurityPageName } from '../../../common/constants'; import { SecuritySolutionPageWrapper } from '../../common/components/page_wrapper'; import { HeaderPage } from '../../common/components/header_page'; -import { SecuritySolutionTabNavigation } from '../../common/components/navigation'; import { SpyRoute } from '../../common/utils/route/spy_routes'; -import { AdministrationSubTab } from '../types'; -import { - ENDPOINTS_TAB, - TRUSTED_APPS_TAB, - BETA_BADGE_LABEL, - EVENT_FILTERS_TAB, -} from '../common/translations'; -import { - getEndpointListPath, - getEventFiltersListPath, - getTrustedAppsListPath, -} from '../common/routing'; +import { BETA_BADGE_LABEL } from '../common/translations'; /** Ensure that all flyouts z-index in Administation area show the flyout header */ const EuiPanelStyled = styled(EuiPanel)` @@ -57,37 +45,6 @@ export const AdministrationListPage: FC<AdministrationListPageProps & CommonProp {actions} </HeaderPage> - <SecuritySolutionTabNavigation - navTabs={{ - [AdministrationSubTab.endpoints]: { - name: ENDPOINTS_TAB, - id: AdministrationSubTab.endpoints, - href: getEndpointListPath({ name: 'endpointList' }), - urlKey: 'administration', - pageId: SecurityPageName.administration, - disabled: false, - }, - [AdministrationSubTab.trustedApps]: { - name: TRUSTED_APPS_TAB, - id: AdministrationSubTab.trustedApps, - href: getTrustedAppsListPath(), - urlKey: 'administration', - pageId: SecurityPageName.administration, - disabled: false, - }, - [AdministrationSubTab.eventFilters]: { - name: EVENT_FILTERS_TAB, - id: AdministrationSubTab.eventFilters, - href: getEventFiltersListPath(), - urlKey: 'administration', - pageId: SecurityPageName.administration, - disabled: false, - }, - }} - /> - - <EuiSpacer /> - <EuiPanelStyled hasBorder>{children}</EuiPanelStyled> <SpyRoute pageName={SecurityPageName.administration} /> diff --git a/x-pack/plugins/security_solution/public/management/components/hooks/use_management_format_url.ts b/x-pack/plugins/security_solution/public/management/components/hooks/use_management_format_url.ts deleted file mode 100644 index a90794a075b458..00000000000000 --- a/x-pack/plugins/security_solution/public/management/components/hooks/use_management_format_url.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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 { useKibana } from '../../../common/lib/kibana'; -import { MANAGEMENT_APP_ID } from '../../common/constants'; - -/** - * Returns a full URL to the provided Management page path by using - * kibana's `getUrlForApp()` - * - * @param managementPath - */ -export const useManagementFormatUrl = (managementPath: string) => { - return `${useKibana().services.application.getUrlForApp(MANAGEMENT_APP_ID)}${managementPath}`; -}; diff --git a/x-pack/plugins/security_solution/public/management/index.ts b/x-pack/plugins/security_solution/public/management/index.ts index 2859adae97d415..326f8471aa6219 100644 --- a/x-pack/plugins/security_solution/public/management/index.ts +++ b/x-pack/plugins/security_solution/public/management/index.ts @@ -7,7 +7,7 @@ import { CoreStart } from 'kibana/public'; import { Reducer, CombinedState } from 'redux'; -import { ManagementRoutes } from './routes'; +import { routes } from './routes'; import { StartPlugins } from '../types'; import { SecuritySubPluginWithStore } from '../app/types'; import { managementReducer } from './store/reducer'; @@ -39,7 +39,7 @@ export class Management { plugins: StartPlugins ): SecuritySubPluginWithStore<'management', ManagementState> { return { - SubPluginRoutes: ManagementRoutes, + routes, store: { initialState: { management: undefined, diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_agent_status.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_agent_status.test.tsx index a860e3c45deeef..0b5ff7cc4da0f8 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_agent_status.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_agent_status.test.tsx @@ -41,7 +41,7 @@ describe('When using the EndpointAgentStatus component', () => { }; act(() => { - mockedContext.history.push('/endpoints'); + mockedContext.history.push('/administration/endpoints'); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx index c152da10293952..2919fdd15e29d7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx @@ -10,9 +10,8 @@ import { EuiLink, EuiLinkAnchorProps } from '@elastic/eui'; import { useEndpointSelector } from '../hooks'; import { nonExistingPolicies } from '../../store/selectors'; import { getPolicyDetailPath } from '../../../../common/routing'; -import { useFormatUrl } from '../../../../../common/components/link_to'; -import { SecurityPageName } from '../../../../../../common/constants'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; +import { useAppUrl } from '../../../../../common/lib/kibana/hooks'; /** * A policy link (to details) that first checks to see if the policy id exists against @@ -25,14 +24,14 @@ export const EndpointPolicyLink = memo< } >(({ policyId, children, onClick, ...otherProps }) => { const missingPolicies = useEndpointSelector(nonExistingPolicies); - const { formatUrl } = useFormatUrl(SecurityPageName.administration); + const { getAppUrl } = useAppUrl(); const { toRoutePath, toRouteUrl } = useMemo(() => { - const toPath = getPolicyDetailPath(policyId); + const path = getPolicyDetailPath(policyId); return { - toRoutePath: toPath, - toRouteUrl: formatUrl(toPath), + toRoutePath: path, + toRouteUrl: getAppUrl({ path }), }; - }, [formatUrl, policyId]); + }, [policyId, getAppUrl]); const clickHandler = useNavigateByRouterEventHandler(toRoutePath, onClick); if (missingPolicies[policyId]) { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx index 04708ea90cd349..04fd8cd715c879 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx @@ -17,7 +17,21 @@ import { endpointPageHttpMock } from '../../../mocks'; import { fireEvent } from '@testing-library/dom'; import { licenseService } from '../../../../../../common/hooks/use_license'; -jest.mock('../../../../../../common/lib/kibana'); +jest.mock('../../../../../../common/lib/kibana/kibana_react', () => { + const originalModule = jest.requireActual('../../../../../../common/lib/kibana/kibana_react'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + getUrlForApp: (appId: string, options?: { path?: string }) => + `/app/${appId}${options?.path}`, + navigateToApp: jest.fn(), + }, + }, + }), + }; +}); jest.mock('../../../../../../common/hooks/use_license'); describe('When using the Endpoint Details Actions Menu', () => { @@ -45,7 +59,7 @@ describe('When using the Endpoint Details Actions Menu', () => { act(() => { mockedContext.history.push( - '/endpoints?selected_endpoint=5fe11314-678c-413e-87a2-b4a3461878ee' + '/administration/endpoints?selected_endpoint=5fe11314-678c-413e-87a2-b4a3461878ee' ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/back_to_endpoint_details_flyout_subheader.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/back_to_endpoint_details_flyout_subheader.tsx index 7218e794f587a4..6c9ae7631e6d33 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/back_to_endpoint_details_flyout_subheader.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/back_to_endpoint_details_flyout_subheader.tsx @@ -10,14 +10,13 @@ import { i18n } from '@kbn/i18n'; import { FlyoutSubHeader, FlyoutSubHeaderProps } from './flyout_sub_header'; import { getEndpointDetailsPath } from '../../../../../common/routing'; import { useNavigateByRouterEventHandler } from '../../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; -import { useFormatUrl } from '../../../../../../common/components/link_to'; -import { SecurityPageName } from '../../../../../../../common/constants'; import { useEndpointSelector } from '../../hooks'; import { uiQueryParams } from '../../../store/selectors'; +import { useAppUrl } from '../../../../../../common/lib/kibana/hooks'; export const BackToEndpointDetailsFlyoutSubHeader = memo<{ endpointId: string }>( ({ endpointId }) => { - const { formatUrl } = useFormatUrl(SecurityPageName.administration); + const { getAppUrl } = useAppUrl(); const { show, ...currentUrlQueryParams } = useEndpointSelector(uiQueryParams); const detailsRoutePath = useMemo( @@ -37,10 +36,10 @@ export const BackToEndpointDetailsFlyoutSubHeader = memo<{ endpointId: string }> title: i18n.translate('xpack.securitySolution.endpoint.policyResponse.backLinkTitle', { defaultMessage: 'Endpoint Details', }), - href: formatUrl(detailsRoutePath), + href: getAppUrl({ path: detailsRoutePath }), onClick: backToDetailsClickHandler, }; - }, [backToDetailsClickHandler, detailsRoutePath, formatUrl]); + }, [backToDetailsClickHandler, getAppUrl, detailsRoutePath]); return ( <FlyoutSubHeader diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx index 64ea575c37d798..369b4c128e0526 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx @@ -27,11 +27,10 @@ import { POLICY_STATUS_TO_BADGE_COLOR } from '../host_constants'; import { FormattedDateAndTime } from '../../../../../common/components/endpoint/formatted_date_time'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; import { getEndpointDetailsPath } from '../../../../common/routing'; -import { SecurityPageName } from '../../../../../app/types'; -import { useFormatUrl } from '../../../../../common/components/link_to'; import { EndpointPolicyLink } from '../components/endpoint_policy_link'; import { OutOfDate } from '../components/out_of_date'; import { EndpointAgentStatus } from '../components/endpoint_agent_status'; +import { useAppUrl } from '../../../../../common/lib/kibana/hooks'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -54,26 +53,18 @@ export const EndpointDetails = memo( const policyStatus = useEndpointSelector( policyResponseStatus ) as keyof typeof POLICY_STATUS_TO_BADGE_COLOR; - const { formatUrl } = useFormatUrl(SecurityPageName.administration); + const { getAppUrl } = useAppUrl(); const [policyResponseUri, policyResponseRoutePath] = useMemo(() => { // eslint-disable-next-line @typescript-eslint/naming-convention const { selected_endpoint, show, ...currentUrlParams } = queryParams; - return [ - formatUrl( - getEndpointDetailsPath({ - name: 'endpointPolicyResponse', - ...currentUrlParams, - selected_endpoint: details.agent.id, - }) - ), - getEndpointDetailsPath({ - name: 'endpointPolicyResponse', - ...currentUrlParams, - selected_endpoint: details.agent.id, - }), - ]; - }, [details.agent.id, formatUrl, queryParams]); + const path = getEndpointDetailsPath({ + name: 'endpointPolicyResponse', + ...currentUrlParams, + selected_endpoint: details.agent.id, + }); + return [getAppUrl({ path }), path]; + }, [details.agent.id, getAppUrl, queryParams]); const policyStatusClickHandler = useNavigateByRouterEventHandler(policyResponseRoutePath); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/hooks.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/hooks.ts index 4c00c00e50dbc2..ca14dde18455b5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/hooks.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/hooks.ts @@ -13,7 +13,7 @@ import { MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_GLOBAL_NAMESPACE, } from '../../../../common/constants'; -import { useKibana } from '../../../../../common/lib/kibana'; +import { useAppUrl } from '../../../../../common/lib/kibana'; export function useEndpointSelector<TSelected>(selector: (state: EndpointState) => TSelected) { return useSelector(function (state: State) { @@ -29,15 +29,15 @@ export function useEndpointSelector<TSelected>(selector: (state: EndpointState) * Returns an object that contains Fleet app and URL information */ export const useIngestUrl = (subpath: string): { url: string; appId: string; appPath: string } => { - const { services } = useKibana(); + const { getAppUrl } = useAppUrl(); return useMemo(() => { const appPath = `#/${subpath}`; return { - url: `${services.application.getUrlForApp('fleet')}${appPath}`, + url: `${getAppUrl({ appId: 'fleet' })}${appPath}`, appId: 'fleet', appPath, }; - }, [services.application, subpath]); + }, [getAppUrl, subpath]); }; /** * Returns an object that contains Fleet app and URL information @@ -45,13 +45,13 @@ export const useIngestUrl = (subpath: string): { url: string; appId: string; app export const useAgentDetailsIngestUrl = ( agentId: string ): { url: string; appId: string; appPath: string } => { - const { services } = useKibana(); + const { getAppUrl } = useAppUrl(); return useMemo(() => { const appPath = `#/fleet/agents/${agentId}/activity`; return { - url: `${services.application.getUrlForApp('fleet')}${appPath}`, + url: `${getAppUrl({ appId: 'fleet' })}${appPath}`, appId: 'fleet', appPath, }; - }, [services.application, agentId]); + }, [getAppUrl, agentId]); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx index 408e1794ef680a..0422cbcaa4310b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx @@ -7,15 +7,13 @@ import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { MANAGEMENT_APP_ID } from '../../../../common/constants'; -import { APP_ID, SecurityPageName } from '../../../../../../common/constants'; +import { APP_ID } from '../../../../../../common/constants'; import { pagePathGetters } from '../../../../../../../fleet/public'; import { getEndpointDetailsPath } from '../../../../common/routing'; import { HostMetadata, MaybeImmutable } from '../../../../../../common/endpoint/types'; -import { useFormatUrl } from '../../../../../common/components/link_to'; import { useEndpointSelector } from './hooks'; import { agentPolicies, uiQueryParams } from '../../store/selectors'; -import { useKibana } from '../../../../../common/lib/kibana'; +import { useAppUrl } from '../../../../../common/lib/kibana/hooks'; import { ContextMenuItemNavByRouterProps } from '../components/context_menu_item_nav_by_rotuer'; import { isEndpointHostIsolated } from '../../../../../common/utils/validators'; import { useLicense } from '../../../../../common/hooks/use_license'; @@ -28,14 +26,9 @@ export const useEndpointActionItems = ( endpointMetadata: MaybeImmutable<HostMetadata> | undefined ): ContextMenuItemNavByRouterProps[] => { const isPlatinumPlus = useLicense().isPlatinumPlus(); - const { formatUrl } = useFormatUrl(SecurityPageName.administration); + const { getAppUrl } = useAppUrl(); const fleetAgentPolicies = useEndpointSelector(agentPolicies); const allCurrentUrlParams = useEndpointSelector(uiQueryParams); - const { - services: { - application: { getUrlForApp }, - }, - } = useKibana(); return useMemo<ContextMenuItemNavByRouterProps[]>(() => { if (endpointMetadata) { @@ -68,11 +61,11 @@ export const useEndpointActionItems = ( 'data-test-subj': 'unIsolateLink', icon: 'logoSecurity', key: 'unIsolateHost', - navigateAppId: MANAGEMENT_APP_ID, + navigateAppId: APP_ID, navigateOptions: { path: endpointUnIsolatePath, }, - href: formatUrl(endpointUnIsolatePath), + href: getAppUrl({ path: endpointUnIsolatePath }), children: ( <FormattedMessage id="xpack.securitySolution.endpoint.actions.unIsolateHost" @@ -86,11 +79,11 @@ export const useEndpointActionItems = ( 'data-test-subj': 'isolateLink', icon: 'logoSecurity', key: 'isolateHost', - navigateAppId: MANAGEMENT_APP_ID, + navigateAppId: APP_ID, navigateOptions: { path: endpointIsolatePath, }, - href: formatUrl(endpointIsolatePath), + href: getAppUrl({ path: endpointIsolatePath }), children: ( <FormattedMessage id="xpack.securitySolution.endpoint.actions.isolateHost" @@ -107,8 +100,8 @@ export const useEndpointActionItems = ( icon: 'logoSecurity', key: 'hostDetailsLink', navigateAppId: APP_ID, - navigateOptions: { path: `hosts/${endpointHostName}` }, - href: `${getUrlForApp('securitySolution')}/hosts/${endpointHostName}`, + navigateOptions: { path: `/hosts/${endpointHostName}` }, + href: getAppUrl({ path: `/hosts/${endpointHostName}` }), children: ( <FormattedMessage id="xpack.securitySolution.endpoint.actions.hostDetails" @@ -128,7 +121,7 @@ export const useEndpointActionItems = ( })[1] }`, }, - href: `${getUrlForApp('fleet')}#${ + href: `${getAppUrl({ appId: 'fleet' })}#${ pagePathGetters.policy_details({ policyId: fleetAgentPolicies[endpointPolicyId], })[1] @@ -153,7 +146,7 @@ export const useEndpointActionItems = ( })[1] }`, }, - href: `${getUrlForApp('fleet')}#${ + href: `${getAppUrl({ appId: 'fleet' })}#${ pagePathGetters.agent_details({ agentId: fleetAgentId, })[1] @@ -177,7 +170,7 @@ export const useEndpointActionItems = ( })[1] }/activity?openReassignFlyout=true`, }, - href: `${getUrlForApp('fleet')}#${ + href: `${getAppUrl({ appId: 'fleet' })}#${ pagePathGetters.agent_details({ agentId: fleetAgentId, })[1] @@ -193,12 +186,5 @@ export const useEndpointActionItems = ( } return []; - }, [ - allCurrentUrlParams, - endpointMetadata, - fleetAgentPolicies, - formatUrl, - getUrlForApp, - isPlatinumPlus, - ]); + }, [allCurrentUrlParams, endpointMetadata, fleetAgentPolicies, getAppUrl, isPlatinumPlus]); }; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index 4869ce84fad2cf..7bfd77e7dd9754 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -42,6 +42,7 @@ import { import { getCurrentIsolationRequestState } from '../store/selectors'; import { licenseService } from '../../../../common/hooks/use_license'; import { FleetActionGenerator } from '../../../../../common/endpoint/data_generators/fleet_action_generator'; +import { APP_PATH, MANAGEMENT_PATH } from '../../../../../common/constants'; // not sure why this can't be imported from '../../../../common/mock/formatted_relative'; // but sure enough it needs to be inline in this one file @@ -94,7 +95,7 @@ describe('when on the endpoint list page', () => { ({ history, store, coreStart, middlewareSpy } = mockedContext); render = () => mockedContext.render(<EndpointList />); reactTestingLibrary.act(() => { - history.push('/endpoints'); + history.push(`${MANAGEMENT_PATH}/endpoints`); }); // Because `.../common/lib/kibana` was mocked, we need to alter these hooks (which are jest.MockFunctions) @@ -442,7 +443,9 @@ describe('when on the endpoint list page', () => { }); const firstPolicyName = (await renderResult.findAllByTestId('policyNameCellLink'))[0]; expect(firstPolicyName).not.toBeNull(); - expect(firstPolicyName.getAttribute('href')).toContain(`policy/${firstPolicyID}`); + expect(firstPolicyName.getAttribute('href')).toEqual( + `${APP_PATH}${MANAGEMENT_PATH}/policy/${firstPolicyID}` + ); }); describe('when the user clicks the first hostname in the table', () => { @@ -657,7 +660,7 @@ describe('when on the endpoint list page', () => { mockEndpointListApi(); reactTestingLibrary.act(() => { - history.push('/endpoints?selected_endpoint=1'); + history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1`); }); renderAndWaitForData = async () => { @@ -682,7 +685,7 @@ describe('when on the endpoint list page', () => { const policyDetailsLink = await renderResult.findByTestId('policyDetailsValue'); expect(policyDetailsLink).not.toBeNull(); expect(policyDetailsLink.getAttribute('href')).toEqual( - `/policy/${hostDetails.metadata.Endpoint.policy.applied.id}` + `${APP_PATH}${MANAGEMENT_PATH}/policy/${hostDetails.metadata.Endpoint.policy.applied.id}` ); }); @@ -704,7 +707,7 @@ describe('when on the endpoint list page', () => { }); const changedUrlAction = await userChangedUrlChecker; expect(changedUrlAction.payload.pathname).toEqual( - `/policy/${hostDetails.metadata.Endpoint.policy.applied.id}` + `${MANAGEMENT_PATH}/policy/${hostDetails.metadata.Endpoint.policy.applied.id}` ); }); @@ -713,7 +716,7 @@ describe('when on the endpoint list page', () => { const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink).not.toBeNull(); expect(policyStatusLink.getAttribute('href')).toEqual( - '/endpoints?page_index=0&page_size=10&selected_endpoint=1&show=policy_response' + `${APP_PATH}${MANAGEMENT_PATH}/endpoints?page_index=0&page_size=10&selected_endpoint=1&show=policy_response` ); }); @@ -1003,8 +1006,8 @@ describe('when on the endpoint list page', () => { it('should include the back to details link', async () => { const subHeaderBackLink = await renderResult.findByTestId('flyoutSubHeaderBackButton'); expect(subHeaderBackLink.textContent).toBe('Endpoint Details'); - expect(subHeaderBackLink.getAttribute('href')).toBe( - '/endpoints?page_index=0&page_size=10&selected_endpoint=1' + expect(subHeaderBackLink.getAttribute('href')).toEqual( + `${APP_PATH}${MANAGEMENT_PATH}/endpoints?page_index=0&page_size=10&selected_endpoint=1` ); }); @@ -1055,7 +1058,7 @@ describe('when on the endpoint list page', () => { beforeEach(async () => { getKibanaServicesMock.mockReturnValue(coreStart); reactTestingLibrary.act(() => { - history.push('/endpoints?selected_endpoint=1&show=isolate'); + history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1&show=isolate`); }); renderResult = await renderAndWaitForData(); // Need to reset `http.post` and adjust it so that the mock for http host @@ -1073,12 +1076,12 @@ describe('when on the endpoint list page', () => { const backButtonLink = renderResult.getByTestId('flyoutSubHeaderBackButton'); expect(backButtonLink.getAttribute('href')).toEqual( - getEndpointDetailsPath({ + `${APP_PATH}${getEndpointDetailsPath({ name: 'endpointDetails', page_index: '0', page_size: '10', selected_endpoint: '1', - }) + })}` ); const changeUrlAction = middlewareSpy.waitForAction('userChangedUrl'); @@ -1088,7 +1091,7 @@ describe('when on the endpoint list page', () => { }); expect((await changeUrlAction).payload).toMatchObject({ - pathname: '/endpoints', + pathname: `${MANAGEMENT_PATH}/endpoints`, search: '?page_index=0&page_size=10&selected_endpoint=1', }); }); @@ -1101,7 +1104,7 @@ describe('when on the endpoint list page', () => { }); expect((await changeUrlAction).payload).toMatchObject({ - pathname: '/endpoints', + pathname: `${MANAGEMENT_PATH}/endpoints`, search: '?page_index=0&page_size=10&selected_endpoint=1', }); }); @@ -1121,7 +1124,7 @@ describe('when on the endpoint list page', () => { }); expect((await changeUrlAction).payload).toMatchObject({ - pathname: '/endpoints', + pathname: `${MANAGEMENT_PATH}/endpoints`, search: '?page_index=0&page_size=10&selected_endpoint=1', }); }); @@ -1149,7 +1152,7 @@ describe('when on the endpoint list page', () => { }); expect((await changeUrlAction).payload).toMatchObject({ - pathname: '/endpoints', + pathname: `${MANAGEMENT_PATH}/endpoints`, search: '?page_index=0&page_size=10', }); @@ -1207,17 +1210,7 @@ describe('when on the endpoint list page', () => { mockEndpointListApi(); reactTestingLibrary.act(() => { - history.push('/endpoints'); - }); - - coreStart.application.getUrlForApp.mockImplementation((appName) => { - switch (appName) { - case 'securitySolution': - return '/app/security'; - case 'fleet': - return '/app/fleet'; - } - return appName; + history.push(`${MANAGEMENT_PATH}/endpoints`); }); renderResult = render(); @@ -1238,19 +1231,19 @@ describe('when on the endpoint list page', () => { it('navigates to the Host Details Isolate flyout', async () => { const isolateLink = await renderResult.findByTestId('isolateLink'); expect(isolateLink.getAttribute('href')).toEqual( - getEndpointDetailsPath({ + `${APP_PATH}${getEndpointDetailsPath({ name: 'endpointIsolate', page_index: '0', page_size: '10', selected_endpoint: hostInfo.metadata.agent.id, - }) + })}` ); }); it('navigates to the Security Solution Host Details page', async () => { const hostLink = await renderResult.findByTestId('hostLink'); expect(hostLink.getAttribute('href')).toEqual( - `/app/security/hosts/${hostInfo.metadata.host.hostname}` + `${APP_PATH}/hosts/${hostInfo.metadata.host.hostname}` ); }); it('navigates to the Ingest Agent Policy page', async () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index 9316d2539d1338..7a553cfa8a32a5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -47,6 +47,7 @@ import { import { SecurityPageName } from '../../../../app/types'; import { getEndpointListPath, getEndpointDetailsPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; +import { useAppUrl } from '../../../../common/lib/kibana/hooks'; import { EndpointAction } from '../store/action'; import { EndpointPolicyLink } from './components/endpoint_policy_link'; import { OutOfDate } from './components/out_of_date'; @@ -121,7 +122,8 @@ export const EndpointList = () => { endpointsTotalError, isTransformEnabled, } = useEndpointSelector(selector); - const { formatUrl, search } = useFormatUrl(SecurityPageName.administration); + const { search } = useFormatUrl(SecurityPageName.administration); + const { getAppUrl } = useAppUrl(); const dispatch = useDispatch<(a: EndpointAction) => void>(); // cap ability to page at 10k records. (max_result_window) const maxPageCount = totalItemCount > MAX_PAGINATED_ITEM ? MAX_PAGINATED_ITEM : totalItemCount; @@ -160,13 +162,17 @@ export const EndpointList = () => { }/add-integration`, state: { onCancelNavigateTo: [ - 'securitySolution:administration', - { path: getEndpointListPath({ name: 'endpointList' }) }, + 'securitySolution', + { + path: getEndpointListPath({ name: 'endpointList' }), + }, ], - onCancelUrl: formatUrl(getEndpointListPath({ name: 'endpointList' })), + onCancelUrl: getAppUrl({ path: getEndpointListPath({ name: 'endpointList' }) }), onSaveNavigateTo: [ - 'securitySolution:administration', - { path: getEndpointListPath({ name: 'endpointList' }) }, + 'securitySolution', + { + path: getEndpointListPath({ name: 'endpointList' }), + }, ], }, } @@ -201,7 +207,7 @@ export const EndpointList = () => { path: `#/policies/${selectedPolicyId}?openEnrollmentFlyout=true`, state: { onDoneNavigateTo: [ - 'securitySolution:administration', + 'securitySolution', { path: getEndpointListPath({ name: 'endpointList' }) }, ], }, @@ -257,7 +263,7 @@ export const EndpointList = () => { }, search ); - const toRouteUrl = formatUrl(toRoutePath); + const toRouteUrl = getAppUrl({ path: toRoutePath }); return ( <EuiToolTip content={hostname} anchorClassName="eui-textTruncate"> <EndpointListNavLink @@ -336,7 +342,7 @@ export const EndpointList = () => { ...queryParams, selected_endpoint: item.metadata.agent.id, }); - const toRouteUrl = formatUrl(toRoutePath); + const toRouteUrl = getAppUrl({ path: toRoutePath }); return ( <EuiBadge color={POLICY_STATUS_TO_BADGE_COLOR[policy.status]} @@ -416,7 +422,7 @@ export const EndpointList = () => { ], }, ]; - }, [queryParams, search, formatUrl, PAD_LEFT]); + }, [queryParams, search, getAppUrl, PAD_LEFT]); const renderTableOrEmptyState = useMemo(() => { if (endpointsExist || areEndpointsEnrolling) { diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.test.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.test.ts index 530a18cd8a3120..c7da244c49634b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/middleware.test.ts @@ -81,7 +81,7 @@ describe('Event filters middleware', () => { store.dispatch({ type: 'userChangedUrl', payload: { - pathname: '/event_filters', + pathname: '/administration/event_filters', search: searchParams, hash: '', key: 'ylsd7h', diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts index 2bfc6b43788390..1b856f54d16a9b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/store/reducer.test.ts @@ -128,7 +128,7 @@ describe('event filters reducer', () => { describe('UserChangedUrl', () => { const userChangedUrlAction = ( search: string = '', - pathname = '/event_filters' + pathname = '/administration/event_filters' ): UserChangedUrl => ({ type: 'userChangedUrl', payload: { search, pathname, hash: '' }, diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filter_delete_modal.test.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filter_delete_modal.test.tsx index c594aaa5c7e19d..ed18c084c2a051 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filter_delete_modal.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/event_filter_delete_modal.test.tsx @@ -47,7 +47,7 @@ describe('When event filters delete modal is shown', () => { renderResult = mockedContext.render(<EventFilterDeleteModal />); await act(async () => { - history.push('/event_filters'); + history.push('/administration/event_filters'); await waitForAction('userChangedUrl'); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.test.tsx index 59d409874c5615..d44ce7a136fdf6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/event_filters_list_page.test.tsx @@ -41,7 +41,7 @@ describe('When on the Event Filters List Page', () => { waitForAction = mockedContext.middlewareSpy.waitForAction; act(() => { - history.push('/event_filters'); + history.push('/administration/event_filters'); }); }); @@ -156,7 +156,7 @@ describe('When on the Event Filters List Page', () => { describe('And search is dispatched', () => { beforeEach(async () => { act(() => { - history.push('/event_filters?filter=test'); + history.push('/administration/event_filters?filter=test'); }); renderResult = render(); await act(async () => { @@ -180,7 +180,7 @@ describe('When on the Event Filters List Page', () => { beforeEach(async () => { renderResult = render(); act(() => { - history.push('/event_filters', { + history.push('/administration/event_filters', { onBackButtonNavigateTo: [{ appId: 'appId' }], backButtonLabel: 'back to fleet', backButtonUrl: '/fleet', @@ -196,7 +196,7 @@ describe('When on the Event Filters List Page', () => { it('back button is not present', () => { act(() => { - history.push('/event_filters'); + history.push('/administration/event_filters'); }); expect(renderResult.queryByTestId('backToOrigin')).toBeNull(); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/index.test.tsx index 68c25e55dc1c95..9f2ed3618b06d7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.test.tsx @@ -16,21 +16,11 @@ jest.mock('../../common/hooks/endpoint/ingest_enabled'); describe('when in the Admistration tab', () => { let render: () => ReturnType<AppContextTestRender['render']>; - let coreStart: AppContextTestRender['coreStart']; beforeEach(() => { const mockedContext = createAppRootMockRenderer(); - coreStart = mockedContext.coreStart; render = () => mockedContext.render(<ManagementContainer />); - coreStart.http.get.mockImplementation(() => - Promise.resolve({ - response: [ - { - name: 'endpoint', - }, - ], - }) - ); + mockedContext.history.push('/administration/endpoints'); }); it('should display the No Permissions view when Ingest is OFF', async () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/index.tsx b/x-pack/plugins/security_solution/public/management/pages/index.tsx index 8273f1a6e55c20..b3bee78161f392 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.tsx @@ -6,25 +6,24 @@ */ import React, { memo } from 'react'; -import { Route, Switch, useHistory } from 'react-router-dom'; +import { Route, Switch, Redirect } from 'react-router-dom'; import { EuiEmptyPrompt, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { MANAGEMENT_ROUTING_ENDPOINTS_PATH, MANAGEMENT_ROUTING_EVENT_FILTERS_PATH, MANAGEMENT_ROUTING_POLICIES_PATH, - MANAGEMENT_ROUTING_ROOT_PATH, MANAGEMENT_ROUTING_TRUSTED_APPS_PATH, } from '../common/constants'; import { NotFoundPage } from '../../app/404'; import { EndpointsContainer } from './endpoint_hosts'; import { PolicyContainer } from './policy'; import { TrustedAppsContainer } from './trusted_apps'; -import { getEndpointListPath } from '../common/routing'; -import { SecurityPageName } from '../../../common/constants'; +import { MANAGEMENT_PATH, SecurityPageName } from '../../../common/constants'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { useIngestEnabledCheck } from '../../common/hooks/endpoint/ingest_enabled'; import { EventFiltersContainer } from './event_filters'; +import { getEndpointListPath } from '../common/routing'; const NoPermissions = memo(() => { return ( @@ -56,7 +55,6 @@ const NoPermissions = memo(() => { NoPermissions.displayName = 'NoPermissions'; export const ManagementContainer = memo(() => { - const history = useHistory(); const { allEnabled: isIngestEnabled } = useIngestEnabledCheck(); if (!isIngestEnabled) { @@ -70,14 +68,9 @@ export const ManagementContainer = memo(() => { <Route path={MANAGEMENT_ROUTING_TRUSTED_APPS_PATH} component={TrustedAppsContainer} /> <Route path={MANAGEMENT_ROUTING_EVENT_FILTERS_PATH} component={EventFiltersContainer} /> - <Route - path={MANAGEMENT_ROUTING_ROOT_PATH} - exact - render={() => { - history.replace(getEndpointListPath({ name: 'endpointList' })); - return null; - }} - /> + <Route path={MANAGEMENT_PATH} exact> + <Redirect to={getEndpointListPath({ name: 'endpointList' })} /> + </Route> <Route path="*" component={NotFoundPage} /> </Switch> ); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_event_filters_card.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_event_filters_card.tsx index 5588cdbe81e3ed..22e1c3a612eb7c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_event_filters_card.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_event_filters_card.tsx @@ -6,7 +6,6 @@ */ import React, { memo, useMemo, useState, useEffect, useRef } from 'react'; -import { ApplicationStart, CoreStart } from 'kibana/public'; import { EuiPanel, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -14,27 +13,24 @@ import { PackageCustomExtensionComponentProps, pagePathGetters, } from '../../../../../../../../../fleet/public'; -import { useKibana } from '../../../../../../../../../../../src/plugins/kibana_react/public'; import { getEventFiltersListPath } from '../../../../../../common/routing'; import { GetExceptionSummaryResponse, ListPageRouteState, } from '../../../../../../../../common/endpoint/types'; import { INTEGRATIONS_PLUGIN_ID } from '../../../../../../../../../fleet/common'; -import { MANAGEMENT_APP_ID } from '../../../../../../common/constants'; -import { useToasts } from '../../../../../../../common/lib/kibana'; +import { useKibana, useToasts } from '../../../../../../../common/lib/kibana'; +import { useAppUrl } from '../../../../../../../common/lib/kibana/hooks'; import { LinkWithIcon } from './link_with_icon'; import { ExceptionItemsSummary } from './exception_items_summary'; import { EventFiltersHttpService } from '../../../../../event_filters/service'; import { StyledEuiFlexGridGroup, StyledEuiFlexGridItem } from './styled_components'; export const FleetEventFiltersCard = memo<PackageCustomExtensionComponentProps>(({ pkgkey }) => { + const { getAppUrl } = useAppUrl(); const { - services: { - application: { getUrlForApp }, - http, - }, - } = useKibana<CoreStart & { application: ApplicationStart }>(); + services: { http }, + } = useKibana(); const toasts = useToasts(); const [stats, setStats] = useState<GetExceptionSummaryResponse | undefined>(); const eventFiltersListUrlPath = getEventFiltersListPath(); @@ -82,11 +78,9 @@ export const FleetEventFiltersCard = memo<PackageCustomExtensionComponentProps>( path: fleetPackageCustomUrlPath, }, ], - backButtonUrl: getUrlForApp(INTEGRATIONS_PLUGIN_ID, { - path: fleetPackageCustomUrlPath, - }), + backButtonUrl: getAppUrl({ appId: INTEGRATIONS_PLUGIN_ID, path: fleetPackageCustomUrlPath }), }; - }, [getUrlForApp, pkgkey]); + }, [getAppUrl, pkgkey]); return ( <EuiPanel paddingSize="l"> @@ -107,8 +101,9 @@ export const FleetEventFiltersCard = memo<PackageCustomExtensionComponentProps>( <StyledEuiFlexGridItem gridarea="link" alignitems="flex-end"> <> <LinkWithIcon - appId={MANAGEMENT_APP_ID} - href={getUrlForApp(MANAGEMENT_APP_ID, { path: eventFiltersListUrlPath })} + href={getAppUrl({ + path: eventFiltersListUrlPath, + })} appPath={eventFiltersListUrlPath} appState={eventFiltersRouteState} data-test-subj="linkToEventFilters" diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_trusted_apps_card.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_trusted_apps_card.tsx index f1c9cb13a27dc5..4f10eceb6781c6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_trusted_apps_card.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/endpoint_package_custom_extension/components/fleet_trusted_apps_card.tsx @@ -6,7 +6,6 @@ */ import React, { memo, useMemo, useState, useEffect, useRef } from 'react'; -import { ApplicationStart, CoreStart } from 'kibana/public'; import { EuiPanel, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -14,27 +13,25 @@ import { PackageCustomExtensionComponentProps, pagePathGetters, } from '../../../../../../../../../fleet/public'; -import { useKibana } from '../../../../../../../../../../../src/plugins/kibana_react/public'; import { getTrustedAppsListPath } from '../../../../../../common/routing'; import { ListPageRouteState, GetExceptionSummaryResponse, } from '../../../../../../../../common/endpoint/types'; import { INTEGRATIONS_PLUGIN_ID } from '../../../../../../../../../fleet/common'; -import { MANAGEMENT_APP_ID } from '../../../../../../common/constants'; -import { useToasts } from '../../../../../../../common/lib/kibana'; + +import { useAppUrl } from '../../../../../../../common/lib/kibana/hooks'; +import { useKibana, useToasts } from '../../../../../../../common/lib/kibana'; import { LinkWithIcon } from './link_with_icon'; import { ExceptionItemsSummary } from './exception_items_summary'; import { TrustedAppsHttpService } from '../../../../../trusted_apps/service'; import { StyledEuiFlexGridGroup, StyledEuiFlexGridItem } from './styled_components'; export const FleetTrustedAppsCard = memo<PackageCustomExtensionComponentProps>(({ pkgkey }) => { + const { getAppUrl } = useAppUrl(); const { - services: { - application: { getUrlForApp }, - http, - }, - } = useKibana<CoreStart & { application: ApplicationStart }>(); + services: { http }, + } = useKibana(); const toasts = useToasts(); const [stats, setStats] = useState<GetExceptionSummaryResponse | undefined>(); const trustedAppsApi = useMemo(() => new TrustedAppsHttpService(http), [http]); @@ -83,11 +80,9 @@ export const FleetTrustedAppsCard = memo<PackageCustomExtensionComponentProps>(( path: fleetPackageCustomUrlPath, }, ], - backButtonUrl: getUrlForApp(INTEGRATIONS_PLUGIN_ID, { - path: fleetPackageCustomUrlPath, - }), + backButtonUrl: getAppUrl({ appId: INTEGRATIONS_PLUGIN_ID, path: fleetPackageCustomUrlPath }), }; - }, [getUrlForApp, pkgkey]); + }, [getAppUrl, pkgkey]); return ( <EuiPanel paddingSize="l"> <StyledEuiFlexGridGroup alignItems="baseline" justifyContent="center"> @@ -107,8 +102,9 @@ export const FleetTrustedAppsCard = memo<PackageCustomExtensionComponentProps>(( <StyledEuiFlexGridItem gridarea="link" alignitems="flex-end"> <> <LinkWithIcon - appId={MANAGEMENT_APP_ID} - href={getUrlForApp(MANAGEMENT_APP_ID, { path: trustedAppsListUrlPath })} + href={getAppUrl({ + path: trustedAppsListUrlPath, + })} appPath={trustedAppsListUrlPath} appState={trustedAppRouteState} data-test-subj="linkToTrustedApps" diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx index 1766048a3985aa..93cf0f370a7159 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx @@ -16,7 +16,6 @@ import { getPolicyDetailPath, getEndpointListPath } from '../../../common/routin import { policyListApiPathHandlers } from '../store/test_mock_utils'; import { licenseService } from '../../../../common/hooks/use_license'; -jest.mock('../../../../common/components/link_to'); jest.mock('../../../../common/hooks/use_license'); describe('Policy Details', () => { @@ -130,7 +129,7 @@ describe('Policy Details', () => { const backToListLink = policyView.find('LinkIcon[dataTestSubj="policyDetailsBackLink"]'); expect(backToListLink.prop('iconType')).toBe('arrowLeft'); - expect(backToListLink.prop('href')).toBe(endpointListPath); + expect(backToListLink.prop('href')).toBe(`/app/security${endpointListPath}`); expect(backToListLink.text()).toBe('Back to endpoint hosts'); const pageTitle = policyView.find('h1[data-test-subj="header-page-title"]'); @@ -172,7 +171,7 @@ describe('Policy Details', () => { cancelbutton.simulate('click', { button: 0 }); const navigateToAppMockedCalls = coreStart.application.navigateToApp.mock.calls; expect(navigateToAppMockedCalls[navigateToAppMockedCalls.length - 1]).toEqual([ - 'securitySolution:administration', + 'securitySolution', { path: endpointListPath }, ]); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index e9cdd16554f33b..b31ec47fdfc49a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -38,9 +38,8 @@ import { AppAction } from '../../../../common/store/actions'; import { SpyRoute } from '../../../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../../app/types'; import { getEndpointListPath } from '../../../common/routing'; -import { useFormatUrl } from '../../../../common/components/link_to'; import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; -import { MANAGEMENT_APP_ID } from '../../../common/constants'; +import { APP_ID } from '../../../../../common/constants'; import { PolicyDetailsRouteState } from '../../../../../common/endpoint/types'; import { SecuritySolutionPageWrapper } from '../../../../common/components/page_wrapper'; import { HeaderPage } from '../../../../common/components/header_page'; @@ -73,7 +72,6 @@ export const PolicyDetails = React.memo(() => { }, } = useKibana<{ application: ApplicationStart }>(); const toasts = useToasts(); - const { formatUrl } = useFormatUrl(SecurityPageName.administration); const { state: locationRouteState } = useLocation<PolicyDetailsRouteState>(); // Store values @@ -128,7 +126,7 @@ export const PolicyDetails = React.memo(() => { const routingOnCancelNavigateTo = routeState?.onCancelNavigateTo; const navigateToAppArguments = useMemo((): Parameters<ApplicationStart['navigateToApp']> => { - return routingOnCancelNavigateTo ?? [MANAGEMENT_APP_ID, { path: hostListRouterPath }]; + return routingOnCancelNavigateTo ?? [APP_ID, { path: hostListRouterPath }]; }, [hostListRouterPath, routingOnCancelNavigateTo]); const handleCancelOnClick = useNavigateToAppEventHandler(...navigateToAppArguments); @@ -208,8 +206,7 @@ export const PolicyDetails = React.memo(() => { defaultMessage: 'Back to endpoint hosts', } ), - href: formatUrl(hostListRouterPath), - pageId: SecurityPageName.administration, + pageId: SecurityPageName.endpoints, dataTestSubj: 'policyDetailsBackLink', }} > diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx index c17d6df36be68e..6374ba3bc4f5f3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx @@ -46,7 +46,7 @@ export const MalwareProtections = React.memo(() => { defaultMessage="View {detectionRulesLink}. Prebuilt rules are tagged “Elastic” on the Detection Rules page." values={{ detectionRulesLink: ( - <LinkToApp appId={`${APP_ID}:${SecurityPageName.detections}`} appPath={`/rules`}> + <LinkToApp appId={APP_ID} deepLinkId={SecurityPageName.rules}> <FormattedMessage id="xpack.securitySolution.endpoint.policy.details.detectionRulesLink" defaultMessage="related detection rules" diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx index 60d20665a6827e..70f41015bc257a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/ransomware.tsx @@ -44,7 +44,7 @@ export const Ransomware = React.memo(() => { defaultMessage="View {detectionRulesLink}. Prebuilt rules are tagged “Elastic” on the Detection Rules page." values={{ detectionRulesLink: ( - <LinkToApp appId={`${APP_ID}:${SecurityPageName.detections}`} appPath={`/rules`}> + <LinkToApp appId={APP_ID} deepLinkId={SecurityPageName.rules}> <FormattedMessage id="xpack.securitySolution.endpoint.policy.details.detectionRulesLink" defaultMessage="related detection rules" diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.test.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.test.ts index ed45d077dd0cad..9624987c8af567 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/middleware.test.ts @@ -124,7 +124,9 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(createGetTrustedListAppsResponse(pagination)); - store.dispatch(createUserChangedUrlAction('/trusted_apps', '?page_index=2&page_size=50')); + store.dispatch( + createUserChangedUrlAction('/administration/trusted_apps', '?page_index=2&page_size=50') + ); expect(store.getState()).toStrictEqual({ ...initialState, @@ -161,11 +163,15 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(createGetTrustedListAppsResponse(pagination)); - store.dispatch(createUserChangedUrlAction('/trusted_apps', '?page_index=2&page_size=50')); + store.dispatch( + createUserChangedUrlAction('/administration/trusted_apps', '?page_index=2&page_size=50') + ); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); - store.dispatch(createUserChangedUrlAction('/trusted_apps', '?page_index=2&page_size=50')); + store.dispatch( + createUserChangedUrlAction('/administration/trusted_apps', '?page_index=2&page_size=50') + ); expect(service.getTrustedAppsList).toBeCalledTimes(2); expect(store.getState()).toStrictEqual({ @@ -186,7 +192,7 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(createGetTrustedListAppsResponse(pagination)); - store.dispatch(createUserChangedUrlAction('/trusted_apps')); + store.dispatch(createUserChangedUrlAction('/administration/trusted_apps')); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); @@ -227,7 +233,9 @@ describe('middleware', () => { body: createServerApiError('Internal Server Error'), }); - store.dispatch(createUserChangedUrlAction('/trusted_apps', '?page_index=2&page_size=50')); + store.dispatch( + createUserChangedUrlAction('/administration/trusted_apps', '?page_index=2&page_size=50') + ); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); @@ -281,7 +289,7 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(getTrustedAppsListResponse); service.deleteTrustedApp.mockResolvedValue(); - store.dispatch(createUserChangedUrlAction('/trusted_apps')); + store.dispatch(createUserChangedUrlAction('/administration/trusted_apps')); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); @@ -300,7 +308,7 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(getTrustedAppsListResponse); service.deleteTrustedApp.mockResolvedValue(); - store.dispatch(createUserChangedUrlAction('/trusted_apps')); + store.dispatch(createUserChangedUrlAction('/administration/trusted_apps')); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); @@ -340,7 +348,7 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(getTrustedAppsListResponse); service.deleteTrustedApp.mockResolvedValue(); - store.dispatch(createUserChangedUrlAction('/trusted_apps')); + store.dispatch(createUserChangedUrlAction('/administration/trusted_apps')); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); @@ -381,7 +389,7 @@ describe('middleware', () => { service.getTrustedAppsList.mockResolvedValue(getTrustedAppsListResponse); service.deleteTrustedApp.mockRejectedValue({ body: notFoundError }); - store.dispatch(createUserChangedUrlAction('/trusted_apps')); + store.dispatch(createUserChangedUrlAction('/administration/trusted_apps')); await spyMiddleware.waitForAction('trustedAppsListResourceStateChanged'); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts index 42659e5cc34988..ac4d29a6016b2a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/store/reducer.test.ts @@ -30,7 +30,7 @@ describe('reducer', () => { const result = trustedAppsPageReducer( initialState, createUserChangedUrlAction( - '/trusted_apps', + '/administration/trusted_apps', '?page_index=5&page_size=50&show=create&view_type=list&filter=test' ) ); @@ -55,7 +55,10 @@ describe('reducer', () => { ...initialState, location: { page_index: 5, page_size: 50, view_type: 'grid', filter: '' }, }, - createUserChangedUrlAction('/trusted_apps', '?page_index=b&page_size=60&show=a&view_type=c') + createUserChangedUrlAction( + '/administration/trusted_apps', + '?page_index=b&page_size=60&show=a&view_type=c' + ) ); expect(result).toStrictEqual({ ...initialState, active: true }); @@ -67,7 +70,7 @@ describe('reducer', () => { ...initialState, location: { page_index: 5, page_size: 50, view_type: 'grid', filter: '' }, }, - createUserChangedUrlAction('/trusted_apps') + createUserChangedUrlAction('/administration/trusted_apps') ); expect(result).toStrictEqual({ ...initialState, active: true }); @@ -76,7 +79,7 @@ describe('reducer', () => { it('makes page state inactive and resets list to uninitialised state when navigating away', () => { const result = trustedAppsPageReducer( { ...initialState, listView: createLoadedListViewWithPagination(initialNow), active: true }, - createUserChangedUrlAction('/endpoints') + createUserChangedUrlAction('/administration/endpoints') ); expect(result).toStrictEqual(initialState); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/effected_policy_select/effected_policy_select.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/effected_policy_select/effected_policy_select.tsx index 7ec8d311a9156e..99db45c0e4b846 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/effected_policy_select/effected_policy_select.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/effected_policy_select/effected_policy_select.tsx @@ -21,10 +21,8 @@ import { EuiSelectableOption } from '@elastic/eui/src/components/selectable/sele import { FormattedMessage } from '@kbn/i18n/react'; import styled from 'styled-components'; import { PolicyData } from '../../../../../../../common/endpoint/types'; -import { MANAGEMENT_APP_ID } from '../../../../../common/constants'; import { getPolicyDetailPath } from '../../../../../common/routing'; -import { useFormatUrl } from '../../../../../../common/components/link_to'; -import { SecurityPageName } from '../../../../../../../common/constants'; +import { useAppUrl } from '../../../../../../common/lib/kibana/hooks'; import { LinkToApp } from '../../../../../../common/components/endpoint/link_to_app'; import { useTestIdGenerator } from '../../../../../components/hooks/use_test_id_generator'; @@ -68,7 +66,7 @@ export const EffectedPolicySelect = memo<EffectedPolicySelectProps>( 'data-test-subj': dataTestSubj, ...otherSelectableProps }) => { - const { formatUrl } = useFormatUrl(SecurityPageName.administration); + const { getAppUrl } = useAppUrl(); const getTestId = useTestIdGenerator(dataTestSubj); @@ -89,8 +87,7 @@ export const EffectedPolicySelect = memo<EffectedPolicySelectProps>( ), append: ( <LinkToApp - href={formatUrl(getPolicyDetailPath(policy.id))} - appId={MANAGEMENT_APP_ID} + href={getAppUrl({ path: getPolicyDetailPath(policy.id) })} appPath={getPolicyDetailPath(policy.id)} target="_blank" > @@ -106,7 +103,7 @@ export const EffectedPolicySelect = memo<EffectedPolicySelectProps>( 'data-test-subj': `policy-${policy.id}`, })) .sort(({ label: labelA }, { label: labelB }) => labelA.localeCompare(labelB)); - }, [formatUrl, isGlobal, options, selected]); + }, [getAppUrl, isGlobal, options, selected]); const handleOnPolicySelectChange = useCallback< Required<EuiSelectableProps<OptionPolicyData>>['onChange'] diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.test.tsx index 4ed9a3c5a0119b..74f3f0524b304a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.test.tsx @@ -85,7 +85,9 @@ describe('TrustedAppsGrid', () => { createListLoadedResourceState({ pageSize: 10 }, now) ) ); - store.dispatch(createUserChangedUrlAction('/trusted_apps', '?page_index=2&page_size=50')); + store.dispatch( + createUserChangedUrlAction('/administration/trusted_apps', '?page_index=2&page_size=50') + ); expect(renderList(store).container).toMatchSnapshot(); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.test.tsx index d054061dbba31e..64efda2c90ed18 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.test.tsx @@ -92,7 +92,9 @@ describe('TrustedAppsList', () => { createListLoadedResourceState({ pageSize: 20 }, now) ) ); - store.dispatch(createUserChangedUrlAction('/trusted_apps', '?page_index=2&page_size=50')); + store.dispatch( + createUserChangedUrlAction('/administration/trusted_apps', '?page_index=2&page_size=50') + ); expect(renderList(store).container).toMatchSnapshot(); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx index adc9438f27d743..970ade80bd8db7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/trusted_apps_page.test.tsx @@ -144,7 +144,7 @@ describe('When on the Trusted Apps Page', () => { waitForAction = mockedContext.middlewareSpy.waitForAction; render = () => mockedContext.render(<TrustedAppsPage />); reactTestingLibrary.act(() => { - history.push('/trusted_apps'); + history.push('/administration/trusted_apps'); }); window.scrollTo = jest.fn(); }); @@ -305,7 +305,7 @@ describe('When on the Trusted Apps Page', () => { }); reactTestingLibrary.act(() => { - history.push('/trusted_apps?show=edit&id=9999-edit-8888'); + history.push('/administration/trusted_apps?show=edit&id=9999-edit-8888'); }); }); @@ -323,7 +323,7 @@ describe('When on the Trusted Apps Page', () => { it('should redirect to list and show toast message if `id` is missing from URL', async () => { reactTestingLibrary.act(() => { - history.push('/trusted_apps?show=edit&id='); + history.push('/administration/trusted_apps?show=edit&id='); }); await renderAndWaitForGetApi(); @@ -367,7 +367,7 @@ describe('When on the Trusted Apps Page', () => { beforeEach(async () => { reactTestingLibrary.act(() => { - history.push('/trusted_apps?view_type=list'); + history.push('/administration/trusted_apps?view_type=list'); }); renderResult = await renderWithListData(); @@ -477,7 +477,7 @@ describe('When on the Trusted Apps Page', () => { it('should preserve other URL search params', async () => { reactTestingLibrary.act(() => { - history.push('/trusted_apps?page_index=2&page_size=20'); + history.push('/administration/trusted_apps?page_index=2&page_size=20'); }); await renderAndClickAddButton(); expect(history.location.search).toBe('?page_index=2&page_size=20&show=create'); @@ -884,7 +884,7 @@ describe('When on the Trusted Apps Page', () => { beforeEach(async () => { mockListApis(coreStart.http); reactTestingLibrary.act(() => { - history.push('/trusted_apps?filter=test'); + history.push('/administration/trusted_apps?filter=test'); }); renderResult = render(); await act(async () => { @@ -912,7 +912,7 @@ describe('When on the Trusted Apps Page', () => { await waitForAction('trustedAppsListResourceStateChanged'); }); reactTestingLibrary.act(() => { - history.push('/trusted_apps', { + history.push('/administration/trusted_apps', { onBackButtonNavigateTo: [{ appId: 'appId' }], backButtonLabel: 'back to fleet', backButtonUrl: '/fleet', @@ -928,7 +928,7 @@ describe('When on the Trusted Apps Page', () => { it('back button is not present', () => { reactTestingLibrary.act(() => { - history.push('/trusted_apps'); + history.push('/administration/trusted_apps'); }); expect(renderResult.queryByTestId('backToOrigin')).toBeNull(); }); diff --git a/x-pack/plugins/security_solution/public/management/routes.tsx b/x-pack/plugins/security_solution/public/management/routes.tsx index b9143a862e736d..bbc165d51a46ca 100644 --- a/x-pack/plugins/security_solution/public/management/routes.tsx +++ b/x-pack/plugins/security_solution/public/management/routes.tsx @@ -6,19 +6,26 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { MANAGEMENT_PATH, SecurityPageName } from '../../common/constants'; import { ManagementContainer } from './pages'; -import { NotFoundPage } from '../app/404'; +import { SecuritySubPluginRoutes } from '../app/types'; import { CurrentLicense } from '../common/components/current_license'; /** * Returns the React Router Routes for the management area */ -export const ManagementRoutes = () => ( - <CurrentLicense> - <Switch> - <Route path="/" component={ManagementContainer} /> - <Route render={() => <NotFoundPage />} /> - </Switch> - </CurrentLicense> +const ManagementRoutes = () => ( + <TrackApplicationView viewId={SecurityPageName.administration}> + <CurrentLicense> + <ManagementContainer /> + </CurrentLicense> + </TrackApplicationView> ); + +export const routes: SecuritySubPluginRoutes = [ + { + path: MANAGEMENT_PATH, + render: ManagementRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/network/index.ts b/x-pack/plugins/security_solution/public/network/index.ts index 5764484a539870..f34ebcc6e33b9a 100644 --- a/x-pack/plugins/security_solution/public/network/index.ts +++ b/x-pack/plugins/security_solution/public/network/index.ts @@ -7,7 +7,7 @@ import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { SecuritySubPluginWithStore } from '../app/types'; -import { NetworkRoutes } from './routes'; +import { routes } from './routes'; import { initialNetworkState, networkReducer, NetworkState } from './store'; import { TimelineId } from '../../common/types/timeline'; import { getTimelinesInStorageByIds } from '../timelines/containers/local_storage'; @@ -17,7 +17,7 @@ export class Network { public start(storage: Storage): SecuritySubPluginWithStore<'network', NetworkState> { return { - SubPluginRoutes: NetworkRoutes, + routes, storageTimelines: { timelineById: getTimelinesInStorageByIds(storage, [TimelineId.networkPageExternalAlerts]), }, diff --git a/x-pack/plugins/security_solution/public/network/pages/details/utils.ts b/x-pack/plugins/security_solution/public/network/pages/details/utils.ts index bfba7fa938a817..637180203c6d1d 100644 --- a/x-pack/plugins/security_solution/public/network/pages/details/utils.ts +++ b/x-pack/plugins/security_solution/public/network/pages/details/utils.ts @@ -36,7 +36,8 @@ export const getBreadcrumbs = ( let breadcrumb = [ { text: i18n.PAGE_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.network}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.network, path: !isEmpty(search[0]) ? search[0] : '', }), }, @@ -46,7 +47,8 @@ export const getBreadcrumbs = ( ...breadcrumb, { text: decodeIpv6(params.detailName), - href: getUrlForApp(`${APP_ID}:${SecurityPageName.network}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.network, path: getNetworkDetailsUrl( params.detailName, params.flowTarget, diff --git a/x-pack/plugins/security_solution/public/network/pages/index.tsx b/x-pack/plugins/security_solution/public/network/pages/index.tsx index ddc098823470a1..965d461665ec2b 100644 --- a/x-pack/plugins/security_solution/public/network/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/index.tsx @@ -6,7 +6,7 @@ */ import React, { useMemo } from 'react'; -import { Route, Switch, RouteComponentProps, useHistory } from 'react-router-dom'; +import { Redirect, Route, Switch } from 'react-router-dom'; import { useMlCapabilities } from '../../common/components/ml/hooks/use_ml_capabilities'; import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; @@ -17,14 +17,11 @@ import { getNetworkRoutePath } from './navigation'; import { NetworkRouteType } from './navigation/types'; import { MlNetworkConditionalContainer } from '../../common/components/ml/conditional_links/ml_network_conditional_container'; import { FlowTarget } from '../../../common/search_strategy'; +import { NETWORK_PATH } from '../../../common/constants'; -type Props = Partial<RouteComponentProps<{}>> & { url: string }; +const ipDetailsPageBasePath = `${NETWORK_PATH}/ip/:detailName`; -const networkPagePath = ''; -const ipDetailsPageBasePath = `/ip/:detailName`; - -const NetworkContainerComponent: React.FC<Props> = () => { - const history = useHistory(); +const NetworkContainerComponent = () => { const capabilities = useMlCapabilities(); const capabilitiesFetched = capabilities.capabilitiesFetched; const userHasMlUserPermissions = useMemo(() => hasMlUserPermissions(capabilities), [ @@ -38,14 +35,18 @@ const NetworkContainerComponent: React.FC<Props> = () => { return ( <Switch> <Route - path="/ml-network" - render={({ location, match }) => ( - <MlNetworkConditionalContainer location={location} url={match.url} /> + exact + strict + path={NETWORK_PATH} + render={({ location: { search = '' } }) => ( + <Redirect to={{ pathname: `${NETWORK_PATH}/${NetworkRouteType.flows}`, search }} /> )} /> + <Route path={`${NETWORK_PATH}/ml-network`}> + <MlNetworkConditionalContainer /> + </Route> <Route strict path={networkRoutePath}> <Network - networkPagePath={networkPagePath} capabilitiesFetched={capabilities.capabilitiesFetched} hasMlUserPermissions={userHasMlUserPermissions} /> @@ -60,17 +61,14 @@ const NetworkContainerComponent: React.FC<Props> = () => { match: { params: { detailName }, }, - }) => { - history.replace(`ip/${detailName}/${FlowTarget.source}${search}`); - return null; - }} - /> - <Route - path="/" - render={({ location: { search = '' } }) => { - history.replace(`${NetworkRouteType.flows}${search}`); - return null; - }} + }) => ( + <Redirect + to={{ + pathname: `${NETWORK_PATH}/ip/${detailName}/${FlowTarget.source}`, + search, + }} + /> + )} /> </Switch> ); diff --git a/x-pack/plugins/security_solution/public/network/pages/navigation/nav_tabs.tsx b/x-pack/plugins/security_solution/public/network/pages/navigation/nav_tabs.tsx index 8e07cba1f5c1a9..607b2e02ac9611 100644 --- a/x-pack/plugins/security_solution/public/network/pages/navigation/nav_tabs.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/navigation/nav_tabs.tsx @@ -8,9 +8,9 @@ import { omit } from 'lodash/fp'; import * as i18n from '../translations'; import { NetworkNavTab, NetworkRouteType } from './types'; -import { SecurityPageName } from '../../../app/types'; +import { NETWORK_PATH } from '../../../../common/constants'; -const getTabsOnNetworkUrl = (tabName: NetworkRouteType) => `/${tabName}`; +const getTabsOnNetworkUrl = (tabName: NetworkRouteType) => `${NETWORK_PATH}/${tabName}`; export const navTabsNetwork = (hasMlUserPermissions: boolean): NetworkNavTab => { const networkNavTabs = { @@ -19,48 +19,36 @@ export const navTabsNetwork = (hasMlUserPermissions: boolean): NetworkNavTab => name: i18n.NAVIGATION_FLOWS_TITLE, href: getTabsOnNetworkUrl(NetworkRouteType.flows), disabled: false, - urlKey: 'network', - pageId: SecurityPageName.network, }, [NetworkRouteType.dns]: { id: NetworkRouteType.dns, name: i18n.NAVIGATION_DNS_TITLE, href: getTabsOnNetworkUrl(NetworkRouteType.dns), disabled: false, - urlKey: 'network', - pageId: SecurityPageName.network, }, [NetworkRouteType.http]: { id: NetworkRouteType.http, name: i18n.NAVIGATION_HTTP_TITLE, href: getTabsOnNetworkUrl(NetworkRouteType.http), disabled: false, - urlKey: 'network', - pageId: SecurityPageName.network, }, [NetworkRouteType.tls]: { id: NetworkRouteType.tls, name: i18n.NAVIGATION_TLS_TITLE, href: getTabsOnNetworkUrl(NetworkRouteType.tls), disabled: false, - urlKey: 'network', - pageId: SecurityPageName.network, }, [NetworkRouteType.anomalies]: { id: NetworkRouteType.anomalies, name: i18n.NAVIGATION_ANOMALIES_TITLE, href: getTabsOnNetworkUrl(NetworkRouteType.anomalies), disabled: false, - urlKey: 'network', - pageId: SecurityPageName.network, }, [NetworkRouteType.alerts]: { id: NetworkRouteType.alerts, name: i18n.NAVIGATION_ALERTS_TITLE, href: getTabsOnNetworkUrl(NetworkRouteType.alerts), disabled: false, - urlKey: 'network', - pageId: SecurityPageName.network, }, }; diff --git a/x-pack/plugins/security_solution/public/network/pages/navigation/network_routes.tsx b/x-pack/plugins/security_solution/public/network/pages/navigation/network_routes.tsx index a1d012d64d7b74..ea026664ce1e48 100644 --- a/x-pack/plugins/security_solution/public/network/pages/navigation/network_routes.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/navigation/network_routes.tsx @@ -24,10 +24,10 @@ import { TlsQueryTabBody } from './tls_query_tab_body'; import { Anomaly } from '../../../common/components/ml/types'; import { NetworkAlertsQueryTabBody } from './alerts_query_tab_body'; import { UpdateDateRange } from '../../../common/components/charts/common'; +import { NETWORK_PATH } from '../../../../common/constants'; export const NetworkRoutes = React.memo<NetworkRoutesProps>( ({ - networkPagePath, docValueFields, type, to, @@ -108,10 +108,10 @@ export const NetworkRoutes = React.memo<NetworkRoutesProps>( return ( <Switch> - <Route path={`/:tabName(${NetworkRouteType.dns})`}> + <Route path={`${NETWORK_PATH}/:tabName(${NetworkRouteType.dns})`}> <DnsQueryTabBody {...tabProps} docValueFields={docValueFields} /> </Route> - <Route path={`/:tabName(${NetworkRouteType.flows})`}> + <Route path={`${NETWORK_PATH}/:tabName(${NetworkRouteType.flows})`}> <> <ConditionalFlexGroup direction="column"> <EuiFlexItem> @@ -137,19 +137,19 @@ export const NetworkRoutes = React.memo<NetworkRoutesProps>( </ConditionalFlexGroup> </> </Route> - <Route path={`/:tabName(${NetworkRouteType.http})`}> + <Route path={`${NETWORK_PATH}/:tabName(${NetworkRouteType.http})`}> <HttpQueryTabBody {...tabProps} /> </Route> - <Route path={`/:tabName(${NetworkRouteType.tls})`}> + <Route path={`${NETWORK_PATH}/:tabName(${NetworkRouteType.tls})`}> <TlsQueryTabBody {...tabProps} flowTarget={FlowTargetSourceDest.source} /> </Route> - <Route path={`/:tabName(${NetworkRouteType.anomalies})`}> + <Route path={`${NETWORK_PATH}/:tabName(${NetworkRouteType.anomalies})`}> <AnomaliesQueryTabBody {...anomaliesProps} AnomaliesTableComponent={AnomaliesNetworkTable} /> </Route> - <Route path={`/:tabName(${NetworkRouteType.alerts})`}> + <Route path={`${NETWORK_PATH}/:tabName(${NetworkRouteType.alerts})`}> <NetworkAlertsQueryTabBody {...tabProps} /> </Route> </Switch> diff --git a/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts b/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts index ed1682e38da9a4..075aa46637a072 100644 --- a/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts +++ b/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts @@ -47,7 +47,6 @@ export type HttpQueryTabBodyProps = QueryTabBodyProps & { export type NetworkRoutesProps = GlobalTimeArgs & { docValueFields: DocValueFields[]; - networkPagePath: string; type: networkModel.NetworkType; filterQuery?: string | ESTermQuery; indexPattern: IIndexPattern; diff --git a/x-pack/plugins/security_solution/public/network/pages/navigation/utils.ts b/x-pack/plugins/security_solution/public/network/pages/navigation/utils.ts index 8f2de2b0c9812f..fcd81ca975584c 100644 --- a/x-pack/plugins/security_solution/public/network/pages/navigation/utils.ts +++ b/x-pack/plugins/security_solution/public/network/pages/navigation/utils.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { NETWORK_PATH } from '../../../../common/constants'; import { GetNetworkRoutePath, NetworkRouteType } from './types'; export const getNetworkRoutePath: GetNetworkRoutePath = ( @@ -12,11 +13,11 @@ export const getNetworkRoutePath: GetNetworkRoutePath = ( hasMlUserPermission ) => { if (capabilitiesFetched && !hasMlUserPermission) { - return `/:tabName(${NetworkRouteType.flows}|${NetworkRouteType.dns}|${NetworkRouteType.http}|${NetworkRouteType.tls}|${NetworkRouteType.alerts})`; + return `${NETWORK_PATH}/:tabName(${NetworkRouteType.flows}|${NetworkRouteType.dns}|${NetworkRouteType.http}|${NetworkRouteType.tls}|${NetworkRouteType.alerts})`; } return ( - `/:tabName(` + + `${NETWORK_PATH}/:tabName(` + `${NetworkRouteType.flows}|` + `${NetworkRouteType.dns}|` + `${NetworkRouteType.anomalies}|` + diff --git a/x-pack/plugins/security_solution/public/network/pages/network.tsx b/x-pack/plugins/security_solution/public/network/pages/network.tsx index 13c04a5e5ec5b7..b08a75215a4088 100644 --- a/x-pack/plugins/security_solution/public/network/pages/network.tsx +++ b/x-pack/plugins/security_solution/public/network/pages/network.tsx @@ -62,7 +62,7 @@ const StyledFullHeightContainer = styled.div` `; const NetworkComponent = React.memo<NetworkComponentProps>( - ({ networkPagePath, hasMlUserPermissions, capabilitiesFetched }) => { + ({ hasMlUserPermissions, capabilitiesFetched }) => { const dispatch = useDispatch(); const containerElement = useRef<HTMLDivElement | null>(null); const getTimeline = useMemo(() => timelineSelectors.getTimelineByIdSelector(), []); @@ -193,9 +193,7 @@ const NetworkComponent = React.memo<NetworkComponentProps>( <> <Display show={!globalFullScreen}> <EuiSpacer /> - <SecuritySolutionTabNavigation navTabs={navTabsNetwork(hasMlUserPermissions)} /> - <EuiSpacer /> </Display> @@ -210,7 +208,6 @@ const NetworkComponent = React.memo<NetworkComponentProps>( setAbsoluteRangeDatePicker={setAbsoluteRangeDatePicker} type={networkModel.NetworkType.page} to={to} - networkPagePath={networkPagePath} /> </> ) : ( diff --git a/x-pack/plugins/security_solution/public/network/pages/types.ts b/x-pack/plugins/security_solution/public/network/pages/types.ts index 1d727a2d219d75..df5ca5656abfb2 100644 --- a/x-pack/plugins/security_solution/public/network/pages/types.ts +++ b/x-pack/plugins/security_solution/public/network/pages/types.ts @@ -16,7 +16,6 @@ export type SetAbsoluteRangeDatePicker = ActionCreator<{ }>; export type NetworkComponentProps = Partial<RouteComponentProps<{}>> & { - networkPagePath: string; hasMlUserPermissions: boolean; capabilitiesFetched: boolean; }; diff --git a/x-pack/plugins/security_solution/public/network/routes.tsx b/x-pack/plugins/security_solution/public/network/routes.tsx index 9704c92e193365..32fbe96a21caa9 100644 --- a/x-pack/plugins/security_solution/public/network/routes.tsx +++ b/x-pack/plugins/security_solution/public/network/routes.tsx @@ -6,17 +6,21 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; - import { NetworkContainer } from './pages'; -import { NotFoundPage } from '../app/404'; + +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; +import { NETWORK_PATH } from '../../common/constants'; export const NetworkRoutes = () => ( - <Switch> - <Route - path="/" - render={({ location, match }) => <NetworkContainer location={location} url={match.url} />} - /> - <Route render={() => <NotFoundPage />} /> - </Switch> + <TrackApplicationView viewId={SecurityPageName.network}> + <NetworkContainer /> + </TrackApplicationView> ); + +export const routes: SecuritySubPluginRoutes = [ + { + path: NETWORK_PATH, + render: NetworkRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx index 9957d43551ff9e..98874c25e0ef8c 100644 --- a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx @@ -67,7 +67,8 @@ const AlertsByCategoryComponent: React.FC<Props> = ({ const goToHostAlerts = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.hosts}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.hosts, path: getTabsOnHostsUrl(HostsTableType.alerts, urlSearch), }); }, diff --git a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx index e908748d0028cd..6a00afde7c5995 100644 --- a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx @@ -8,15 +8,16 @@ import React, { memo } from 'react'; import { EuiCallOut, EuiButton, EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { useKibana } from '../../../common/lib/kibana'; +import { APP_ID } from '../../../../common/constants'; import { getEndpointListPath } from '../../../management/common/routing'; import { useNavigateToAppEventHandler } from '../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; -import { useManagementFormatUrl } from '../../../management/components/hooks/use_management_format_url'; -import { MANAGEMENT_APP_ID } from '../../../management/common/constants'; export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => { + const { getUrlForApp } = useKibana().services.application; const endpointsPath = getEndpointListPath({ name: 'endpointList' }); - const endpointsLink = useManagementFormatUrl(endpointsPath); - const handleGetStartedClick = useNavigateToAppEventHandler(MANAGEMENT_APP_ID, { + const endpointsLink = getUrlForApp(APP_ID, { path: endpointsPath }); + const handleGetStartedClick = useNavigateToAppEventHandler(APP_ID, { path: endpointsPath, }); diff --git a/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx b/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx index 8a1d1c67174fc4..a6ebfd2bbe0606 100644 --- a/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx @@ -96,7 +96,8 @@ const EventsByDatasetComponent: React.FC<Props> = ({ const goToHostEvents = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.hosts}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.hosts, path: getTabsOnHostsUrl(HostsTableType.events, urlSearch), }); }, diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_host/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_host/index.tsx index f11b849f5df6b4..0a8e817a3bfc46 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_host/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_host/index.tsx @@ -16,7 +16,7 @@ import { ESQuery } from '../../../../common/typed_json'; import { ID as OverviewHostQueryId, useHostOverview } from '../../containers/overview_host'; import { HeaderSection } from '../../../common/components/header_section'; import { useUiSetting$, useKibana } from '../../../common/lib/kibana'; -import { getHostsUrl, useFormatUrl } from '../../../common/components/link_to'; +import { getHostDetailsUrl, useFormatUrl } from '../../../common/components/link_to'; import { getOverviewHostStats, OverviewHostStats } from '../overview_host_stats'; import { manageQuery } from '../../../common/components/page/manage_query'; import { InspectButtonContainer } from '../../../common/components/inspect'; @@ -56,8 +56,9 @@ const OverviewHostComponent: React.FC<OverviewHostProps> = ({ const goToHost = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.hosts}`, { - path: getHostsUrl(urlSearch), + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.hosts, + path: getHostDetailsUrl('allHosts', urlSearch), }); }, [navigateToApp, urlSearch] @@ -75,7 +76,7 @@ const OverviewHostComponent: React.FC<OverviewHostProps> = ({ const hostPageButton = useMemo( () => ( - <LinkButton onClick={goToHost} href={formatUrl(getHostsUrl())}> + <LinkButton onClick={goToHost} href={formatUrl('/allHosts')}> <FormattedMessage id="xpack.securitySolution.overview.hostsAction" defaultMessage="View hosts" diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx index 13a9b529fdf43b..08b2392f60488c 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_network/index.test.tsx @@ -20,6 +20,7 @@ import { import { OverviewNetwork } from '.'; import { createStore, State } from '../../../common/store'; import { useNetworkOverview } from '../../containers/overview_network'; +import { SecurityPageName } from '../../../app/types'; jest.mock('../../../common/components/link_to'); const mockNavigateToApp = jest.fn(); @@ -137,6 +138,9 @@ describe('OverviewNetwork', () => { preventDefault: jest.fn(), }); - expect(mockNavigateToApp).toBeCalledWith('securitySolution:network', { path: '' }); + expect(mockNavigateToApp).toBeCalledWith('securitySolution', { + path: '', + deepLinkId: SecurityPageName.network, + }); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_network/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_network/index.tsx index 39fb6ff08ee539..eb5231d4ce5e06 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_network/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_network/index.tsx @@ -58,7 +58,8 @@ const OverviewNetworkComponent: React.FC<OverviewNetworkProps> = ({ const goToNetwork = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.network}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.network, path: getNetworkUrl(urlSearch), }); }, diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx index cb7733e3049850..207c6ef16bd160 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_cases/index.tsx @@ -14,7 +14,7 @@ import { } from '../../../common/components/link_to/redirect_to_case'; import { useFormatUrl } from '../../../common/components/link_to'; import { useGetUserCasesPermissions, useKibana } from '../../../common/lib/kibana'; -import { APP_ID, CASES_APP_ID } from '../../../../common/constants'; +import { APP_ID } from '../../../../common/constants'; import { SecurityPageName } from '../../../app/types'; import { AllCasesNavProps } from '../../../cases/components/all_cases'; @@ -32,10 +32,8 @@ const RecentCasesComponent = () => { allCasesNavigation: { href: formatUrl(getCaseUrl()), onClick: async (e) => { - if (e) { - e.preventDefault(); - } - return navigateToApp(CASES_APP_ID); + e?.preventDefault(); + return navigateToApp(APP_ID, { deepLinkId: SecurityPageName.case }); }, }, caseDetailsNavigation: { @@ -43,10 +41,9 @@ const RecentCasesComponent = () => { return formatUrl(getCaseDetailsUrl({ id: detailName, subCaseId })); }, onClick: async ({ detailName, subCaseId, search }, e) => { - if (e) { - e.preventDefault(); - } - return navigateToApp(CASES_APP_ID, { + e?.preventDefault(); + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCaseDetailsUrl({ id: detailName, search, subCaseId }), }); }, @@ -54,10 +51,9 @@ const RecentCasesComponent = () => { createCaseNavigation: { href: formatUrl(getCreateCaseUrl()), onClick: async (e) => { - if (e) { - e.preventDefault(); - } - return navigateToApp(CASES_APP_ID, { + e?.preventDefault(); + return navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCreateCaseUrl(), }); }, diff --git a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx index 1d9b039e022589..f76d71600d0e7c 100644 --- a/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/recent_timelines/index.tsx @@ -60,7 +60,9 @@ const StatefulRecentTimelinesComponent: React.FC<Props> = ({ filterBy }) => { const goToTimelines = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.timelines}`); + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.timelines, + }); }, [navigateToApp] ); diff --git a/x-pack/plugins/security_solution/public/overview/index.ts b/x-pack/plugins/security_solution/public/overview/index.ts index 4ec5b6d7ce48bc..3aa6c4185f6dab 100644 --- a/x-pack/plugins/security_solution/public/overview/index.ts +++ b/x-pack/plugins/security_solution/public/overview/index.ts @@ -6,14 +6,14 @@ */ import { SecuritySubPlugin } from '../app/types'; -import { OverviewRoutes } from './routes'; +import { routes } from './routes'; export class Overview { public setup() {} public start(): SecuritySubPlugin { return { - SubPluginRoutes: OverviewRoutes, + routes, }; } } diff --git a/x-pack/plugins/security_solution/public/overview/routes.tsx b/x-pack/plugins/security_solution/public/overview/routes.tsx index 7d6fc4858c670f..0f83c03f7e3d93 100644 --- a/x-pack/plugins/security_solution/public/overview/routes.tsx +++ b/x-pack/plugins/security_solution/public/overview/routes.tsx @@ -6,14 +6,21 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { OVERVIEW_PATH, SecurityPageName } from '../../common/constants'; +import { SecuritySubPluginRoutes } from '../app/types'; import { Overview } from './pages'; -import { NotFoundPage } from '../app/404'; -export const OverviewRoutes = () => ( - <Switch> - <Route path="/" render={() => <Overview />} /> - <Route render={() => <NotFoundPage />} /> - </Switch> +const OverviewRoutes = () => ( + <TrackApplicationView viewId={SecurityPageName.overview}> + <Overview /> + </TrackApplicationView> ); + +export const routes: SecuritySubPluginRoutes = [ + { + path: OVERVIEW_PATH, + render: OverviewRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 32e6748f38141c..1bf3edf1605d83 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -18,6 +18,7 @@ import { StartServices, AppObservableLibs, SubPlugins, + StartedSubPlugins, } from './types'; import { AppMountParameters, @@ -35,33 +36,17 @@ import { KibanaServices } from './common/lib/kibana/services'; import { APP_ID, - APP_ICON_SOLUTION, - APP_DETECTIONS_PATH, - APP_HOSTS_PATH, + OVERVIEW_PATH, APP_OVERVIEW_PATH, - APP_NETWORK_PATH, - APP_TIMELINES_PATH, - APP_MANAGEMENT_PATH, - APP_CASES_PATH, APP_PATH, - CASES_APP_ID, DEFAULT_INDEX_KEY, DETECTION_ENGINE_INDEX_URL, DEFAULT_ALERTS_INDEX, + APP_ICON_SOLUTION, } from '../common/constants'; -import { SecurityPageName } from './app/types'; -import { registerDeepLinks, getDeepLinksAndKeywords } from './app/search'; +import { getDeepLinks, updateGlobalNavigation } from './app/deep_links'; import { manageOldSiemRoutes } from './helpers'; -import { - OVERVIEW, - HOSTS, - NETWORK, - TIMELINES, - DETECTION_ENGINE, - CASE, - ADMINISTRATION, -} from './app/translations'; import { IndexFieldsStrategyRequest, IndexFieldsStrategyResponse, @@ -84,10 +69,7 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S this.config = this.initializerContext.config.get<SecuritySolutionUiConfigType>(); this.kibanaVersion = initializerContext.env.packageInfo.version; } - private detectionsUpdater$ = new Subject<AppUpdater>(); - private hostsUpdater$ = new Subject<AppUpdater>(); - private networkUpdater$ = new Subject<AppUpdater>(); - private caseUpdater$ = new Subject<AppUpdater>(); + private appUpdater$ = new Subject<AppUpdater>(); private storage = new Storage(localStorage); private licensingSubscription: Subscription | null = null; @@ -159,162 +141,26 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S })(); core.application.register({ - exactRoute: true, id: APP_ID, title: APP_NAME, appRoute: APP_PATH, - navLinkStatus: AppNavLinkStatus.hidden, - mount: async () => { - const [{ application }] = await core.getStartServices(); - application.navigateToApp(`${APP_ID}:${SecurityPageName.overview}`, { replace: true }); - return () => true; - }, - }); - - core.application.register({ - id: `${APP_ID}:${SecurityPageName.overview}`, - title: OVERVIEW, - order: 9000, - euiIconType: APP_ICON_SOLUTION, - category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_OVERVIEW_PATH, - mount: async (params: AppMountParameters) => { - const [coreStart, startPlugins] = await core.getStartServices(); - const { overview: subPlugin } = await this.subPlugins(); - const { renderApp } = await this.lazyApplicationDependencies(); - - return renderApp({ - ...params, - services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: subPlugin.start().SubPluginRoutes, - }); - }, - }); - - core.application.register({ - id: `${APP_ID}:${SecurityPageName.detections}`, - title: DETECTION_ENGINE, - order: 9001, - euiIconType: APP_ICON_SOLUTION, - category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_DETECTIONS_PATH, - updater$: this.detectionsUpdater$, - mount: async (params: AppMountParameters) => { - const [coreStart, startPlugins] = await core.getStartServices(); - const { detections: subPlugin } = await this.subPlugins(); - const { renderApp } = await this.lazyApplicationDependencies(); - - return renderApp({ - ...params, - services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: subPlugin.start(this.storage).SubPluginRoutes, - }); - }, - }); - - core.application.register({ - id: `${APP_ID}:${SecurityPageName.hosts}`, - title: HOSTS, - order: 9002, - euiIconType: APP_ICON_SOLUTION, - category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_HOSTS_PATH, - updater$: this.hostsUpdater$, - mount: async (params: AppMountParameters) => { - const [coreStart, startPlugins] = await core.getStartServices(); - const { hosts: subPlugin } = await this.subPlugins(); - const { renderApp } = await this.lazyApplicationDependencies(); - return renderApp({ - ...params, - services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: subPlugin.start(this.storage).SubPluginRoutes, - }); - }, - }); - - core.application.register({ - id: `${APP_ID}:${SecurityPageName.network}`, - title: NETWORK, - order: 9002, - euiIconType: APP_ICON_SOLUTION, - category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_NETWORK_PATH, - updater$: this.networkUpdater$, - mount: async (params: AppMountParameters) => { - const [coreStart, startPlugins] = await core.getStartServices(); - const { network: subPlugin } = await this.subPlugins(); - const { renderApp } = await this.lazyApplicationDependencies(); - return renderApp({ - ...params, - services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: subPlugin.start(this.storage).SubPluginRoutes, - }); - }, - }); - - core.application.register({ - id: `${APP_ID}:${SecurityPageName.timelines}`, - title: TIMELINES, - order: 9002, - euiIconType: APP_ICON_SOLUTION, - category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_TIMELINES_PATH, - ...getDeepLinksAndKeywords(SecurityPageName.timelines), - mount: async (params: AppMountParameters) => { - const [coreStart, startPlugins] = await core.getStartServices(); - const { timelines: subPlugin } = await this.subPlugins(); - const { renderApp } = await this.lazyApplicationDependencies(); - return renderApp({ - ...params, - services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: subPlugin.start().SubPluginRoutes, - }); - }, - }); - - core.application.register({ - id: CASES_APP_ID, - title: CASE, - order: 9002, - euiIconType: APP_ICON_SOLUTION, category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_CASES_PATH, - updater$: this.caseUpdater$, - mount: async (params: AppMountParameters) => { - const [coreStart, startPlugins] = await core.getStartServices(); - const { cases: subPlugin } = await this.subPlugins(); - const { renderApp } = await this.lazyApplicationDependencies(); - return renderApp({ - ...params, - services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: subPlugin.start().SubPluginRoutes, - }); - }, - }); - - core.application.register({ - id: `${APP_ID}:${SecurityPageName.administration}`, - title: ADMINISTRATION, - order: 9002, + navLinkStatus: AppNavLinkStatus.hidden, + searchable: true, + defaultPath: OVERVIEW_PATH, + updater$: this.appUpdater$, euiIconType: APP_ICON_SOLUTION, - category: DEFAULT_APP_CATEGORIES.security, - appRoute: APP_MANAGEMENT_PATH, - ...getDeepLinksAndKeywords(SecurityPageName.administration), + deepLinks: getDeepLinks(), mount: async (params: AppMountParameters) => { const [coreStart, startPlugins] = await core.getStartServices(); - const { management: managementSubPlugin } = await this.subPlugins(); + const subPlugins = await this.startSubPlugins(this.storage, coreStart, startPlugins); const { renderApp } = await this.lazyApplicationDependencies(); return renderApp({ ...params, services: await startServices, - store: await this.store(coreStart, startPlugins), - SubPluginRoutes: managementSubPlugin.start(coreStart, startPlugins).SubPluginRoutes, + store: await this.store(coreStart, startPlugins, subPlugins), + usageCollection: plugins.usageCollection, + subPlugins, }); }, }); @@ -376,17 +222,19 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S if (licensing !== null) { this.licensingSubscription = licensing.subscribe((currentLicense) => { if (currentLicense.type !== undefined) { - registerDeepLinks(SecurityPageName.network, this.networkUpdater$, currentLicense.type); - registerDeepLinks( - SecurityPageName.detections, - this.detectionsUpdater$, - currentLicense.type - ); - registerDeepLinks(SecurityPageName.hosts, this.hostsUpdater$, currentLicense.type); - registerDeepLinks(SecurityPageName.case, this.caseUpdater$, currentLicense.type); + this.appUpdater$.next(() => ({ + navLinkStatus: AppNavLinkStatus.hidden, // workaround to prevent main navLink to switch to visible after update. should not be needed + deepLinks: getDeepLinks(currentLicense.type, core.application.capabilities), + })); } }); + } else { + updateGlobalNavigation({ + capabilities: core.application.capabilities, + updater$: this.appUpdater$, + }); } + return {}; } @@ -434,7 +282,9 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S if (!this._subPlugins) { const { subPluginClasses } = await this.lazySubPlugins(); this._subPlugins = { - detections: new subPluginClasses.Detections(), + alerts: new subPluginClasses.Detections(), + rules: new subPluginClasses.Rules(), + exceptions: new subPluginClasses.Exceptions(), cases: new subPluginClasses.Cases(), hosts: new subPluginClasses.Hosts(), network: new subPluginClasses.Network(), @@ -446,10 +296,36 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S return this._subPlugins; } + /** + * All started subPlugins. + */ + private async startSubPlugins( + storage: Storage, + core: CoreStart, + plugins: StartPlugins + ): Promise<StartedSubPlugins> { + const subPlugins = await this.subPlugins(); + return { + overview: subPlugins.overview.start(), + alerts: subPlugins.alerts.start(storage), + rules: subPlugins.rules.start(storage), + exceptions: subPlugins.exceptions.start(storage), + cases: subPlugins.cases.start(), + hosts: subPlugins.hosts.start(storage), + network: subPlugins.network.start(storage), + timelines: subPlugins.timelines.start(), + management: subPlugins.management.start(core, plugins), + }; + } + /** * Lazily instantiate a `SecurityAppStore`. We lazily instantiate this because it requests large dynamic imports. We instantiate it once because each subPlugin needs to share the same reference. */ - private async store(coreStart: CoreStart, startPlugins: StartPlugins): Promise<SecurityAppStore> { + private async store( + coreStart: CoreStart, + startPlugins: StartPlugins, + subPlugins: StartedSubPlugins + ): Promise<SecurityAppStore> { if (!this._store) { const experimentalFeatures = parseExperimentalConfigValue( this.config.enableExperimental || [] @@ -458,18 +334,10 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S const [ { createStore, createInitialState }, kibanaIndexPatterns, - { - detections: detectionsSubPlugin, - hosts: hostsSubPlugin, - network: networkSubPlugin, - timelines: timelinesSubPlugin, - management: managementSubPlugin, - }, configIndexPatterns, ] = await Promise.all([ this.lazyApplicationDependencies(), startPlugins.data.indexPatterns.getIdsWithTitle(), - this.subPlugins(), startPlugins.data.search .search<IndexFieldsStrategyRequest, IndexFieldsStrategyResponse>( { indices: defaultIndicesName, onlyCheckIfIndicesExist: true }, @@ -498,19 +366,16 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S const appLibs: AppObservableLibs = { kibana: coreStart }; const libs$ = new BehaviorSubject(appLibs); - const detectionsStart = detectionsSubPlugin.start(this.storage); - const hostsStart = hostsSubPlugin.start(this.storage); - const networkStart = networkSubPlugin.start(this.storage); - const timelinesStart = timelinesSubPlugin.start(); - const managementSubPluginStart = managementSubPlugin.start(coreStart, startPlugins); const timelineInitialState = { timeline: { - ...timelinesStart.store.initialState.timeline!, + ...subPlugins.timelines.store.initialState.timeline!, timelineById: { - ...timelinesStart.store.initialState.timeline!.timelineById, - ...detectionsStart.storageTimelines!.timelineById, - ...hostsStart.storageTimelines!.timelineById, - ...networkStart.storageTimelines!.timelineById, + ...subPlugins.timelines.store.initialState.timeline!.timelineById, + ...subPlugins.alerts.storageTimelines!.timelineById, + ...subPlugins.rules.storageTimelines!.timelineById, + ...subPlugins.exceptions.storageTimelines!.timelineById, + ...subPlugins.hosts.storageTimelines!.timelineById, + ...subPlugins.network.storageTimelines!.timelineById, }, }, }; @@ -519,16 +384,16 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S const timelineReducer = (reduceReducers( timelineInitialState.timeline, tGridReducer, - timelinesStart.store.reducer.timeline + subPlugins.timelines.store.reducer.timeline ) as unknown) as Reducer<TimelineState, AnyAction>; this._store = createStore( createInitialState( { - ...hostsStart.store.initialState, - ...networkStart.store.initialState, + ...subPlugins.hosts.store.initialState, + ...subPlugins.network.store.initialState, ...timelineInitialState, - ...managementSubPluginStart.store.initialState, + ...subPlugins.management.store.initialState, }, { kibanaIndexPatterns, @@ -538,15 +403,15 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S } ), { - ...hostsStart.store.reducer, - ...networkStart.store.reducer, + ...subPlugins.hosts.store.reducer, + ...subPlugins.network.store.reducer, timeline: timelineReducer, - ...managementSubPluginStart.store.reducer, + ...subPlugins.management.store.reducer, ...tGridReducer, }, libs$.pipe(pluck('kibana')), this.storage, - [...(managementSubPluginStart.store.middleware ?? [])] + [...(subPlugins.management.store.middleware ?? [])] ); if (startPlugins.timelines) { startPlugins.timelines.setTGridEmbeddedStore(this._store); diff --git a/x-pack/plugins/security_solution/public/rules/index.ts b/x-pack/plugins/security_solution/public/rules/index.ts new file mode 100644 index 00000000000000..e74efabad49325 --- /dev/null +++ b/x-pack/plugins/security_solution/public/rules/index.ts @@ -0,0 +1,25 @@ +/* + * 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 { Storage } from '../../../../../src/plugins/kibana_utils/public'; + +import { SecuritySubPlugin } from '../app/types'; +import { DETECTIONS_TIMELINE_IDS } from '../detections'; +import { getTimelinesInStorageByIds } from '../timelines/containers/local_storage'; +import { routes } from './routes'; + +export class Rules { + public setup() {} + + public start(storage: Storage): SecuritySubPlugin { + return { + storageTimelines: { + timelineById: getTimelinesInStorageByIds(storage, DETECTIONS_TIMELINE_IDS), + }, + routes, + }; + } +} diff --git a/x-pack/plugins/security_solution/public/rules/routes.tsx b/x-pack/plugins/security_solution/public/rules/routes.tsx new file mode 100644 index 00000000000000..39b882ad76f8ce --- /dev/null +++ b/x-pack/plugins/security_solution/public/rules/routes.tsx @@ -0,0 +1,56 @@ +/* + * 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 { Route, Switch } from 'react-router-dom'; + +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; +import { RULES_PATH, SecurityPageName } from '../../common/constants'; +import { RulesPage } from '../detections/pages/detection_engine/rules'; +import { CreateRulePage } from '../detections/pages/detection_engine/rules/create'; +import { RuleDetailsPage } from '../detections/pages/detection_engine/rules/details'; +import { EditRulePage } from '../detections/pages/detection_engine/rules/edit'; + +const RulesSubRoutes = [ + { + path: '/rules/id/:detailName/edit', + main: EditRulePage, + }, + { + path: '/rules/id/:detailName', + main: RuleDetailsPage, + }, + { + path: '/rules/create', + main: CreateRulePage, + }, + { + path: '/rules', + exact: true, + main: RulesPage, + }, +]; + +export const RulesRoutes = () => { + return ( + <TrackApplicationView viewId={SecurityPageName.rules}> + <Switch> + {RulesSubRoutes.map((route, index) => ( + <Route key={`rules-route-${route.path}`} path={route.path} exact={route?.exact ?? false}> + <route.main /> + </Route> + ))} + </Switch> + </TrackApplicationView> + ); +}; + +export const routes = [ + { + path: RULES_PATH, + render: RulesRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx index bc9876b207284f..717b338aa25355 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.test.tsx @@ -12,6 +12,7 @@ import { useKibana } from '../../../../common/lib/kibana'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import { mockTimelineModel, TestProviders } from '../../../../common/mock'; import { AddToCaseButton } from '.'; +import { SecurityPageName } from '../../../../../common/constants'; jest.mock('../../../../common/components/link_to', () => { const original = jest.requireActual('../../../../common/components/link_to'); @@ -61,7 +62,10 @@ describe('AddToCaseButton', () => { wrapper.find(`[data-test-subj="attach-timeline-case-button"]`).first().simulate('click'); wrapper.find(`[data-test-subj="attach-timeline-existing-case"]`).first().simulate('click'); - expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/create' }); + expect(navigateToApp).toHaveBeenCalledWith('securitySolution', { + path: '/create', + deepLinkId: SecurityPageName.case, + }); }); it('navigates to the correct path with id', async () => { @@ -80,6 +84,9 @@ describe('AddToCaseButton', () => { wrapper.find(`[data-test-subj="attach-timeline-case-button"]`).first().simulate('click'); wrapper.find(`[data-test-subj="attach-timeline-existing-case"]`).first().simulate('click'); - expect(navigateToApp).toHaveBeenCalledWith('securitySolution:case', { path: '/case-id' }); + expect(navigateToApp).toHaveBeenCalledWith('securitySolution', { + path: '/case-id', + deepLinkId: SecurityPageName.case, + }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx index 47935347b96ac0..553b827f2a64c1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx @@ -11,7 +11,7 @@ import React, { useCallback, useMemo, useState } from 'react'; import { useDispatch } from 'react-redux'; import { Case, SubCase } from '../../../../../../cases/common'; -import { APP_ID, CASES_APP_ID } from '../../../../../common/constants'; +import { APP_ID } from '../../../../../common/constants'; import { timelineSelectors } from '../../../../timelines/store/timeline'; import { setInsertTimeline, showTimeline } from '../../../store/timeline/actions'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; @@ -55,7 +55,8 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { const onRowClick = useCallback( async (theCase?: Case | SubCase) => { openCaseModal(false); - await navigateToApp(CASES_APP_ID, { + await navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: theCase != null ? getCaseDetailsUrl({ id: theCase.id }) : getCreateCaseUrl(), }); dispatch( @@ -88,7 +89,9 @@ const AddToCaseButtonComponent: React.FC<Props> = ({ timelineId }) => { const handleNewCaseClick = useCallback(() => { handlePopoverClose(); - navigateToApp(CASES_APP_ID, { + + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.case, path: getCreateCaseUrl(), }).then(() => { dispatch( diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx index 35a13aba471fde..14ebfbc20d9c97 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiFlyout } from '@elastic/eui'; +import { EuiFlyout, EuiFlyoutProps } from '@elastic/eui'; import React, { useCallback } from 'react'; import styled from 'styled-components'; import { useDispatch } from 'react-redux'; @@ -23,13 +23,8 @@ interface FlyoutPaneComponentProps { visible?: boolean; } -const EuiFlyoutContainer = styled.div` - .timeline-flyout { - z-index: ${({ theme }) => theme.eui.euiZLevel8}; - min-width: 150px; - width: 100%; - animation: none; - } +const StyledEuiFlyout = styled(EuiFlyout)<EuiFlyoutProps>` + animation: none; `; const FlyoutPaneComponent: React.FC<FlyoutPaneComponentProps> = ({ @@ -43,17 +38,14 @@ const FlyoutPaneComponent: React.FC<FlyoutPaneComponentProps> = ({ }, [dispatch, timelineId]); return ( - <EuiFlyoutContainer - data-test-subj="flyout-pane" - style={{ visibility: visible ? 'visible' : 'hidden' }} - > - <EuiFlyout + <div data-test-subj="flyout-pane" style={{ visibility: visible ? 'visible' : 'hidden' }}> + <StyledEuiFlyout aria-label={i18n.TIMELINE_DESCRIPTION} className="timeline-flyout" data-test-subj="eui-flyout" hideCloseButton={true} onClose={handleClose} - size="l" + size="100%" ownFocus={false} style={{ visibility: visible ? 'visible' : 'hidden' }} > @@ -62,8 +54,8 @@ const FlyoutPaneComponent: React.FC<FlyoutPaneComponentProps> = ({ rowRenderers={defaultRowRenderers} timelineId={timelineId} /> - </EuiFlyout> - </EuiFlyoutContainer> + </StyledEuiFlyout> + </div> ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx index 1d39dd169ffaac..5402210d22ccee 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.test.tsx @@ -31,6 +31,22 @@ jest.mock('../../../common/components/link_to', () => { }; }); +jest.mock('../../../../../../../src/plugins/kibana_react/public', () => { + const originalModule = jest.requireActual('../../../../../../../src/plugins/kibana_react/public'); + const useKibana = jest.fn().mockImplementation(() => ({ + services: { + application: { + navigateToUrl: jest.fn(), + }, + }, + })); + + return { + ...originalModule, + useKibana, + }; +}); + describe('useTimelineTypes', () => { it('init', async () => { await act(async () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx index a66fe43d305f14..ca8b443309e122 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/use_timeline_types.tsx @@ -6,7 +6,7 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import { useParams, useHistory } from 'react-router-dom'; +import { useParams } from 'react-router-dom'; import { EuiTabs, EuiTab, EuiSpacer } from '@elastic/eui'; import { noop } from 'lodash/fp'; @@ -15,7 +15,7 @@ import { SecurityPageName } from '../../../app/types'; import { getTimelineTabsUrl, useFormatUrl } from '../../../common/components/link_to'; import * as i18n from './translations'; import { TimelineTabsStyle, TimelineTab } from './types'; - +import { useKibana } from '../../../common/lib/kibana'; export interface UseTimelineTypesArgs { defaultTimelineCount?: number | null; templateTimelineCount?: number | null; @@ -31,8 +31,8 @@ export const useTimelineTypes = ({ defaultTimelineCount, templateTimelineCount, }: UseTimelineTypesArgs): UseTimelineTypesResult => { - const history = useHistory(); const { formatUrl, search: urlSearch } = useFormatUrl(SecurityPageName.timelines); + const { navigateToUrl } = useKibana().services.application; const { tabName } = useParams<{ pageName: SecurityPageName; tabName: string }>(); const [timelineType, setTimelineTypes] = useState<TimelineTypeLiteralWithNull>( tabName === TimelineType.default || tabName === TimelineType.template @@ -40,27 +40,30 @@ export const useTimelineTypes = ({ : TimelineType.default ); + const timelineUrl = formatUrl(getTimelineTabsUrl(TimelineType.default, urlSearch)); + const templateUrl = formatUrl(getTimelineTabsUrl(TimelineType.template, urlSearch)); + const goToTimeline = useCallback( (ev) => { ev.preventDefault(); - history.push(getTimelineTabsUrl(TimelineType.default, urlSearch)); + navigateToUrl(timelineUrl); }, - [history, urlSearch] + [navigateToUrl, timelineUrl] ); const goToTemplateTimeline = useCallback( (ev) => { ev.preventDefault(); - history.push(getTimelineTabsUrl(TimelineType.template, urlSearch)); + navigateToUrl(templateUrl); }, - [history, urlSearch] + [navigateToUrl, templateUrl] ); const getFilterOrTabs: (timelineTabsStyle: TimelineTabsStyle) => TimelineTab[] = useCallback( (timelineTabsStyle: TimelineTabsStyle) => [ { id: TimelineType.default, name: i18n.TAB_TIMELINES, - href: formatUrl(getTimelineTabsUrl(TimelineType.default, urlSearch)), + href: timelineUrl, disabled: false, onClick: timelineTabsStyle === TimelineTabsStyle.tab ? goToTimeline : noop, @@ -68,13 +71,13 @@ export const useTimelineTypes = ({ { id: TimelineType.template, name: i18n.TAB_TEMPLATES, - href: formatUrl(getTimelineTabsUrl(TimelineType.template, urlSearch)), + href: templateUrl, disabled: false, onClick: timelineTabsStyle === TimelineTabsStyle.tab ? goToTemplateTimeline : noop, }, ], - [urlSearch, formatUrl, goToTimeline, goToTemplateTimeline] + [timelineUrl, templateUrl, goToTimeline, goToTemplateTimeline] ); const onFilterClicked = useCallback( diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap index 4c8139a78b0121..06db698a91a6da 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap @@ -274,12 +274,14 @@ Array [ <Styled(EuiFlyout) data-test-subj="timeline:details-panel:flyout" onClose={[Function]} + ownFocus={false} size="m" > <EuiFlyout className="c0" data-test-subj="timeline:details-panel:flyout" onClose={[Function]} + ownFocus={false} size="m" > <div @@ -507,6 +509,7 @@ Array [ className="c0" data-test-subj="timeline:details-panel:flyout" onClose={[Function]} + ownFocus={false} size="m" > <div diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.tsx index 629bdcca986403..ea408be7c8e9a4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/index.tsx @@ -117,6 +117,7 @@ export const DetailsPanel = React.memo( data-test-subj="timeline:details-panel:flyout" size={panelSize} onClose={closePanel} + ownFocus={false} > {visiblePanel} </StyledEuiFlyout> diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx index d33192528a0908..ef509cdfbda170 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx @@ -48,14 +48,15 @@ export const RenderRuleName: React.FC<RenderRuleNameProps> = ({ }) => { const ruleName = `${value}`; const ruleId = linkValue; - const { search } = useFormatUrl(SecurityPageName.detections); + const { search } = useFormatUrl(SecurityPageName.rules); const { navigateToApp, getUrlForApp } = useKibana().services.application; const content = truncate ? <TruncatableText>{value}</TruncatableText> : value; const goToRuleDetails = useCallback( (ev) => { ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.detections}`, { + navigateToApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getRuleDetailsUrl(ruleId ?? '', search), }); }, @@ -71,7 +72,8 @@ export const RenderRuleName: React.FC<RenderRuleNameProps> = ({ > <LinkAnchor onClick={goToRuleDetails} - href={getUrlForApp(`${APP_ID}:${SecurityPageName.detections}`, { + href={getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.rules, path: getRuleDetailsUrl(ruleId, search), })} > diff --git a/x-pack/plugins/security_solution/public/timelines/index.ts b/x-pack/plugins/security_solution/public/timelines/index.ts index 224eec7568c6bf..8725072e618498 100644 --- a/x-pack/plugins/security_solution/public/timelines/index.ts +++ b/x-pack/plugins/security_solution/public/timelines/index.ts @@ -6,7 +6,7 @@ */ import { SecuritySubPluginWithStore } from '../app/types'; -import { TimelinesRoutes } from './routes'; +import { routes } from './routes'; import { initialTimelineState, timelineReducer } from './store/timeline/reducer'; import { TimelineState } from './store/timeline/types'; @@ -15,7 +15,7 @@ export class Timelines { public start(): SecuritySubPluginWithStore<'timeline', TimelineState> { return { - SubPluginRoutes: TimelinesRoutes, + routes, store: { initialState: { timeline: initialTimelineState }, reducer: { timeline: timelineReducer }, diff --git a/x-pack/plugins/security_solution/public/timelines/pages/index.tsx b/x-pack/plugins/security_solution/public/timelines/pages/index.tsx index 806ac57df1f65c..2bf6e1259ff75e 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/index.tsx @@ -7,7 +7,7 @@ import { isEmpty } from 'lodash/fp'; import React from 'react'; -import { Switch, Route, useHistory } from 'react-router-dom'; +import { Switch, Route, Redirect } from 'react-router-dom'; import { ChromeBreadcrumb } from '../../../../../../src/core/public'; @@ -18,11 +18,11 @@ import { TimelinesPage } from './timelines_page'; import { PAGE_TITLE } from './translations'; import { appendSearch } from '../../common/components/link_to/helpers'; import { GetUrlForApp } from '../../common/components/navigation/types'; -import { APP_ID } from '../../../common/constants'; +import { APP_ID, TIMELINES_PATH } from '../../../common/constants'; import { SecurityPageName } from '../../app/types'; -const timelinesPagePath = `/:tabName(${TimelineType.default}|${TimelineType.template})`; -const timelinesDefaultPath = `/${TimelineType.default}`; +const timelinesPagePath = `${TIMELINES_PATH}/:tabName(${TimelineType.default}|${TimelineType.template})`; +const timelinesDefaultPath = `${TIMELINES_PATH}/${TimelineType.default}`; export const getBreadcrumbs = ( params: TimelineRouteSpyState, @@ -31,28 +31,25 @@ export const getBreadcrumbs = ( ): ChromeBreadcrumb[] => [ { text: PAGE_TITLE, - href: getUrlForApp(`${APP_ID}:${SecurityPageName.timelines}`, { + href: getUrlForApp(APP_ID, { + deepLinkId: SecurityPageName.timelines, path: !isEmpty(search[0]) ? search[0] : '', }), }, ]; -export const Timelines = React.memo(() => { - const history = useHistory(); - return ( - <Switch> - <Route exact path={timelinesPagePath}> - <TimelinesPage /> - </Route> - <Route - path="/" - render={({ location: { search = '' } }) => { - history.replace(`${timelinesDefaultPath}${appendSearch(search)}`); - return null; - }} - /> - </Switch> - ); -}); +export const Timelines = React.memo(() => ( + <Switch> + <Route exact path={timelinesPagePath}> + <TimelinesPage /> + </Route> + <Route + path={TIMELINES_PATH} + render={({ location: { search = '' } }) => ( + <Redirect to={`${timelinesDefaultPath}${appendSearch(search)}`} /> + )} + /> + </Switch> +)); Timelines.displayName = 'Timelines'; diff --git a/x-pack/plugins/security_solution/public/timelines/routes.tsx b/x-pack/plugins/security_solution/public/timelines/routes.tsx index 010a022bfefb7e..0bc95b3b4959f8 100644 --- a/x-pack/plugins/security_solution/public/timelines/routes.tsx +++ b/x-pack/plugins/security_solution/public/timelines/routes.tsx @@ -6,20 +6,21 @@ */ import React from 'react'; -import { Route, Switch } from 'react-router-dom'; - +import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; import { Timelines } from './pages'; -import { NotFoundPage } from '../app/404'; +import { TIMELINES_PATH } from '../../common/constants'; + +import { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; -const TimelinesRoutesComponent = () => ( - <Switch> - <Route path="/"> - <Timelines /> - </Route> - <Route> - <NotFoundPage /> - </Route> - </Switch> +const TimelinesRoutes = () => ( + <TrackApplicationView viewId={SecurityPageName.timelines}> + <Timelines /> + </TrackApplicationView> ); -export const TimelinesRoutes = React.memo(TimelinesRoutesComponent); +export const routes: SecuritySubPluginRoutes = [ + { + path: TIMELINES_PATH, + render: TimelinesRoutes, + }, +]; diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index 27d89130941bd3..f9bea764c59871 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -30,9 +30,11 @@ import { MlPluginSetup, MlPluginStart } from '../../ml/public'; import { Detections } from './detections'; import { Cases } from './cases'; +import { Exceptions } from './exceptions'; import { Hosts } from './hosts'; import { Network } from './network'; import { Overview } from './overview'; +import { Rules } from './rules'; import { Timelines } from './timelines'; import { Management } from './management'; import { LicensingPluginStart, LicensingPluginSetup } from '../../licensing/public'; @@ -83,7 +85,9 @@ export interface AppObservableLibs { export type InspectResponse = Inspect & { response: string[] }; export interface SubPlugins { - detections: Detections; + alerts: Detections; + rules: Rules; + exceptions: Exceptions; cases: Cases; hosts: Hosts; network: Network; @@ -91,3 +95,16 @@ export interface SubPlugins { timelines: Timelines; management: Management; } + +// TODO: find a better way to defined these types +export interface StartedSubPlugins { + alerts: ReturnType<Detections['start']>; + rules: ReturnType<Rules['start']>; + exceptions: ReturnType<Exceptions['start']>; + cases: ReturnType<Cases['start']>; + hosts: ReturnType<Hosts['start']>; + network: ReturnType<Network['start']>; + overview: ReturnType<Overview['start']>; + timelines: ReturnType<Timelines['start']>; + management: ReturnType<Management['start']>; +} diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 4bcbcb71d048c4..9f8b1923ff5b8a 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -65,7 +65,6 @@ import { initUiSettings } from './ui_settings'; import { APP_ID, SERVER_APP_ID, - SecurityPageName, SIGNALS_ID, NOTIFICATIONS_ID, REFERENCE_RULE_ALERT_TYPE_ID, @@ -125,24 +124,6 @@ export interface PluginSetup {} // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PluginStart {} - -const casesSubPlugin = `${APP_ID}:${SecurityPageName.case}`; - -/** - * Don't include cases here so that the sub feature can govern whether Cases is enabled in the navigation - */ -const securitySubPluginsNoCases = [ - APP_ID, - `${APP_ID}:${SecurityPageName.overview}`, - `${APP_ID}:${SecurityPageName.detections}`, - `${APP_ID}:${SecurityPageName.hosts}`, - `${APP_ID}:${SecurityPageName.network}`, - `${APP_ID}:${SecurityPageName.timelines}`, - `${APP_ID}:${SecurityPageName.administration}`, -]; - -const allSecuritySubPlugins = [...securitySubPluginsNoCases, casesSubPlugin]; - export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, StartPlugins> { private readonly logger: Logger; private readonly config: ConfigType; @@ -308,7 +289,7 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S }), order: 1100, category: DEFAULT_APP_CATEGORIES.security, - app: [...allSecuritySubPlugins, 'kibana'], + app: [APP_ID, 'kibana'], catalogue: ['securitySolution'], management: { insightsAndAlerting: ['triggersActions'], @@ -323,9 +304,6 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S groupType: 'mutually_exclusive', privileges: [ { - // if the user is granted access to the cases feature than the global nav will show the cases - // sub plugin within the security solution navigation - app: [casesSubPlugin], id: 'cases_all', includeIn: 'all', name: 'All', @@ -341,7 +319,6 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S }, }, { - app: [casesSubPlugin], id: 'cases_read', includeIn: 'read', name: 'Read', @@ -363,7 +340,7 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S ], privileges: { all: { - app: [...securitySubPluginsNoCases, 'kibana'], + app: [APP_ID, 'kibana'], catalogue: ['securitySolution'], api: ['securitySolution', 'lists-all', 'lists-read'], savedObject: { @@ -384,7 +361,7 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S ui: ['show', 'crud'], }, read: { - app: [...securitySubPluginsNoCases, 'kibana'], + app: [APP_ID, 'kibana'], catalogue: ['securitySolution'], api: ['securitySolution', 'lists-read'], savedObject: { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 7ffd5d8f20ffd6..db6ec3ad7dd5b8 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -20535,7 +20535,6 @@ "xpack.securitySolution.navigation.administration": "管理", "xpack.securitySolution.navigation.alerts": "アラート", "xpack.securitySolution.navigation.case": "ケース", - "xpack.securitySolution.navigation.detectionEngine": "検出", "xpack.securitySolution.navigation.hosts": "ホスト", "xpack.securitySolution.navigation.network": "ネットワーク", "xpack.securitySolution.navigation.overview": "概要", @@ -20855,8 +20854,6 @@ "xpack.securitySolution.search.cases": "ケース", "xpack.securitySolution.search.cases.configure": "ケースを構成", "xpack.securitySolution.search.cases.create": "新規ケースを作成", - "xpack.securitySolution.search.detections": "検出", - "xpack.securitySolution.search.detections.manage": "ルールの管理", "xpack.securitySolution.search.hosts": "ホスト", "xpack.securitySolution.search.hosts.anomalies": "異常", "xpack.securitySolution.search.hosts.authentications": "認証", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4a964fc5e2fd0f..790f41209bd28a 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -20847,7 +20847,6 @@ "xpack.securitySolution.navigation.administration": "管理", "xpack.securitySolution.navigation.alerts": "告警", "xpack.securitySolution.navigation.case": "案例", - "xpack.securitySolution.navigation.detectionEngine": "检测", "xpack.securitySolution.navigation.hosts": "主机", "xpack.securitySolution.navigation.network": "网络", "xpack.securitySolution.navigation.overview": "概览", @@ -21187,8 +21186,6 @@ "xpack.securitySolution.search.cases": "案例", "xpack.securitySolution.search.cases.configure": "配置案例", "xpack.securitySolution.search.cases.create": "创建新案例", - "xpack.securitySolution.search.detections": "检测", - "xpack.securitySolution.search.detections.manage": "管理规则", "xpack.securitySolution.search.hosts": "主机", "xpack.securitySolution.search.hosts.anomalies": "异常", "xpack.securitySolution.search.hosts.authentications": "身份验证", From 0f79872219058e4e54e069499a4059f7641b3675 Mon Sep 17 00:00:00 2001 From: Pete Harverson <peteharverson@users.noreply.github.com> Date: Tue, 29 Jun 2021 14:36:41 +0100 Subject: [PATCH 083/227] [ML] Sets max height and preserve whitespace in categorization wizard examples (#103637) * [ML] Sets max height and preserve whitespace in categorization wizard examples * [ML] Edit following review --- .../categorization_view/field_examples.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/field_examples.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/field_examples.tsx index 954009c59abd5c..01eee1c9cc37ba 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/field_examples.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/field_examples.tsx @@ -7,7 +7,7 @@ import React, { FC } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiBasicTable, EuiText } from '@elastic/eui'; +import { EuiBasicTable, EuiCodeBlock } from '@elastic/eui'; import { CategoryFieldExample } from '../../../../../../../../../common/types/categories'; interface Props { @@ -31,9 +31,14 @@ export const FieldExamples: FC<Props> = ({ fieldExamples }) => { } ), render: (example: any) => ( - <EuiText size="s"> - <code>{example}</code> - </EuiText> + <EuiCodeBlock + fontSize="s" + paddingSize="none" + transparentBackground + style={{ maxHeight: '200px' }} // Don't use overflowHeight as don't want to show the fullscreen button + > + {example} + </EuiCodeBlock> ), }, ]; From 480ccd5c986c8d084429ffaedb5b776319383924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= <davidsansol92@gmail.com> Date: Tue, 29 Jun 2021 15:48:18 +0200 Subject: [PATCH 084/227] [Security solution][Endpoint] Endpoint list columns are too compressed after new side bar (#103487) * Adjusts columns width after adding new side nav bar * Resize columns width --- .../public/management/pages/endpoint_hosts/view/index.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index 7a553cfa8a32a5..0ee345431055bb 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -251,6 +251,7 @@ export const EndpointList = () => { return [ { field: 'metadata', + width: '15%', name: i18n.translate('xpack.securitySolution.endpoint.list.hostname', { defaultMessage: 'Hostname', }), @@ -370,6 +371,7 @@ export const EndpointList = () => { }, { field: 'metadata.host.ip', + width: '12%', name: i18n.translate('xpack.securitySolution.endpoint.list.ip', { defaultMessage: 'IP Address', }), @@ -388,7 +390,7 @@ export const EndpointList = () => { }, { field: 'metadata.agent.version', - width: '5%', + width: '9%', name: i18n.translate('xpack.securitySolution.endpoint.list.endpointVersion', { defaultMessage: 'Version', }), @@ -396,6 +398,7 @@ export const EndpointList = () => { { field: 'metadata.@timestamp', name: lastActiveColumnName, + width: '9%', render(dateValue: HostInfo['metadata']['@timestamp']) { return ( <FormattedDate @@ -408,7 +411,7 @@ export const EndpointList = () => { }, { field: '', - width: '5%', + width: '8%', name: i18n.translate('xpack.securitySolution.endpoint.list.actions', { defaultMessage: 'Actions', }), From 75fa47cdcff8a5fa34f464f9f375fba948cbafd7 Mon Sep 17 00:00:00 2001 From: Tiago Costa <tiagoffcc@hotmail.com> Date: Tue, 29 Jun 2021 14:59:38 +0100 Subject: [PATCH 085/227] chore(NA): moving @kbn/test-subj-selector into bazel (#103562) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../monorepo-packages.asciidoc | 1 + package.json | 2 +- packages/BUILD.bazel | 1 + packages/kbn-test-subj-selector/BUILD.bazel | 48 +++++++++++++++++++ yarn.lock | 2 +- 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 packages/kbn-test-subj-selector/BUILD.bazel diff --git a/docs/developer/getting-started/monorepo-packages.asciidoc b/docs/developer/getting-started/monorepo-packages.asciidoc index 0ee4c09192896c..7d708e17ae1161 100644 --- a/docs/developer/getting-started/monorepo-packages.asciidoc +++ b/docs/developer/getting-started/monorepo-packages.asciidoc @@ -107,6 +107,7 @@ yarn kbn watch-bazel - @kbn/std - @kbn/storybook - @kbn/telemetry-utils +- @kbn/test-subj-selector - @kbn/tinymath - @kbn/ui-framework - @kbn/ui-shared-deps diff --git a/package.json b/package.json index 2e22a4e0ccf771..1111179fc816b6 100644 --- a/package.json +++ b/package.json @@ -474,7 +474,7 @@ "@kbn/storybook": "link:bazel-bin/packages/kbn-storybook", "@kbn/telemetry-tools": "link:bazel-bin/packages/kbn-telemetry-tools", "@kbn/test": "link:packages/kbn-test", - "@kbn/test-subj-selector": "link:packages/kbn-test-subj-selector", + "@kbn/test-subj-selector": "link:bazel-bin/packages/kbn-test-subj-selector", "@loaders.gl/polyfills": "^2.3.5", "@microsoft/api-documenter": "7.7.2", "@microsoft/api-extractor": "7.7.0", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 225a41a5fd8b69..38d3f28ec866b7 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -52,6 +52,7 @@ filegroup( "//packages/kbn-std:build", "//packages/kbn-storybook:build", "//packages/kbn-telemetry-tools:build", + "//packages/kbn-test-subj-selector:build", "//packages/kbn-tinymath:build", "//packages/kbn-ui-framework:build", "//packages/kbn-ui-shared-deps:build", diff --git a/packages/kbn-test-subj-selector/BUILD.bazel b/packages/kbn-test-subj-selector/BUILD.bazel new file mode 100644 index 00000000000000..77751dc3e228a8 --- /dev/null +++ b/packages/kbn-test-subj-selector/BUILD.bazel @@ -0,0 +1,48 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") + +PKG_BASE_NAME = "kbn-test-subj-selector" +PKG_REQUIRE_NAME = "@kbn/test-subj-selector" + +SOURCE_FILES = glob([ + "index.d.ts", + "index.js" +]) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", + "README.md", +] + +DEPS = [] + +js_library( + name = PKG_BASE_NAME, + srcs = NPM_MODULE_EXTRA_FILES + [ + ":srcs", + ], + deps = DEPS, + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [ + ":%s" % PKG_BASE_NAME, + ] +) + +filegroup( + name = "build", + srcs = [ + ":npm_module", + ], + visibility = ["//visibility:public"], +) diff --git a/yarn.lock b/yarn.lock index ea968cf3631f2a..21a7b445d43712 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2785,7 +2785,7 @@ version "0.0.0" uid "" -"@kbn/test-subj-selector@link:packages/kbn-test-subj-selector": +"@kbn/test-subj-selector@link:bazel-bin/packages/kbn-test-subj-selector": version "0.0.0" uid "" From a2f9e94fc0751e2fb79138145ea834242291cac1 Mon Sep 17 00:00:00 2001 From: Esteban Beltran <academo@users.noreply.github.com> Date: Tue, 29 Jun 2021 16:03:29 +0200 Subject: [PATCH 086/227] [Security Solution] Remove extra spaces below TakeActionDropdown alert flyout (#103618) --- .../timelines/components/side_panel/event_details/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx index c4b19863ce7fcf..58b991dafed67f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx @@ -171,8 +171,6 @@ const EventDetailsPanelComponent: React.FC<EventDetailsPanelProps> = ({ <TakeActionDropdown onChange={showHostIsolationPanel} agentId={agentId} /> </EuiFlexItem> </EuiFlexGroup> - <EuiSpacer size="l" /> - <EuiSpacer size="l" /> </EuiFlyoutFooter> )} </> From b2d76a6cd3f96ab152a8aaa81802a048df42051f Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski <jon@budzenski.me> Date: Tue, 29 Jun 2021 09:21:58 -0500 Subject: [PATCH 087/227] [build] Remove OSS builds (#100577) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/dev/build/README.md | 4 +- src/dev/build/args.test.ts | 7 -- src/dev/build/args.ts | 3 - src/dev/build/build_distributables.ts | 2 - src/dev/build/cli.ts | 2 - src/dev/build/lib/build.test.ts | 39 +++----- src/dev/build/lib/build.ts | 12 +-- src/dev/build/lib/runner.test.ts | 92 +------------------ src/dev/build/lib/runner.ts | 8 +- .../tasks/build_kibana_platform_plugins.ts | 2 +- src/dev/build/tasks/build_packages_task.ts | 2 - src/dev/build/tasks/create_archives_task.ts | 4 +- src/dev/build/tasks/install_chromium.js | 24 ++--- src/dev/build/tasks/license_file_task.ts | 16 +--- .../os_packages/create_os_package_tasks.ts | 39 ++++---- .../tasks/os_packages/docker_generator/run.ts | 12 +-- src/dev/build/tasks/os_packages/run_fpm.ts | 12 +-- test/scripts/jenkins_build_kibana.sh | 2 +- test/scripts/jenkins_build_load_testing.sh | 2 +- test/scripts/jenkins_xpack_baseline.sh | 2 +- 20 files changed, 61 insertions(+), 225 deletions(-) diff --git a/src/dev/build/README.md b/src/dev/build/README.md index f6e11af67da33f..c499ef4a610832 100644 --- a/src/dev/build/README.md +++ b/src/dev/build/README.md @@ -12,8 +12,8 @@ node scripts/build --help # build a release version node scripts/build --release -# reuse already downloaded node executables, turn on debug logging, and only build the default distributable -node scripts/build --skip-node-download --debug --no-oss +# reuse already downloaded node executables, turn on debug logging +node scripts/build --skip-node-download --debug ``` # Fixing out of memory issues diff --git a/src/dev/build/args.test.ts b/src/dev/build/args.test.ts index e749af73241cf1..af996321caa5ad 100644 --- a/src/dev/build/args.test.ts +++ b/src/dev/build/args.test.ts @@ -27,7 +27,6 @@ it('build default and oss dist for current platform, without packages, by defaul Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": false, @@ -54,7 +53,6 @@ it('builds packages if --all-platforms is passed', () => { Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": true, "createDockerCentOS": true, @@ -81,7 +79,6 @@ it('limits packages if --rpm passed with --all-platforms', () => { Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": false, @@ -108,7 +105,6 @@ it('limits packages if --deb passed with --all-platforms', () => { Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": true, "createDockerCentOS": false, @@ -136,7 +132,6 @@ it('limits packages if --docker passed with --all-platforms', () => { Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": true, @@ -171,7 +166,6 @@ it('limits packages if --docker passed with --skip-docker-ubi and --all-platform Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": true, @@ -199,7 +193,6 @@ it('limits packages if --all-platforms passed with --skip-docker-centos', () => Object { "buildOptions": Object { "buildDefaultDist": true, - "buildOssDist": true, "createArchives": true, "createDebPackage": true, "createDockerCentOS": false, diff --git a/src/dev/build/args.ts b/src/dev/build/args.ts index bbfbd3e6f8813a..54da6ac86d3f7c 100644 --- a/src/dev/build/args.ts +++ b/src/dev/build/args.ts @@ -15,8 +15,6 @@ export function readCliArgs(argv: string[]) { const unknownFlags: string[] = []; const flags = getopts(argv, { boolean: [ - 'oss', - 'no-oss', 'skip-archives', 'skip-initialize', 'skip-generic-folders', @@ -94,7 +92,6 @@ export function readCliArgs(argv: string[]) { const buildOptions: BuildOptions = { isRelease: Boolean(flags.release), versionQualifier: flags['version-qualifier'], - buildOssDist: flags.oss !== false, buildDefaultDist: !flags.oss, initialize: !Boolean(flags['skip-initialize']), downloadFreshNode: !Boolean(flags['skip-node-download']), diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index f0403fac1e26b3..ea543b19030ffb 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -13,7 +13,6 @@ import * as Tasks from './tasks'; export interface BuildOptions { isRelease: boolean; - buildOssDist: boolean; buildDefaultDist: boolean; downloadFreshNode: boolean; initialize: boolean; @@ -38,7 +37,6 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions config, log, buildDefaultDist: options.buildDefaultDist, - buildOssDist: options.buildOssDist, }); /** diff --git a/src/dev/build/cli.ts b/src/dev/build/cli.ts index 3712e2230296a1..c727c26d7dcd30 100644 --- a/src/dev/build/cli.ts +++ b/src/dev/build/cli.ts @@ -33,8 +33,6 @@ if (showHelp) { build the Kibana distributable options: - --oss {dim Only produce the OSS distributable of Kibana} - --no-oss {dim Only produce the default distributable of Kibana} --skip-archives {dim Don't produce tar/zip archives} --skip-os-packages {dim Don't produce rpm/deb/docker packages} --all-platforms {dim Produce archives for all platforms, not just this one} diff --git a/src/dev/build/lib/build.test.ts b/src/dev/build/lib/build.test.ts index fe328329d7df03..f92a91e2b7221e 100644 --- a/src/dev/build/lib/build.test.ts +++ b/src/dev/build/lib/build.test.ts @@ -43,40 +43,24 @@ beforeEach(() => { jest.clearAllMocks(); }); -const ossBuild = new Build(config, true); -const defaultBuild = new Build(config, false); - -describe('#isOss()', () => { - it('returns true for oss', () => { - expect(ossBuild.isOss()).toBe(true); - }); - - it('returns false for default build', () => { - expect(defaultBuild.isOss()).toBe(false); - }); -}); +const defaultBuild = new Build(config); describe('#getName()', () => { it('returns kibana for default build', () => { expect(defaultBuild.getName()).toBe('kibana'); }); - - it('returns kibana-oss for oss', () => { - expect(ossBuild.getName()).toBe('kibana-oss'); - }); }); describe('#getLogTag()', () => { it('returns string with build name in it', () => { expect(defaultBuild.getLogTag()).toContain(defaultBuild.getName()); - expect(ossBuild.getLogTag()).toContain(ossBuild.getName()); }); }); describe('#resolvePath()', () => { it('uses passed config to resolve a path relative to the repo', () => { - expect(ossBuild.resolvePath('bar')).toMatchInlineSnapshot( - `<absolute path>/build/kibana-oss/bar` + expect(defaultBuild.resolvePath('bar')).toMatchInlineSnapshot( + `<absolute path>/build/kibana/bar` ); }); @@ -89,28 +73,27 @@ describe('#resolvePath()', () => { describe('#resolvePathForPlatform()', () => { it('uses config.resolveFromRepo(), config.getBuildVersion(), and platform.getBuildName() to create path', () => { - expect(ossBuild.resolvePathForPlatform(linuxPlatform, 'foo', 'bar')).toMatchInlineSnapshot( - `<absolute path>/build/oss/kibana-8.0.0-linux-x86_64/foo/bar` + expect(defaultBuild.resolvePathForPlatform(linuxPlatform, 'foo', 'bar')).toMatchInlineSnapshot( + `<absolute path>/build/default/kibana-8.0.0-linux-x86_64/foo/bar` ); }); }); describe('#getPlatformArchivePath()', () => { it('creates correct path for different platforms', () => { - expect(ossBuild.getPlatformArchivePath(linuxPlatform)).toMatchInlineSnapshot( - `<absolute path>/target/kibana-oss-8.0.0-linux-x86_64.tar.gz` + expect(defaultBuild.getPlatformArchivePath(linuxPlatform)).toMatchInlineSnapshot( + `<absolute path>/target/kibana-8.0.0-linux-x86_64.tar.gz` ); - expect(ossBuild.getPlatformArchivePath(linuxArmPlatform)).toMatchInlineSnapshot( - `<absolute path>/target/kibana-oss-8.0.0-linux-aarch64.tar.gz` + expect(defaultBuild.getPlatformArchivePath(linuxArmPlatform)).toMatchInlineSnapshot( + `<absolute path>/target/kibana-8.0.0-linux-aarch64.tar.gz` ); - expect(ossBuild.getPlatformArchivePath(windowsPlatform)).toMatchInlineSnapshot( - `<absolute path>/target/kibana-oss-8.0.0-windows-x86_64.zip` + expect(defaultBuild.getPlatformArchivePath(windowsPlatform)).toMatchInlineSnapshot( + `<absolute path>/target/kibana-8.0.0-windows-x86_64.zip` ); }); describe('#getRootDirectory()', () => { it('creates correct root directory name', () => { - expect(ossBuild.getRootDirectory()).toMatchInlineSnapshot(`"kibana-oss-8.0.0"`); expect(defaultBuild.getRootDirectory()).toMatchInlineSnapshot(`"kibana-8.0.0"`); }); }); diff --git a/src/dev/build/lib/build.ts b/src/dev/build/lib/build.ts index f4ccb30994eef5..c777ad18dc51f0 100644 --- a/src/dev/build/lib/build.ts +++ b/src/dev/build/lib/build.ts @@ -12,14 +12,10 @@ import { Config } from './config'; import { Platform } from './platform'; export class Build { - private name = this.oss ? 'kibana-oss' : 'kibana'; - private logTag = this.oss ? chalk`{magenta [kibana-oss]}` : chalk`{cyan [ kibana ]}`; + private name = 'kibana'; + private logTag = chalk`{cyan [ kibana ]}`; - constructor(private config: Config, private oss: boolean) {} - - isOss() { - return !!this.oss; - } + constructor(private config: Config) {} resolvePath(...args: string[]) { return this.config.resolveFromRepo('build', this.name, ...args); @@ -28,7 +24,7 @@ export class Build { resolvePathForPlatform(platform: Platform, ...args: string[]) { return this.config.resolveFromRepo( 'build', - this.oss ? 'oss' : 'default', + 'default', `kibana-${this.config.getBuildVersion()}-${platform.getBuildName()}`, ...args ); diff --git a/src/dev/build/lib/runner.test.ts b/src/dev/build/lib/runner.test.ts index 0e3c00d220ad9a..581cbadeb50613 100644 --- a/src/dev/build/lib/runner.test.ts +++ b/src/dev/build/lib/runner.test.ts @@ -45,7 +45,7 @@ beforeEach(() => { jest.clearAllMocks(); }); -const setup = async (opts: { buildDefaultDist: boolean; buildOssDist: boolean }) => { +const setup = async (opts: { buildDefaultDist: boolean }) => { const config = await Config.create({ isRelease: true, targetAllPlatforms: true, @@ -61,48 +61,10 @@ const setup = async (opts: { buildDefaultDist: boolean; buildOssDist: boolean }) return { config, run }; }; -describe('buildOssDist = true, buildDefaultDist = true', () => { +describe('default dist', () => { it('runs global task once, passing config and log', async () => { const { config, run } = await setup({ buildDefaultDist: true, - buildOssDist: true, - }); - - const mock = jest.fn(); - - await run({ - global: true, - description: 'foo', - run: mock, - }); - - expect(mock).toHaveBeenCalledTimes(1); - expect(mock).toHaveBeenLastCalledWith(config, log, [expect.any(Build), expect.any(Build)]); - }); - - it('calls local tasks twice, passing each build', async () => { - const { config, run } = await setup({ - buildDefaultDist: true, - buildOssDist: true, - }); - - const mock = jest.fn(); - - await run({ - description: 'foo', - run: mock, - }); - - expect(mock).toHaveBeenCalledTimes(2); - expect(mock).toHaveBeenCalledWith(config, log, expect.any(Build)); - }); -}); - -describe('just default dist', () => { - it('runs global task once, passing config and log', async () => { - const { config, run } = await setup({ - buildDefaultDist: true, - buildOssDist: false, }); const mock = jest.fn(); @@ -120,49 +82,6 @@ describe('just default dist', () => { it('calls local tasks once, passing the default build', async () => { const { config, run } = await setup({ buildDefaultDist: true, - buildOssDist: false, - }); - - const mock = jest.fn(); - - await run({ - description: 'foo', - run: mock, - }); - - expect(mock).toHaveBeenCalledTimes(1); - expect(mock).toHaveBeenCalledWith(config, log, expect.any(Build)); - const [args] = mock.mock.calls; - const [, , build] = args; - if (build.isOss()) { - throw new Error('expected build to be the default dist, not the oss dist'); - } - }); -}); - -describe('just oss dist', () => { - it('runs global task once, passing config and log', async () => { - const { config, run } = await setup({ - buildDefaultDist: false, - buildOssDist: true, - }); - - const mock = jest.fn(); - - await run({ - global: true, - description: 'foo', - run: mock, - }); - - expect(mock).toHaveBeenCalledTimes(1); - expect(mock).toHaveBeenLastCalledWith(config, log, [expect.any(Build)]); - }); - - it('calls local tasks once, passing the oss build', async () => { - const { config, run } = await setup({ - buildDefaultDist: false, - buildOssDist: true, }); const mock = jest.fn(); @@ -174,11 +93,6 @@ describe('just oss dist', () => { expect(mock).toHaveBeenCalledTimes(1); expect(mock).toHaveBeenCalledWith(config, log, expect.any(Build)); - const [args] = mock.mock.calls; - const [, , build] = args; - if (!build.isOss()) { - throw new Error('expected build to be the oss dist, not the default dist'); - } }); }); @@ -186,7 +100,6 @@ describe('task rejection', () => { it('rejects, logs error, and marks error logged', async () => { const { run } = await setup({ buildDefaultDist: true, - buildOssDist: false, }); const error = new Error('FOO'); @@ -215,7 +128,6 @@ describe('task rejection', () => { it('just rethrows errors that have already been logged', async () => { const { run } = await setup({ buildDefaultDist: true, - buildOssDist: false, }); const error = markErrorLogged(new Error('FOO')); diff --git a/src/dev/build/lib/runner.ts b/src/dev/build/lib/runner.ts index 015de6fe7e9ef7..eccde9160f8a3a 100644 --- a/src/dev/build/lib/runner.ts +++ b/src/dev/build/lib/runner.ts @@ -16,7 +16,6 @@ import { Config } from './config'; interface Options { config: Config; log: ToolingLog; - buildOssDist: boolean; buildDefaultDist: boolean; } @@ -32,7 +31,7 @@ export interface Task { run(config: Config, log: ToolingLog, build: Build): Promise<void>; } -export function createRunner({ config, log, buildOssDist, buildDefaultDist }: Options) { +export function createRunner({ config, log, buildDefaultDist }: Options) { async function execTask(desc: string, task: Task | GlobalTask, lastArg: any) { log.info(desc); log.indent(4); @@ -64,10 +63,7 @@ export function createRunner({ config, log, buildOssDist, buildDefaultDist }: Op const builds: Build[] = []; if (buildDefaultDist) { - builds.push(new Build(config, false)); - } - if (buildOssDist) { - builds.push(new Build(config, true)); + builds.push(new Build(config)); } /** diff --git a/src/dev/build/tasks/build_kibana_platform_plugins.ts b/src/dev/build/tasks/build_kibana_platform_plugins.ts index edff77d458f0f8..7d8690df6f3cec 100644 --- a/src/dev/build/tasks/build_kibana_platform_plugins.ts +++ b/src/dev/build/tasks/build_kibana_platform_plugins.ts @@ -27,7 +27,7 @@ export const BuildKibanaPlatformPlugins: Task = { repoRoot: REPO_ROOT, outputRoot: build.resolvePath(), cache: false, - oss: build.isOss(), + oss: false, examples: false, watch: false, dist: true, diff --git a/src/dev/build/tasks/build_packages_task.ts b/src/dev/build/tasks/build_packages_task.ts index e6305b3761a4f7..808903661a5950 100644 --- a/src/dev/build/tasks/build_packages_task.ts +++ b/src/dev/build/tasks/build_packages_task.ts @@ -63,7 +63,6 @@ export const BuildBazelPackages: Task = { await buildBazelProductionProjects({ kibanaRoot: config.resolveFromRepo(), buildRoot: build.resolvePath(), - onlyOSS: build.isOss(), }); }, }; @@ -75,7 +74,6 @@ export const BuildPackages: Task = { await buildNonBazelProductionProjects({ kibanaRoot: config.resolveFromRepo(), buildRoot: build.resolvePath(), - onlyOSS: build.isOss(), }); }, }; diff --git a/src/dev/build/tasks/create_archives_task.ts b/src/dev/build/tasks/create_archives_task.ts index e2d3ff7149c4c5..37c4becae76a83 100644 --- a/src/dev/build/tasks/create_archives_task.ts +++ b/src/dev/build/tasks/create_archives_task.ts @@ -77,14 +77,14 @@ export const CreateArchives: Task = { const metrics: CiStatsMetric[] = []; for (const { format, path, fileCount } of archives) { metrics.push({ - group: `${build.isOss() ? 'oss ' : ''}distributable size`, + group: `distributable size`, id: format, value: (await asyncStat(path)).size, }); metrics.push({ group: 'distributable file count', - id: build.isOss() ? 'oss' : 'default', + id: 'default', value: fileCount, }); } diff --git a/src/dev/build/tasks/install_chromium.js b/src/dev/build/tasks/install_chromium.js index b21a8484fa7104..37abcbad4466eb 100644 --- a/src/dev/build/tasks/install_chromium.js +++ b/src/dev/build/tasks/install_chromium.js @@ -15,21 +15,17 @@ export const InstallChromium = { description: 'Installing Chromium', async run(config, log, build) { - if (build.isOss()) { - return; - } else { - for (const platform of config.getNodePlatforms()) { - log.info(`Installing Chromium for ${platform.getName()}-${platform.getArchitecture()}`); + for (const platform of config.getNodePlatforms()) { + log.info(`Installing Chromium for ${platform.getName()}-${platform.getArchitecture()}`); - const { binaryPath$ } = installBrowser( - // TODO: https://github.com/elastic/kibana/issues/72496 - log, - build.resolvePathForPlatform(platform, 'x-pack/plugins/reporting/chromium'), - platform.getName(), - platform.getArchitecture() - ); - await binaryPath$.pipe(first()).toPromise(); - } + const { binaryPath$ } = installBrowser( + // TODO: https://github.com/elastic/kibana/issues/72496 + log, + build.resolvePathForPlatform(platform, 'x-pack/plugins/reporting/chromium'), + platform.getName(), + platform.getArchitecture() + ); + await binaryPath$.pipe(first()).toPromise(); } }, }; diff --git a/src/dev/build/tasks/license_file_task.ts b/src/dev/build/tasks/license_file_task.ts index 7e5ed8da0a27a9..ff33707476576f 100644 --- a/src/dev/build/tasks/license_file_task.ts +++ b/src/dev/build/tasks/license_file_task.ts @@ -8,23 +8,13 @@ import { write, read, Task } from '../lib'; -const LICENSE_SEPARATOR = `\n------------------------------------------------------------------------\n\n`; - export const UpdateLicenseFile: Task = { description: 'Updating LICENSE.txt file', async run(config, log, build) { const elasticLicense = await read(config.resolveFromRepo('licenses/ELASTIC-LICENSE-2.0.txt')); - if (build.isOss()) { - const ssplLicense = await read(config.resolveFromRepo('licenses/SSPL-LICENSE.txt')); - log.info('Copying dual-license to LICENSE.txt'); - await write( - build.resolvePath('LICENSE.txt'), - ssplLicense + LICENSE_SEPARATOR + elasticLicense - ); - } else { - log.info('Copying Elastic license to LICENSE.txt'); - await write(build.resolvePath('LICENSE.txt'), elasticLicense); - } + + log.info('Copying Elastic license to LICENSE.txt'); + await write(build.resolvePath('LICENSE.txt'), elasticLicense); }, }; diff --git a/src/dev/build/tasks/os_packages/create_os_package_tasks.ts b/src/dev/build/tasks/os_packages/create_os_package_tasks.ts index 2ae882000cae00..99d0e1998e78a8 100644 --- a/src/dev/build/tasks/os_packages/create_os_package_tasks.ts +++ b/src/dev/build/tasks/os_packages/create_os_package_tasks.ts @@ -73,15 +73,12 @@ export const CreateDockerUBI: Task = { description: 'Creating Docker UBI image', async run(config, log, build) { - if (!build.isOss()) { - await runDockerGenerator(config, log, build, { - architecture: 'x64', - context: false, - ubi: true, - image: true, - dockerBuildDate, - }); - } + await runDockerGenerator(config, log, build, { + architecture: 'x64', + context: false, + ubi: true, + image: true, + }); }, }; @@ -95,19 +92,15 @@ export const CreateDockerContexts: Task = { dockerBuildDate, }); - if (!build.isOss()) { - await runDockerGenerator(config, log, build, { - ubi: true, - context: true, - image: false, - dockerBuildDate, - }); - await runDockerGenerator(config, log, build, { - ironbank: true, - context: true, - image: false, - dockerBuildDate, - }); - } + await runDockerGenerator(config, log, build, { + ubi: true, + context: true, + image: false, + }); + await runDockerGenerator(config, log, build, { + ironbank: true, + context: true, + image: false, + }); }, }; diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index c72112b7b6b03d..97fd7404097410 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -43,24 +43,18 @@ export async function runDockerGenerator( let imageFlavor = ''; if (flags.ubi) imageFlavor += `-${ubiVersionTag}`; if (flags.ironbank) imageFlavor += '-ironbank'; - if (build.isOss()) imageFlavor += '-oss'; // General docker var config - const license = build.isOss() ? 'ASL 2.0' : 'Elastic License'; + const license = 'Elastic License'; const imageTag = 'docker.elastic.co/kibana/kibana'; const version = config.getBuildVersion(); const artifactArchitecture = flags.architecture === 'aarch64' ? 'aarch64' : 'x86_64'; - const artifactFlavor = build.isOss() ? '-oss' : ''; - const artifactPrefix = `kibana${artifactFlavor}-${version}-linux`; + const artifactPrefix = `kibana-${version}-linux`; const artifactTarball = `${artifactPrefix}-${artifactArchitecture}.tar.gz`; const artifactsDir = config.resolveFromTarget('.'); const dockerBuildDate = flags.dockerBuildDate || new Date().toISOString(); // That would produce oss, default and default-ubi7 - const dockerBuildDir = config.resolveFromRepo( - 'build', - 'kibana-docker', - build.isOss() ? `oss` : `default${imageFlavor}` - ); + const dockerBuildDir = config.resolveFromRepo('build', 'kibana-docker', `default${imageFlavor}`); const imageArchitecture = flags.architecture === 'aarch64' ? '-aarch64' : ''; const dockerTargetFilename = config.resolveFromTarget( `kibana${imageFlavor}-${version}-docker-image${imageArchitecture}.tar.gz` diff --git a/src/dev/build/tasks/os_packages/run_fpm.ts b/src/dev/build/tasks/os_packages/run_fpm.ts index 933b3e411b2864..b732e4c80ea370 100644 --- a/src/dev/build/tasks/os_packages/run_fpm.ts +++ b/src/dev/build/tasks/os_packages/run_fpm.ts @@ -28,11 +28,7 @@ export async function runFpm( const fromBuild = (...paths: string[]) => build.resolvePathForPlatform(linux, ...paths); const pickLicense = () => { - if (build.isOss()) { - return type === 'rpm' ? 'ASL 2.0' : 'ASL-2.0'; - } else { - return type === 'rpm' ? 'Elastic License' : 'Elastic-License'; - } + return type === 'rpm' ? 'Elastic License' : 'Elastic-License'; }; const envFolder = type === 'rpm' ? 'sysconfig' : 'default'; @@ -57,7 +53,7 @@ export async function runFpm( // general info about the package '--name', - build.isOss() ? 'kibana-oss' : 'kibana', + 'kibana', '--description', 'Explore and visualize your Elasticsearch data', '--version', @@ -71,10 +67,6 @@ export async function runFpm( '--license', pickLicense(), - // prevent installing kibana if installing kibana-oss and vice versa - '--conflicts', - build.isOss() ? 'kibana' : 'kibana-oss', - // define install/uninstall scripts '--after-install', resolve(__dirname, 'package_scripts/post_install.sh'), diff --git a/test/scripts/jenkins_build_kibana.sh b/test/scripts/jenkins_build_kibana.sh index 198723908cf487..a9edd3ed2a701b 100755 --- a/test/scripts/jenkins_build_kibana.sh +++ b/test/scripts/jenkins_build_kibana.sh @@ -33,7 +33,7 @@ node x-pack/scripts/functional_tests --assert-none-excluded \ # Do not build kibana for code coverage run if [[ -z "$CODE_COVERAGE" ]] ; then echo " -> building and extracting default Kibana distributable for use in functional tests" - node scripts/build --debug --no-oss + node scripts/build --debug echo " -> shipping metrics from build to ci-stats" node scripts/ship_ci_stats \ diff --git a/test/scripts/jenkins_build_load_testing.sh b/test/scripts/jenkins_build_load_testing.sh index 5571eee4f28edb..d7c7bda83c9ef2 100755 --- a/test/scripts/jenkins_build_load_testing.sh +++ b/test/scripts/jenkins_build_load_testing.sh @@ -60,7 +60,7 @@ export KBN_NP_PLUGINS_BUILT=true echo " -> Building and extracting default Kibana distributable for use in functional tests" cd "$KIBANA_DIR" -node scripts/build --debug --no-oss +node scripts/build --debug linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" installDir="$KIBANA_DIR/install/kibana" mkdir -p "$installDir" diff --git a/test/scripts/jenkins_xpack_baseline.sh b/test/scripts/jenkins_xpack_baseline.sh index 8d5624949505a5..c68c0f40902f22 100755 --- a/test/scripts/jenkins_xpack_baseline.sh +++ b/test/scripts/jenkins_xpack_baseline.sh @@ -5,7 +5,7 @@ source "$KIBANA_DIR/src/dev/ci_setup/setup_percy.sh" echo " -> building and extracting default Kibana distributable" cd "$KIBANA_DIR" -node scripts/build --debug --no-oss +node scripts/build --debug echo " -> shipping metrics from build to ci-stats" node scripts/ship_ci_stats \ From 6c3019dfe2de9a1c720b999614e786474f8f3a28 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+Dmitriynj@users.noreply.github.com> Date: Tue, 29 Jun 2021 17:36:04 +0300 Subject: [PATCH 088/227] [Discover] Replace doc viewer table with EuiInMemoryTable (#102149) * [Discover] replace legacy table with euiInMemoryTable * [Discover] update styles, add badge * fix font in badge and adjust line height * add tooltip * [Discover] update unit tests, return actions column to left side * [Discover] update field name test snapshot * [Discover] update wording * [Discover] handle pagination, return formatting value styles * [Discover] fix failing stylelint error * [Discover] return responsive prop, update classes * [Discover] update test and meet formatting rules * improve table view on medium * remove extra file * [Discover] fix unit test * [Discover] align top vertically field name and action cells, disable table responsive design * [Discover] adjust styles for cross browser compatibility * [Discover] remove pagination optimize styles, update test * [Discover] fix eslint * [Discover] clean up styles * [Discover] fix single doc view * [Discover] add check lack of multifieldBadge Co-authored-by: Andrea Del Rio <delrio.andre@gmail.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/doc_viewer/doc_viewer.scss | 89 +++---- .../__snapshots__/field_name.test.tsx.snap | 84 ++++--- .../components/field_name/field_name.scss | 12 + .../components/field_name/field_name.tsx | 68 ++++-- .../components/table/table.test.tsx | 75 ++++-- .../application/components/table/table.tsx | 230 ++++++++---------- .../components/table/table_cell_actions.tsx | 60 +++++ .../components/table/table_cell_value.tsx | 66 +++++ .../components/table/table_columns.tsx | 92 +++++++ .../components/table/table_row.tsx | 112 --------- src/plugins/discover/public/plugin.tsx | 5 +- 11 files changed, 508 insertions(+), 385 deletions(-) create mode 100644 src/plugins/discover/public/application/components/field_name/field_name.scss create mode 100644 src/plugins/discover/public/application/components/table/table_cell_actions.tsx create mode 100644 src/plugins/discover/public/application/components/table/table_cell_value.tsx create mode 100644 src/plugins/discover/public/application/components/table/table_columns.tsx delete mode 100644 src/plugins/discover/public/application/components/table/table_row.tsx diff --git a/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss b/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss index f5a4180207c331..12d56d564b8559 100644 --- a/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss +++ b/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss @@ -1,82 +1,57 @@ -.kbnDocViewerTable { - @include euiBreakpoint('xs', 's','m') { - table-layout: fixed; - } -} - .kbnDocViewer { - pre, - .kbnDocViewer__value { - display: inline-block; - word-break: break-all; - word-wrap: break-word; - white-space: pre-wrap; - color: $euiColorFullShade; + .euiTableRowCell { vertical-align: top; - padding-top: $euiSizeXS * .5; - } - .kbnDocViewer__field { - padding-top: $euiSizeS; - } - - .kbnDocViewer__multifield_row:hover td { - background-color: transparent; - } - - .kbnDocViewer__multifield_title { - font-family: $euiFontFamily; } - .dscFieldName { - color: $euiColorDarkShade; + tr:first-child th { + border-bottom-color: transparent; } +} - td, - pre { - font-family: $euiCodeFontFamily; - } +.kbnDocViewer__tableRow { + font-size: $euiFontSizeXS; + font-family: $euiCodeFontFamily; - tr:first-child td { - border-top-color: transparent; + .kbnDocViewer__buttons { + // Show all icons if one is focused, + &:focus-within { + .kbnDocViewer__actionButton { + opacity: 1; + } + } } - tr:hover { + &:hover { .kbnDocViewer__actionButton { opacity: 1; } } -} -.kbnDocViewer__buttons, -.kbnDocViewer__field { - white-space: nowrap; -} -.kbnDocViewer__buttons { - width: 108px; + .kbnDocViewer__actionButton { + @include euiBreakpoint('m', 'l', 'xl') { + opacity: 0; + } - // Show all icons if one is focused, - &:focus-within { - .kbnDocViewer__actionButton { + &:focus { opacity: 1; } } } -.kbnDocViewer__field { - width: $euiSize * 10; - @include euiBreakpoint('xs', 's', 'm') { - width: $euiSize * 6; - } +.kbnDocViewer__tableActionsCell, +.kbnDocViewer__tableFieldNameCell { + align-items: flex-start; + padding: $euiSizeXS; } -.kbnDocViewer__actionButton { - @include euiBreakpoint('m', 'l', 'xl') { - opacity: 0; - } - - &:focus { - opacity: 1; - } +.kbnDocViewer__value { + display: inline-block; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; + line-height: $euiLineHeight; + color: $euiColorFullShade; + vertical-align: top; } .kbnDocViewer__warning { diff --git a/src/plugins/discover/public/application/components/field_name/__snapshots__/field_name.test.tsx.snap b/src/plugins/discover/public/application/components/field_name/__snapshots__/field_name.test.tsx.snap index 6b5e45f8a04488..284c77c96db786 100644 --- a/src/plugins/discover/public/application/components/field_name/__snapshots__/field_name.test.tsx.snap +++ b/src/plugins/discover/public/application/components/field_name/__snapshots__/field_name.test.tsx.snap @@ -1,11 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`FieldName renders a geo field 1`] = ` -<div - class="euiFlexGroup euiFlexGroup--gutterSmall euiFlexGroup--alignItemsCenter euiFlexGroup--directionRow" -> +Array [ <div - class="euiFlexItem euiFlexItem--flexGrowZero" + class="euiFlexItem euiFlexItem--flexGrowZero kbnDocViewer__fieldIcon" > <span class="euiToken euiToken--euiColorVis5 euiToken--square euiToken--light euiToken--small kbnFieldIcon" @@ -16,27 +14,29 @@ exports[`FieldName renders a geo field 1`] = ` title="Geo point field" /> </span> - </div> + </div>, <div - class="euiFlexItem eui-textTruncate" + class="euiFlexGroup euiFlexGroup--alignItemsFlexStart euiFlexGroup--directionRow euiFlexGroup--wrap" > - <span - class="euiToolTipAnchor eui-textTruncate" + <div + class="euiFlexItem euiFlexItem--flexGrowZero kbnDocViewer__fieldName eui-textBreakAll" > - <span> - test.test.test + <span + class="euiToolTipAnchor eui-textBreakAll" + > + <span> + test.test.test + </span> </span> - </span> - </div> -</div> + </div> + </div>, +] `; exports[`FieldName renders a number field by providing a field record 1`] = ` -<div - class="euiFlexGroup euiFlexGroup--gutterSmall euiFlexGroup--alignItemsCenter euiFlexGroup--directionRow" -> +Array [ <div - class="euiFlexItem euiFlexItem--flexGrowZero" + class="euiFlexItem euiFlexItem--flexGrowZero kbnDocViewer__fieldIcon" > <span class="euiToken euiToken--euiColorVis0 euiToken--square euiToken--light euiToken--small kbnFieldIcon" @@ -47,27 +47,29 @@ exports[`FieldName renders a number field by providing a field record 1`] = ` title="Number field" /> </span> - </div> + </div>, <div - class="euiFlexItem eui-textTruncate" + class="euiFlexGroup euiFlexGroup--alignItemsFlexStart euiFlexGroup--directionRow euiFlexGroup--wrap" > - <span - class="euiToolTipAnchor eui-textTruncate" + <div + class="euiFlexItem euiFlexItem--flexGrowZero kbnDocViewer__fieldName eui-textBreakAll" > - <span> - test.test.test + <span + class="euiToolTipAnchor eui-textBreakAll" + > + <span> + test.test.test + </span> </span> - </span> - </div> -</div> + </div> + </div>, +] `; exports[`FieldName renders a string field by providing fieldType and fieldName 1`] = ` -<div - class="euiFlexGroup euiFlexGroup--gutterSmall euiFlexGroup--alignItemsCenter euiFlexGroup--directionRow" -> +Array [ <div - class="euiFlexItem euiFlexItem--flexGrowZero" + class="euiFlexItem euiFlexItem--flexGrowZero kbnDocViewer__fieldIcon" > <span class="euiToken euiToken--euiColorVis1 euiToken--square euiToken--light euiToken--small kbnFieldIcon" @@ -78,17 +80,21 @@ exports[`FieldName renders a string field by providing fieldType and fieldName 1 title="String field" /> </span> - </div> + </div>, <div - class="euiFlexItem eui-textTruncate" + class="euiFlexGroup euiFlexGroup--alignItemsFlexStart euiFlexGroup--directionRow euiFlexGroup--wrap" > - <span - class="euiToolTipAnchor eui-textTruncate" + <div + class="euiFlexItem euiFlexItem--flexGrowZero kbnDocViewer__fieldName eui-textBreakAll" > - <span> - test + <span + class="euiToolTipAnchor eui-textBreakAll" + > + <span> + test + </span> </span> - </span> - </div> -</div> + </div> + </div>, +] `; diff --git a/src/plugins/discover/public/application/components/field_name/field_name.scss b/src/plugins/discover/public/application/components/field_name/field_name.scss new file mode 100644 index 00000000000000..edc4ea270d7554 --- /dev/null +++ b/src/plugins/discover/public/application/components/field_name/field_name.scss @@ -0,0 +1,12 @@ +.kbnDocViewer__fieldIcon { + padding-top: $euiSizeXS * 1.5; +} + +.kbnDocViewer__fieldName { + line-height: $euiLineHeight; + padding: $euiSizeXS; +} + +.kbnDocViewer__multiFieldBadge { + @include euiFont; +} diff --git a/src/plugins/discover/public/application/components/field_name/field_name.tsx b/src/plugins/discover/public/application/components/field_name/field_name.tsx index d89ce7eb051ee1..e8b6765b738a53 100644 --- a/src/plugins/discover/public/application/components/field_name/field_name.tsx +++ b/src/plugins/discover/public/application/components/field_name/field_name.tsx @@ -6,21 +6,23 @@ * Side Public License, v 1. */ -import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import React, { Fragment } from 'react'; +import './field_name.scss'; +import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; import { FieldIcon, FieldIconProps } from '../../../../../kibana_react/public'; import { getFieldTypeName } from './field_type_name'; -import { FieldMapping } from '../../doc_views/doc_views_types'; +import { IndexPatternField } from '../../../../../data/public'; // properties fieldType and fieldName are provided in kbn_doc_view // this should be changed when both components are deangularized interface Props { fieldName: string; fieldType: string; - fieldMapping?: FieldMapping; + fieldMapping?: IndexPatternField; fieldIconProps?: Omit<FieldIconProps, 'type'>; scripted?: boolean; - className?: string; } export function FieldName({ @@ -28,29 +30,57 @@ export function FieldName({ fieldMapping, fieldType, fieldIconProps, - className, scripted = false, }: Props) { const typeName = getFieldTypeName(fieldType); const displayName = fieldMapping && fieldMapping.displayName ? fieldMapping.displayName : fieldName; const tooltip = displayName !== fieldName ? `${fieldName} (${displayName})` : fieldName; + const isMultiField = !!fieldMapping?.spec?.subType?.multi; return ( - <EuiFlexGroup className={className} alignItems="center" gutterSize="s" responsive={false}> - <EuiFlexItem grow={false}> + <Fragment> + <EuiFlexItem grow={false} className="kbnDocViewer__fieldIcon"> <FieldIcon type={fieldType} label={typeName} scripted={scripted} {...fieldIconProps} /> </EuiFlexItem> - <EuiFlexItem className="eui-textTruncate"> - <EuiToolTip - position="top" - content={tooltip} - delay="long" - anchorClassName="eui-textTruncate" - > - <span>{displayName}</span> - </EuiToolTip> - </EuiFlexItem> - </EuiFlexGroup> + + <EuiFlexGroup wrap={true} gutterSize="none" responsive={false} alignItems="flexStart"> + <EuiFlexItem className="kbnDocViewer__fieldName eui-textBreakAll" grow={false}> + <EuiToolTip + position="top" + content={tooltip} + delay="long" + anchorClassName="eui-textBreakAll" + > + <span>{displayName}</span> + </EuiToolTip> + </EuiFlexItem> + + {isMultiField && ( + <EuiToolTip + position="top" + delay="long" + content={i18n.translate( + 'discover.fieldChooser.discoverField.multiFieldTooltipContent', + { + defaultMessage: 'Multi-fields can have multiple values per field', + } + )} + > + <EuiBadge + title="" + className="kbnDocViewer__multiFieldBadge" + color="default" + data-test-subj={`tableDocViewRow-${fieldName}-multifieldBadge`} + > + <FormattedMessage + id="discover.fieldChooser.discoverField.multiField" + defaultMessage="multi-field" + /> + </EuiBadge> + </EuiToolTip> + )} + </EuiFlexGroup> + </Fragment> ); } diff --git a/src/plugins/discover/public/application/components/table/table.test.tsx b/src/plugins/discover/public/application/components/table/table.test.tsx index bf27f1871cf24f..a38a9e41aa242f 100644 --- a/src/plugins/discover/public/application/components/table/table.test.tsx +++ b/src/plugins/discover/public/application/components/table/table.test.tsx @@ -9,7 +9,8 @@ import React from 'react'; import { mount } from 'enzyme'; import { findTestSubject } from '@elastic/eui/lib/test'; -import { DocViewTable } from './table'; +import { I18nProvider } from '@kbn/i18n/react'; +import { DocViewerTable, DocViewerTableProps } from './table'; import { indexPatterns, IndexPattern } from '../../../../../data/public'; import { ElasticSearchHit } from '../../doc_views/doc_views_types'; @@ -23,7 +24,7 @@ import { getServices } from '../../../kibana_services'; uiSettings: { get: (key: string) => { if (key === 'discover:showMultiFields') { - return false; + return true; } }, }, @@ -75,6 +76,14 @@ indexPattern.fields.getByName = (name: string) => { indexPattern.flattenHit = indexPatterns.flattenHitWrapper(indexPattern, indexPattern.metaFields); +const mountComponent = (props: DocViewerTableProps) => { + return mount( + <I18nProvider> + <DocViewerTable {...props} /> + </I18nProvider> + ); +}; + describe('DocViewTable at Discover', () => { // At Discover's main view, all buttons are rendered // check for existence of action buttons and warnings @@ -114,7 +123,7 @@ describe('DocViewTable at Discover', () => { onAddColumn: jest.fn(), onRemoveColumn: jest.fn(), }; - const component = mount(<DocViewTable {...props} />); + const component = mountComponent(props); [ { _property: '_index', @@ -210,7 +219,7 @@ describe('DocViewTable at Discover Context', () => { filter: jest.fn(), }; - const component = mount(<DocViewTable {...props} />); + const component = mountComponent(props); it(`renders no toggleColumnButton`, () => { const foundLength = findTestSubject(component, 'toggleColumnButtons').length; @@ -253,7 +262,7 @@ describe('DocViewTable at Discover Doc', () => { hit, indexPattern, }; - const component = mount(<DocViewTable {...props} />); + const component = mountComponent(props); const foundLength = findTestSubject(component, 'addInclusiveFilterButton').length; it(`renders no action buttons`, () => { @@ -381,20 +390,10 @@ describe('DocViewTable at Discover Doc with Fields API', () => { onAddColumn: jest.fn(), onRemoveColumn: jest.fn(), }; + it('renders multifield rows if showMultiFields flag is set', () => { - (getServices as jest.Mock).mockImplementationOnce(() => ({ - uiSettings: { - get: (key: string) => { - return key === 'discover:showMultiFields'; - }, - }, - })); - const component = mount(<DocViewTable {...props} />); - const categoryMultifieldRow = findTestSubject( - component, - 'tableDocViewRow-multifieldsTitle-category' - ); - expect(categoryMultifieldRow.length).toBe(1); + const component = mountComponent(props); + const categoryKeywordRow = findTestSubject(component, 'tableDocViewRow-category.keyword'); expect(categoryKeywordRow.length).toBe(1); @@ -404,23 +403,51 @@ describe('DocViewTable at Discover Doc with Fields API', () => { expect(findTestSubject(component, 'tableDocViewRow-customer_first_name.nickname').length).toBe( 1 ); + + expect( + findTestSubject(component, 'tableDocViewRow-category.keyword-multifieldBadge').length + ).toBe(1); + + expect( + findTestSubject(component, 'tableDocViewRow-customer_first_name.keyword-multifieldBadge') + .length + ).toBe(1); + + expect( + findTestSubject(component, 'tableDocViewRow-customer_first_name.nickname-multifieldBadge') + .length + ).toBe(1); }); it('does not render multifield rows if showMultiFields flag is not set', () => { - const component = mount(<DocViewTable {...props} />); - const categoryMultifieldRow = findTestSubject( - component, - 'tableDocViewRow-multifieldsTitle-category' - ); - expect(categoryMultifieldRow.length).toBe(0); + (getServices as jest.Mock).mockImplementationOnce(() => ({ + uiSettings: { + get: (key: string) => { + return key === 'discover:showMultiFields' && false; + }, + }, + })); + const component = mountComponent(props); + const categoryKeywordRow = findTestSubject(component, 'tableDocViewRow-category.keyword'); expect(categoryKeywordRow.length).toBe(0); expect(findTestSubject(component, 'tableDocViewRow-customer_first_name.keyword').length).toBe( 0 ); + expect(findTestSubject(component, 'tableDocViewRow-customer_first_name.nickname').length).toBe( 0 ); + + expect( + findTestSubject(component, 'tableDocViewRow-customer_first_name.keyword-multifieldBadge') + .length + ).toBe(0); + + expect( + findTestSubject(component, 'tableDocViewRow-customer_first_name.nickname-multifieldBadge') + .length + ).toBe(0); }); }); diff --git a/src/plugins/discover/public/application/components/table/table.tsx b/src/plugins/discover/public/application/components/table/table.tsx index 4d24fe15519a17..065b146105a651 100644 --- a/src/plugins/discover/public/application/components/table/table.tsx +++ b/src/plugins/discover/public/application/components/table/table.tsx @@ -6,60 +6,67 @@ * Side Public License, v 1. */ -import React, { useState, useEffect, useCallback } from 'react'; -import { i18n } from '@kbn/i18n'; -import { DocViewTableRow } from './table_row'; -import { trimAngularSpan } from './table_helper'; -import { isNestedFieldParent } from '../../apps/main/utils/nested_fields'; -import { DocViewRenderProps } from '../../doc_views/doc_views_types'; -import { getServices } from '../../../kibana_services'; +import React, { useCallback, useMemo } from 'react'; +import { EuiInMemoryTable } from '@elastic/eui'; +import { IndexPattern, IndexPatternField } from '../../../../../data/public'; import { SHOW_MULTIFIELDS } from '../../../../common'; +import { getServices } from '../../../kibana_services'; +import { isNestedFieldParent } from '../../apps/main/utils/nested_fields'; +import { + DocViewFilterFn, + ElasticSearchHit, + DocViewRenderProps, +} from '../../doc_views/doc_views_types'; +import { ACTIONS_COLUMN, MAIN_COLUMNS } from './table_columns'; -const COLLAPSE_LINE_LENGTH = 350; +export interface DocViewerTableProps { + columns?: string[]; + filter?: DocViewFilterFn; + hit: ElasticSearchHit; + indexPattern?: IndexPattern; + onAddColumn?: (columnName: string) => void; + onRemoveColumn?: (columnName: string) => void; +} -export function DocViewTable({ +export interface FieldRecord { + action: { + isActive: boolean; + onFilter?: DocViewFilterFn; + onToggleColumn: (field: string) => void; + flattenedField: unknown; + }; + field: { + fieldName: string; + fieldType: string; + fieldMapping: IndexPatternField | undefined; + scripted: boolean; + }; + value: { + formattedField: unknown; + }; +} + +export const DocViewerTable = ({ + columns, hit, indexPattern, filter, - columns, onAddColumn, onRemoveColumn, -}: DocViewRenderProps) { - const [fieldRowOpen, setFieldRowOpen] = useState({} as Record<string, boolean>); - const [multiFields, setMultiFields] = useState({} as Record<string, string[]>); - const [fieldsWithParents, setFieldsWithParents] = useState([] as string[]); +}: DocViewRenderProps) => { const showMultiFields = getServices().uiSettings.get(SHOW_MULTIFIELDS); - useEffect(() => { - if (!indexPattern) { - return; - } - const mapping = indexPattern.fields.getByName; - const flattened = indexPattern.flattenHit(hit); - const map: Record<string, string[]> = {}; - const arr: string[] = []; + const mapping = useCallback((name) => indexPattern?.fields.getByName(name), [ + indexPattern?.fields, + ]); - Object.keys(flattened).forEach((key) => { - const field = mapping(key); + const formattedHit = useMemo(() => indexPattern?.formatHit(hit, 'html'), [hit, indexPattern]); - if (field && field.spec?.subType?.multi?.parent) { - const parent = field.spec.subType.multi.parent; - if (!map[parent]) { - map[parent] = [] as string[]; - } - const value = map[parent]; - value.push(key); - map[parent] = value; - arr.push(key); - } - }); - if (showMultiFields) { - setMultiFields(map); - } - setFieldsWithParents(arr); - }, [indexPattern, hit, showMultiFields]); + const tableColumns = useMemo(() => { + return filter ? [ACTIONS_COLUMN, ...MAIN_COLUMNS] : MAIN_COLUMNS; + }, [filter]); - const toggleColumn = useCallback( + const onToggleColumn = useCallback( (field: string) => { if (!onRemoveColumn || !onAddColumn || !columns) { return; @@ -73,101 +80,62 @@ export function DocViewTable({ [onRemoveColumn, onAddColumn, columns] ); + const onSetRowProps = useCallback(({ field: { fieldName } }: FieldRecord) => { + return { + className: 'kbnDocViewer__tableRow', + 'data-test-subj': `tableDocViewRow-${fieldName}`, + }; + }, []); + if (!indexPattern) { return null; } - const mapping = indexPattern.fields.getByName; + const flattened = indexPattern.flattenHit(hit); - const formatted = indexPattern.formatHit(hit, 'html'); + const items: FieldRecord[] = Object.keys(flattened) + .filter((fieldName) => { + const fieldMapping = mapping(fieldName); + const isMultiField = !!fieldMapping?.spec?.subType?.multi; + return isMultiField ? showMultiFields : true; + }) + .sort((fieldA, fieldB) => { + const mappingA = mapping(fieldA); + const mappingB = mapping(fieldB); + const nameA = !mappingA || !mappingA.displayName ? fieldA : mappingA.displayName; + const nameB = !mappingB || !mappingB.displayName ? fieldB : mappingB.displayName; + return nameA.localeCompare(nameB); + }) + .map((fieldName) => { + const fieldMapping = mapping(fieldName); + const fieldType = isNestedFieldParent(fieldName, indexPattern) + ? 'nested' + : fieldMapping?.type; - function toggleValueCollapse(field: string) { - fieldRowOpen[field] = !fieldRowOpen[field]; - setFieldRowOpen({ ...fieldRowOpen }); - } + return { + action: { + onToggleColumn, + onFilter: filter, + isActive: !!columns?.includes(fieldName), + flattenedField: flattened[fieldName], + }, + field: { + fieldName, + fieldType: fieldType!, + scripted: Boolean(fieldMapping?.scripted), + fieldMapping, + }, + value: { formattedField: formattedHit[fieldName] }, + }; + }); return ( - <table className="table table-condensed kbnDocViewerTable"> - <tbody> - {Object.keys(flattened) - .filter((field) => { - return !fieldsWithParents.includes(field); - }) - .sort((fieldA, fieldB) => { - const mappingA = mapping(fieldA); - const mappingB = mapping(fieldB); - const nameA = !mappingA || !mappingA.displayName ? fieldA : mappingA.displayName; - const nameB = !mappingB || !mappingB.displayName ? fieldB : mappingB.displayName; - return nameA.localeCompare(nameB); - }) - .map((field) => { - const valueRaw = flattened[field]; - const value = trimAngularSpan(String(formatted[field])); - - const isCollapsible = value.length > COLLAPSE_LINE_LENGTH; - const isCollapsed = isCollapsible && !fieldRowOpen[field]; - const displayUnderscoreWarning = !mapping(field) && field.indexOf('_') === 0; - - const fieldType = isNestedFieldParent(field, indexPattern) - ? 'nested' - : indexPattern.fields.getByName(field)?.type; - return ( - <React.Fragment key={field}> - <DocViewTableRow - field={field} - fieldMapping={mapping(field)} - fieldType={String(fieldType)} - displayUnderscoreWarning={displayUnderscoreWarning} - isCollapsed={isCollapsed} - isCollapsible={isCollapsible} - isColumnActive={!!columns?.includes(field)} - onFilter={filter} - onToggleCollapse={() => toggleValueCollapse(field)} - onToggleColumn={() => toggleColumn(field)} - value={value} - valueRaw={valueRaw} - /> - {multiFields[field] ? ( - <tr - key={`tableDocViewRow-multifieldsTitle-${field}`} - className="kbnDocViewer__multifield_row" - data-test-subj={`tableDocViewRow-multifieldsTitle-${field}`} - > - <td className="kbnDocViewer__field"> </td> - <td className="kbnDocViewer__multifield_title" colSpan={2}> - <b> - {i18n.translate('discover.fieldChooser.discoverField.multiFields', { - defaultMessage: 'Multi fields', - })} - </b> - </td> - </tr> - ) : null} - {multiFields[field] - ? multiFields[field].map((multiField) => { - return ( - <DocViewTableRow - key={multiField} - fieldMapping={mapping(multiField)} - fieldType={String(fieldType)} - displayUnderscoreWarning={displayUnderscoreWarning} - isCollapsed={isCollapsed} - isCollapsible={isCollapsible} - isColumnActive={Array.isArray(columns) && columns.includes(multiField)} - onFilter={filter} - onToggleCollapse={() => { - toggleValueCollapse(multiField); - }} - onToggleColumn={() => toggleColumn(multiField)} - value={value} - valueRaw={valueRaw} - /> - ); - }) - : null} - </React.Fragment> - ); - })} - </tbody> - </table> + <EuiInMemoryTable + className="kbnDocViewer__table" + items={items} + columns={tableColumns} + rowProps={onSetRowProps} + pagination={false} + responsive={false} + /> ); -} +}; diff --git a/src/plugins/discover/public/application/components/table/table_cell_actions.tsx b/src/plugins/discover/public/application/components/table/table_cell_actions.tsx new file mode 100644 index 00000000000000..3344797b4d32ad --- /dev/null +++ b/src/plugins/discover/public/application/components/table/table_cell_actions.tsx @@ -0,0 +1,60 @@ +/* + * 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 { DocViewTableRowBtnFilterRemove } from './table_row_btn_filter_remove'; +import { DocViewTableRowBtnFilterExists } from './table_row_btn_filter_exists'; +import { DocViewTableRowBtnToggleColumn } from './table_row_btn_toggle_column'; +import { DocViewTableRowBtnFilterAdd } from './table_row_btn_filter_add'; +import { IndexPatternField } from '../../../../../data/public'; +import { DocViewFilterFn } from '../../doc_views/doc_views_types'; + +interface TableActionsProps { + isActive: boolean; + fieldName: string; + flattenedField: unknown; + fieldMapping: IndexPatternField | undefined; + onFilter: DocViewFilterFn; + onToggleColumn: (field: string) => void; +} + +export const TableActions = ({ + isActive, + fieldName, + fieldMapping, + flattenedField, + onToggleColumn, + onFilter, +}: TableActionsProps) => { + const toggleColumn = () => { + onToggleColumn(fieldName); + }; + + return ( + <div className="kbnDocViewer__buttons"> + <DocViewTableRowBtnFilterAdd + disabled={!fieldMapping || !fieldMapping.filterable} + onClick={() => onFilter(fieldMapping, flattenedField, '+')} + /> + <DocViewTableRowBtnFilterRemove + disabled={!fieldMapping || !fieldMapping.filterable} + onClick={() => onFilter(fieldMapping, flattenedField, '-')} + /> + <DocViewTableRowBtnToggleColumn + active={isActive} + fieldname={fieldName} + onClick={toggleColumn} + /> + <DocViewTableRowBtnFilterExists + disabled={!fieldMapping || !fieldMapping.filterable} + onClick={() => onFilter('_exists_', fieldName, '+')} + scripted={fieldMapping && fieldMapping.scripted} + /> + </div> + ); +}; diff --git a/src/plugins/discover/public/application/components/table/table_cell_value.tsx b/src/plugins/discover/public/application/components/table/table_cell_value.tsx new file mode 100644 index 00000000000000..de29068a827188 --- /dev/null +++ b/src/plugins/discover/public/application/components/table/table_cell_value.tsx @@ -0,0 +1,66 @@ +/* + * 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 classNames from 'classnames'; +import React, { useCallback, useState } from 'react'; +import { IndexPatternField } from '../../../../../data/public'; +import { FieldRecord } from './table'; +import { trimAngularSpan } from './table_helper'; +import { DocViewTableRowBtnCollapse } from './table_row_btn_collapse'; +import { DocViewTableRowIconUnderscore } from './table_row_icon_underscore'; + +const COLLAPSE_LINE_LENGTH = 350; + +type TableFieldValueProps = FieldRecord['value'] & { + fieldName: string; + fieldMapping: IndexPatternField | undefined; +}; + +export const TableFieldValue = ({ + formattedField, + fieldName, + fieldMapping, +}: TableFieldValueProps) => { + const [fieldOpen, setFieldOpen] = useState(false); + + const value = trimAngularSpan(String(formattedField)); + const isCollapsible = value.length > COLLAPSE_LINE_LENGTH; + const isCollapsed = isCollapsible && !fieldOpen; + const displayUnderscoreWarning = !fieldMapping && fieldName.indexOf('_') === 0; + + const valueClassName = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention + kbnDocViewer__value: true, + 'truncate-by-height': isCollapsible && isCollapsed, + }); + + const onToggleCollapse = useCallback( + () => setFieldOpen((fieldOpenPrev: boolean) => !fieldOpenPrev), + [] + ); + + return ( + <div> + {isCollapsible && ( + <DocViewTableRowBtnCollapse onClick={onToggleCollapse} isCollapsed={isCollapsed} /> + )} + {displayUnderscoreWarning && <DocViewTableRowIconUnderscore />} + {fieldName ? null : <div className={valueClassName}>{fieldName}: </div>} + <div + className={valueClassName} + data-test-subj={`tableDocViewRow-${fieldName}-value`} + /* + * Justification for dangerouslySetInnerHTML: + * We just use values encoded by our field formatters + */ + // eslint-disable-next-line react/no-danger + dangerouslySetInnerHTML={{ __html: value as string }} + /> + </div> + ); +}; diff --git a/src/plugins/discover/public/application/components/table/table_columns.tsx b/src/plugins/discover/public/application/components/table/table_columns.tsx new file mode 100644 index 00000000000000..462362d543e7a2 --- /dev/null +++ b/src/plugins/discover/public/application/components/table/table_columns.tsx @@ -0,0 +1,92 @@ +/* + * 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 { EuiBasicTableColumn, EuiText } from '@elastic/eui'; +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { FieldName } from '../field_name/field_name'; +import { FieldRecord } from './table'; +import { TableActions } from './table_cell_actions'; +import { TableFieldValue } from './table_cell_value'; + +export const ACTIONS_COLUMN: EuiBasicTableColumn<FieldRecord> = { + field: 'action', + className: 'kbnDocViewer__tableActionsCell', + width: '108px', + name: ( + <EuiText size="xs"> + <strong> + <FormattedMessage + id="discover.fieldChooser.discoverField.actions" + defaultMessage="Actions" + /> + </strong> + </EuiText> + ), + render: ( + { flattenedField, isActive, onFilter, onToggleColumn }: FieldRecord['action'], + { field: { fieldName, fieldMapping } }: FieldRecord + ) => { + return ( + <TableActions + isActive={isActive} + fieldName={fieldName} + fieldMapping={fieldMapping} + flattenedField={flattenedField} + onFilter={onFilter!} + onToggleColumn={onToggleColumn} + /> + ); + }, +}; + +export const MAIN_COLUMNS: Array<EuiBasicTableColumn<FieldRecord>> = [ + { + field: 'field', + className: 'kbnDocViewer__tableFieldNameCell', + name: ( + <EuiText size="xs"> + <strong> + <FormattedMessage id="discover.fieldChooser.discoverField.name" defaultMessage="Field" /> + </strong> + </EuiText> + ), + render: ({ fieldName, fieldType, fieldMapping, scripted }: FieldRecord['field']) => { + return ( + <FieldName + fieldName={fieldName} + fieldType={fieldType} + fieldMapping={fieldMapping} + scripted={scripted} + /> + ); + }, + }, + { + field: 'value', + name: ( + <EuiText size="xs"> + <strong> + <FormattedMessage id="discover.fieldChooser.discoverField.value" defaultMessage="Value" /> + </strong> + </EuiText> + ), + render: ( + { formattedField }: FieldRecord['value'], + { field: { fieldName, fieldMapping } }: FieldRecord + ) => { + return ( + <TableFieldValue + formattedField={formattedField} + fieldName={fieldName} + fieldMapping={fieldMapping} + /> + ); + }, + }, +]; diff --git a/src/plugins/discover/public/application/components/table/table_row.tsx b/src/plugins/discover/public/application/components/table/table_row.tsx deleted file mode 100644 index e8977fda8576a8..00000000000000 --- a/src/plugins/discover/public/application/components/table/table_row.tsx +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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 classNames from 'classnames'; -import React, { ReactNode } from 'react'; -import { FieldMapping, DocViewFilterFn } from '../../doc_views/doc_views_types'; -import { DocViewTableRowBtnFilterAdd } from './table_row_btn_filter_add'; -import { DocViewTableRowBtnFilterRemove } from './table_row_btn_filter_remove'; -import { DocViewTableRowBtnToggleColumn } from './table_row_btn_toggle_column'; -import { DocViewTableRowBtnCollapse } from './table_row_btn_collapse'; -import { DocViewTableRowBtnFilterExists } from './table_row_btn_filter_exists'; -import { DocViewTableRowIconUnderscore } from './table_row_icon_underscore'; -import { FieldName } from '../field_name/field_name'; - -export interface Props { - field?: string; - fieldMapping?: FieldMapping; - fieldType: string; - displayUnderscoreWarning: boolean; - isCollapsible: boolean; - isColumnActive: boolean; - isCollapsed: boolean; - onToggleCollapse: () => void; - onFilter?: DocViewFilterFn; - onToggleColumn?: () => void; - value: string | ReactNode; - valueRaw: unknown; -} - -export function DocViewTableRow({ - field, - fieldMapping, - fieldType, - displayUnderscoreWarning, - isCollapsible, - isCollapsed, - isColumnActive, - onFilter, - onToggleCollapse, - onToggleColumn, - value, - valueRaw, -}: Props) { - const valueClassName = classNames({ - // eslint-disable-next-line @typescript-eslint/naming-convention - kbnDocViewer__value: true, - 'truncate-by-height': isCollapsible && isCollapsed, - }); - const key = field ? field : fieldMapping?.displayName; - return ( - <tr key={key} data-test-subj={`tableDocViewRow-${key}`}> - {typeof onFilter === 'function' && ( - <td className="kbnDocViewer__buttons"> - <DocViewTableRowBtnFilterAdd - disabled={!fieldMapping || !fieldMapping.filterable} - onClick={() => onFilter(fieldMapping, valueRaw, '+')} - /> - <DocViewTableRowBtnFilterRemove - disabled={!fieldMapping || !fieldMapping.filterable} - onClick={() => onFilter(fieldMapping, valueRaw, '-')} - /> - {typeof onToggleColumn === 'function' && ( - <DocViewTableRowBtnToggleColumn - active={isColumnActive} - onClick={onToggleColumn} - fieldname={String(key)} - /> - )} - <DocViewTableRowBtnFilterExists - disabled={!fieldMapping || !fieldMapping.filterable} - onClick={() => onFilter('_exists_', field, '+')} - scripted={fieldMapping && fieldMapping.scripted} - /> - </td> - )} - <td className="kbnDocViewer__field"> - {field ? ( - <FieldName - fieldName={field} - fieldType={fieldType} - fieldMapping={fieldMapping} - scripted={Boolean(fieldMapping?.scripted)} - /> - ) : ( - <span> </span> - )} - </td> - <td> - {isCollapsible && ( - <DocViewTableRowBtnCollapse onClick={onToggleCollapse} isCollapsed={isCollapsed} /> - )} - {displayUnderscoreWarning && <DocViewTableRowIconUnderscore />} - {field ? null : <div className={valueClassName}>{key}: </div>} - <div - className={valueClassName} - data-test-subj={`tableDocViewRow-${key}-value`} - /* - * Justification for dangerouslySetInnerHTML: - * We just use values encoded by our field formatters - */ - // eslint-disable-next-line react/no-danger - dangerouslySetInnerHTML={{ __html: value as string }} - /> - </td> - </tr> - ); -} diff --git a/src/plugins/discover/public/plugin.tsx b/src/plugins/discover/public/plugin.tsx index ec89f7516e92d1..3e31fe1d46d459 100644 --- a/src/plugins/discover/public/plugin.tsx +++ b/src/plugins/discover/public/plugin.tsx @@ -36,8 +36,7 @@ import { DEFAULT_APP_CATEGORIES } from '../../../core/public'; import { UrlGeneratorState } from '../../share/public'; import { DocViewInput, DocViewInputFn } from './application/doc_views/doc_views_types'; import { DocViewsRegistry } from './application/doc_views/doc_views_registry'; -import { DocViewTable } from './application/components/table/table'; - +import { DocViewerTable } from './application/components/table/table'; import { setDocViewsRegistry, setUrlTracker, @@ -252,7 +251,7 @@ export class DiscoverPlugin defaultMessage: 'Table', }), order: 10, - component: DocViewTable, + component: DocViewerTable, }); this.docViewsRegistry.addDocView({ title: i18n.translate('discover.docViews.json.jsonTitle', { From a416e81b49c81a893094f704f2102b267c147f6f Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Tue, 29 Jun 2021 07:38:50 -0700 Subject: [PATCH 089/227] [DOCS] Fixes formatting in settings doc (#103519) --- docs/setup/settings.asciidoc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index 696b2f042057d4..a3f815e5ea5044 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -36,7 +36,7 @@ Set to `false` to disable Console. *Default: `true`* <<ops-cGroupOverrides-cpuAcctPath, `ops.cGroupOverrides.cpuAcctPath`>>. | `csp.rules:` - | deprecated:[7.14.0,"In 8.0 and later, this setting will no longer be supported."] + | deprecated:[7.14.0,"In 8.0 and later, this setting will no longer be supported."] A https://w3c.github.io/webappsec-csp/[Content Security Policy] template that disables certain unnecessary and potentially insecure capabilities in the browser. It is strongly recommended that you keep the default CSP rules @@ -73,8 +73,8 @@ that ship with {kib}. [NOTE] ============ -The `frame-ancestors` directive can also be configured by using -<<server-securityResponseHeaders-disableEmbedding, `server.securityResponseHeaders.disableEmbedding`>>. In that case, that takes precedence and any values in `csp.frame_ancestors` +The `frame-ancestors` directive can also be configured by using +<<server-securityResponseHeaders-disableEmbedding, `server.securityResponseHeaders.disableEmbedding`>>. In that case, that takes precedence and any values in `csp.frame_ancestors` are ignored. ============ @@ -777,10 +777,14 @@ out through *Advanced Settings*. *Default: `true`* | Set this value to true to allow Vega to use any URL to access external data sources and images. When false, Vega can only get data from {es}. *Default: `false`* -| `xpack.discoverEnhanced.actions.exploreDataInContextMenu.enabled` +a| +`xpack.discoverEnhanced.actions.` +`exploreDataInContextMenu.enabled` | Enables the *Explore underlying data* option that allows you to open *Discover* from a dashboard panel and view the panel data. *Default: `false`* - | `xpack.discoverEnhanced.actions.exploreDataInChart.enabled` +a| +`xpack.discoverEnhanced.actions.` +`exploreDataInChart.enabled` | Enables you to view the underlying documents in a data series from a dashboard panel. *Default: `false`* | `xpack.license_management.enabled` From 51767e7cb9746d2a7a64e9f9aeabd8242d41b40b Mon Sep 17 00:00:00 2001 From: Vadim Yakhin <yakhin.v@gmail.com> Date: Tue, 29 Jun 2021 11:39:04 -0300 Subject: [PATCH 090/227] Use the user-provided source name in SourceInfoCard (#103542) --- .../content_sources/components/source_layout.test.tsx | 6 ++++++ .../content_sources/components/source_layout.tsx | 11 ++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.test.tsx index 7c7d77ec418e7f..944a54169f0b84 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.test.tsx @@ -44,6 +44,12 @@ describe('SourceLayout', () => { expect(wrapper.find('.testChild')).toHaveLength(1); }); + it('passes a source name to SourceInfoCard', () => { + const wrapper = shallow(<SourceLayout />); + + expect(wrapper.find(SourceInfoCard).prop('sourceName')).toEqual('Jira'); + }); + it('renders the default Workplace Search layout when on an organization view', () => { setMockValues({ ...mockValues, isOrganization: true }); const wrapper = shallow(<SourceLayout />); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.tsx index 446e93e0c61f3f..663088f797c18b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_layout.tsx @@ -35,19 +35,12 @@ export const SourceLayout: React.FC<PageTemplateProps> = ({ const { contentSource, dataLoading } = useValues(SourceLogic); const { isOrganization } = useValues(AppLogic); - const { - name, - createdAt, - serviceType, - serviceName, - isFederatedSource, - supportedByLicense, - } = contentSource; + const { name, createdAt, serviceType, isFederatedSource, supportedByLicense } = contentSource; const pageHeader = ( <> <SourceInfoCard - sourceName={serviceName} + sourceName={name} sourceType={serviceType} dateCreated={moment(createdAt).format('MMMM D, YYYY')} isFederatedSource={isFederatedSource} From 24661fe20887100a10f25e764c31d171d61049df Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski <jon@budzenski.me> Date: Tue, 29 Jun 2021 09:51:11 -0500 Subject: [PATCH 091/227] Revert "[build] Remove OSS builds (#100577)" This reverts commit b2d76a6cd3f96ab152a8aaa81802a048df42051f. --- src/dev/build/README.md | 4 +- src/dev/build/args.test.ts | 7 ++ src/dev/build/args.ts | 3 + src/dev/build/build_distributables.ts | 2 + src/dev/build/cli.ts | 2 + src/dev/build/lib/build.test.ts | 39 +++++--- src/dev/build/lib/build.ts | 12 ++- src/dev/build/lib/runner.test.ts | 92 ++++++++++++++++++- src/dev/build/lib/runner.ts | 8 +- .../tasks/build_kibana_platform_plugins.ts | 2 +- src/dev/build/tasks/build_packages_task.ts | 2 + src/dev/build/tasks/create_archives_task.ts | 4 +- src/dev/build/tasks/install_chromium.js | 24 +++-- src/dev/build/tasks/license_file_task.ts | 16 +++- .../os_packages/create_os_package_tasks.ts | 39 ++++---- .../tasks/os_packages/docker_generator/run.ts | 12 ++- src/dev/build/tasks/os_packages/run_fpm.ts | 12 ++- test/scripts/jenkins_build_kibana.sh | 2 +- test/scripts/jenkins_build_load_testing.sh | 2 +- test/scripts/jenkins_xpack_baseline.sh | 2 +- 20 files changed, 225 insertions(+), 61 deletions(-) diff --git a/src/dev/build/README.md b/src/dev/build/README.md index c499ef4a610832..f6e11af67da33f 100644 --- a/src/dev/build/README.md +++ b/src/dev/build/README.md @@ -12,8 +12,8 @@ node scripts/build --help # build a release version node scripts/build --release -# reuse already downloaded node executables, turn on debug logging -node scripts/build --skip-node-download --debug +# reuse already downloaded node executables, turn on debug logging, and only build the default distributable +node scripts/build --skip-node-download --debug --no-oss ``` # Fixing out of memory issues diff --git a/src/dev/build/args.test.ts b/src/dev/build/args.test.ts index af996321caa5ad..e749af73241cf1 100644 --- a/src/dev/build/args.test.ts +++ b/src/dev/build/args.test.ts @@ -27,6 +27,7 @@ it('build default and oss dist for current platform, without packages, by defaul Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": false, @@ -53,6 +54,7 @@ it('builds packages if --all-platforms is passed', () => { Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": true, "createDockerCentOS": true, @@ -79,6 +81,7 @@ it('limits packages if --rpm passed with --all-platforms', () => { Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": false, @@ -105,6 +108,7 @@ it('limits packages if --deb passed with --all-platforms', () => { Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": true, "createDockerCentOS": false, @@ -132,6 +136,7 @@ it('limits packages if --docker passed with --all-platforms', () => { Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": true, @@ -166,6 +171,7 @@ it('limits packages if --docker passed with --skip-docker-ubi and --all-platform Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": false, "createDockerCentOS": true, @@ -193,6 +199,7 @@ it('limits packages if --all-platforms passed with --skip-docker-centos', () => Object { "buildOptions": Object { "buildDefaultDist": true, + "buildOssDist": true, "createArchives": true, "createDebPackage": true, "createDockerCentOS": false, diff --git a/src/dev/build/args.ts b/src/dev/build/args.ts index 54da6ac86d3f7c..bbfbd3e6f8813a 100644 --- a/src/dev/build/args.ts +++ b/src/dev/build/args.ts @@ -15,6 +15,8 @@ export function readCliArgs(argv: string[]) { const unknownFlags: string[] = []; const flags = getopts(argv, { boolean: [ + 'oss', + 'no-oss', 'skip-archives', 'skip-initialize', 'skip-generic-folders', @@ -92,6 +94,7 @@ export function readCliArgs(argv: string[]) { const buildOptions: BuildOptions = { isRelease: Boolean(flags.release), versionQualifier: flags['version-qualifier'], + buildOssDist: flags.oss !== false, buildDefaultDist: !flags.oss, initialize: !Boolean(flags['skip-initialize']), downloadFreshNode: !Boolean(flags['skip-node-download']), diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index ea543b19030ffb..f0403fac1e26b3 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -13,6 +13,7 @@ import * as Tasks from './tasks'; export interface BuildOptions { isRelease: boolean; + buildOssDist: boolean; buildDefaultDist: boolean; downloadFreshNode: boolean; initialize: boolean; @@ -37,6 +38,7 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions config, log, buildDefaultDist: options.buildDefaultDist, + buildOssDist: options.buildOssDist, }); /** diff --git a/src/dev/build/cli.ts b/src/dev/build/cli.ts index c727c26d7dcd30..3712e2230296a1 100644 --- a/src/dev/build/cli.ts +++ b/src/dev/build/cli.ts @@ -33,6 +33,8 @@ if (showHelp) { build the Kibana distributable options: + --oss {dim Only produce the OSS distributable of Kibana} + --no-oss {dim Only produce the default distributable of Kibana} --skip-archives {dim Don't produce tar/zip archives} --skip-os-packages {dim Don't produce rpm/deb/docker packages} --all-platforms {dim Produce archives for all platforms, not just this one} diff --git a/src/dev/build/lib/build.test.ts b/src/dev/build/lib/build.test.ts index f92a91e2b7221e..fe328329d7df03 100644 --- a/src/dev/build/lib/build.test.ts +++ b/src/dev/build/lib/build.test.ts @@ -43,24 +43,40 @@ beforeEach(() => { jest.clearAllMocks(); }); -const defaultBuild = new Build(config); +const ossBuild = new Build(config, true); +const defaultBuild = new Build(config, false); + +describe('#isOss()', () => { + it('returns true for oss', () => { + expect(ossBuild.isOss()).toBe(true); + }); + + it('returns false for default build', () => { + expect(defaultBuild.isOss()).toBe(false); + }); +}); describe('#getName()', () => { it('returns kibana for default build', () => { expect(defaultBuild.getName()).toBe('kibana'); }); + + it('returns kibana-oss for oss', () => { + expect(ossBuild.getName()).toBe('kibana-oss'); + }); }); describe('#getLogTag()', () => { it('returns string with build name in it', () => { expect(defaultBuild.getLogTag()).toContain(defaultBuild.getName()); + expect(ossBuild.getLogTag()).toContain(ossBuild.getName()); }); }); describe('#resolvePath()', () => { it('uses passed config to resolve a path relative to the repo', () => { - expect(defaultBuild.resolvePath('bar')).toMatchInlineSnapshot( - `<absolute path>/build/kibana/bar` + expect(ossBuild.resolvePath('bar')).toMatchInlineSnapshot( + `<absolute path>/build/kibana-oss/bar` ); }); @@ -73,27 +89,28 @@ describe('#resolvePath()', () => { describe('#resolvePathForPlatform()', () => { it('uses config.resolveFromRepo(), config.getBuildVersion(), and platform.getBuildName() to create path', () => { - expect(defaultBuild.resolvePathForPlatform(linuxPlatform, 'foo', 'bar')).toMatchInlineSnapshot( - `<absolute path>/build/default/kibana-8.0.0-linux-x86_64/foo/bar` + expect(ossBuild.resolvePathForPlatform(linuxPlatform, 'foo', 'bar')).toMatchInlineSnapshot( + `<absolute path>/build/oss/kibana-8.0.0-linux-x86_64/foo/bar` ); }); }); describe('#getPlatformArchivePath()', () => { it('creates correct path for different platforms', () => { - expect(defaultBuild.getPlatformArchivePath(linuxPlatform)).toMatchInlineSnapshot( - `<absolute path>/target/kibana-8.0.0-linux-x86_64.tar.gz` + expect(ossBuild.getPlatformArchivePath(linuxPlatform)).toMatchInlineSnapshot( + `<absolute path>/target/kibana-oss-8.0.0-linux-x86_64.tar.gz` ); - expect(defaultBuild.getPlatformArchivePath(linuxArmPlatform)).toMatchInlineSnapshot( - `<absolute path>/target/kibana-8.0.0-linux-aarch64.tar.gz` + expect(ossBuild.getPlatformArchivePath(linuxArmPlatform)).toMatchInlineSnapshot( + `<absolute path>/target/kibana-oss-8.0.0-linux-aarch64.tar.gz` ); - expect(defaultBuild.getPlatformArchivePath(windowsPlatform)).toMatchInlineSnapshot( - `<absolute path>/target/kibana-8.0.0-windows-x86_64.zip` + expect(ossBuild.getPlatformArchivePath(windowsPlatform)).toMatchInlineSnapshot( + `<absolute path>/target/kibana-oss-8.0.0-windows-x86_64.zip` ); }); describe('#getRootDirectory()', () => { it('creates correct root directory name', () => { + expect(ossBuild.getRootDirectory()).toMatchInlineSnapshot(`"kibana-oss-8.0.0"`); expect(defaultBuild.getRootDirectory()).toMatchInlineSnapshot(`"kibana-8.0.0"`); }); }); diff --git a/src/dev/build/lib/build.ts b/src/dev/build/lib/build.ts index c777ad18dc51f0..f4ccb30994eef5 100644 --- a/src/dev/build/lib/build.ts +++ b/src/dev/build/lib/build.ts @@ -12,10 +12,14 @@ import { Config } from './config'; import { Platform } from './platform'; export class Build { - private name = 'kibana'; - private logTag = chalk`{cyan [ kibana ]}`; + private name = this.oss ? 'kibana-oss' : 'kibana'; + private logTag = this.oss ? chalk`{magenta [kibana-oss]}` : chalk`{cyan [ kibana ]}`; - constructor(private config: Config) {} + constructor(private config: Config, private oss: boolean) {} + + isOss() { + return !!this.oss; + } resolvePath(...args: string[]) { return this.config.resolveFromRepo('build', this.name, ...args); @@ -24,7 +28,7 @@ export class Build { resolvePathForPlatform(platform: Platform, ...args: string[]) { return this.config.resolveFromRepo( 'build', - 'default', + this.oss ? 'oss' : 'default', `kibana-${this.config.getBuildVersion()}-${platform.getBuildName()}`, ...args ); diff --git a/src/dev/build/lib/runner.test.ts b/src/dev/build/lib/runner.test.ts index 581cbadeb50613..0e3c00d220ad9a 100644 --- a/src/dev/build/lib/runner.test.ts +++ b/src/dev/build/lib/runner.test.ts @@ -45,7 +45,7 @@ beforeEach(() => { jest.clearAllMocks(); }); -const setup = async (opts: { buildDefaultDist: boolean }) => { +const setup = async (opts: { buildDefaultDist: boolean; buildOssDist: boolean }) => { const config = await Config.create({ isRelease: true, targetAllPlatforms: true, @@ -61,10 +61,48 @@ const setup = async (opts: { buildDefaultDist: boolean }) => { return { config, run }; }; -describe('default dist', () => { +describe('buildOssDist = true, buildDefaultDist = true', () => { it('runs global task once, passing config and log', async () => { const { config, run } = await setup({ buildDefaultDist: true, + buildOssDist: true, + }); + + const mock = jest.fn(); + + await run({ + global: true, + description: 'foo', + run: mock, + }); + + expect(mock).toHaveBeenCalledTimes(1); + expect(mock).toHaveBeenLastCalledWith(config, log, [expect.any(Build), expect.any(Build)]); + }); + + it('calls local tasks twice, passing each build', async () => { + const { config, run } = await setup({ + buildDefaultDist: true, + buildOssDist: true, + }); + + const mock = jest.fn(); + + await run({ + description: 'foo', + run: mock, + }); + + expect(mock).toHaveBeenCalledTimes(2); + expect(mock).toHaveBeenCalledWith(config, log, expect.any(Build)); + }); +}); + +describe('just default dist', () => { + it('runs global task once, passing config and log', async () => { + const { config, run } = await setup({ + buildDefaultDist: true, + buildOssDist: false, }); const mock = jest.fn(); @@ -82,6 +120,49 @@ describe('default dist', () => { it('calls local tasks once, passing the default build', async () => { const { config, run } = await setup({ buildDefaultDist: true, + buildOssDist: false, + }); + + const mock = jest.fn(); + + await run({ + description: 'foo', + run: mock, + }); + + expect(mock).toHaveBeenCalledTimes(1); + expect(mock).toHaveBeenCalledWith(config, log, expect.any(Build)); + const [args] = mock.mock.calls; + const [, , build] = args; + if (build.isOss()) { + throw new Error('expected build to be the default dist, not the oss dist'); + } + }); +}); + +describe('just oss dist', () => { + it('runs global task once, passing config and log', async () => { + const { config, run } = await setup({ + buildDefaultDist: false, + buildOssDist: true, + }); + + const mock = jest.fn(); + + await run({ + global: true, + description: 'foo', + run: mock, + }); + + expect(mock).toHaveBeenCalledTimes(1); + expect(mock).toHaveBeenLastCalledWith(config, log, [expect.any(Build)]); + }); + + it('calls local tasks once, passing the oss build', async () => { + const { config, run } = await setup({ + buildDefaultDist: false, + buildOssDist: true, }); const mock = jest.fn(); @@ -93,6 +174,11 @@ describe('default dist', () => { expect(mock).toHaveBeenCalledTimes(1); expect(mock).toHaveBeenCalledWith(config, log, expect.any(Build)); + const [args] = mock.mock.calls; + const [, , build] = args; + if (!build.isOss()) { + throw new Error('expected build to be the oss dist, not the default dist'); + } }); }); @@ -100,6 +186,7 @@ describe('task rejection', () => { it('rejects, logs error, and marks error logged', async () => { const { run } = await setup({ buildDefaultDist: true, + buildOssDist: false, }); const error = new Error('FOO'); @@ -128,6 +215,7 @@ describe('task rejection', () => { it('just rethrows errors that have already been logged', async () => { const { run } = await setup({ buildDefaultDist: true, + buildOssDist: false, }); const error = markErrorLogged(new Error('FOO')); diff --git a/src/dev/build/lib/runner.ts b/src/dev/build/lib/runner.ts index eccde9160f8a3a..015de6fe7e9ef7 100644 --- a/src/dev/build/lib/runner.ts +++ b/src/dev/build/lib/runner.ts @@ -16,6 +16,7 @@ import { Config } from './config'; interface Options { config: Config; log: ToolingLog; + buildOssDist: boolean; buildDefaultDist: boolean; } @@ -31,7 +32,7 @@ export interface Task { run(config: Config, log: ToolingLog, build: Build): Promise<void>; } -export function createRunner({ config, log, buildDefaultDist }: Options) { +export function createRunner({ config, log, buildOssDist, buildDefaultDist }: Options) { async function execTask(desc: string, task: Task | GlobalTask, lastArg: any) { log.info(desc); log.indent(4); @@ -63,7 +64,10 @@ export function createRunner({ config, log, buildDefaultDist }: Options) { const builds: Build[] = []; if (buildDefaultDist) { - builds.push(new Build(config)); + builds.push(new Build(config, false)); + } + if (buildOssDist) { + builds.push(new Build(config, true)); } /** diff --git a/src/dev/build/tasks/build_kibana_platform_plugins.ts b/src/dev/build/tasks/build_kibana_platform_plugins.ts index 7d8690df6f3cec..edff77d458f0f8 100644 --- a/src/dev/build/tasks/build_kibana_platform_plugins.ts +++ b/src/dev/build/tasks/build_kibana_platform_plugins.ts @@ -27,7 +27,7 @@ export const BuildKibanaPlatformPlugins: Task = { repoRoot: REPO_ROOT, outputRoot: build.resolvePath(), cache: false, - oss: false, + oss: build.isOss(), examples: false, watch: false, dist: true, diff --git a/src/dev/build/tasks/build_packages_task.ts b/src/dev/build/tasks/build_packages_task.ts index 808903661a5950..e6305b3761a4f7 100644 --- a/src/dev/build/tasks/build_packages_task.ts +++ b/src/dev/build/tasks/build_packages_task.ts @@ -63,6 +63,7 @@ export const BuildBazelPackages: Task = { await buildBazelProductionProjects({ kibanaRoot: config.resolveFromRepo(), buildRoot: build.resolvePath(), + onlyOSS: build.isOss(), }); }, }; @@ -74,6 +75,7 @@ export const BuildPackages: Task = { await buildNonBazelProductionProjects({ kibanaRoot: config.resolveFromRepo(), buildRoot: build.resolvePath(), + onlyOSS: build.isOss(), }); }, }; diff --git a/src/dev/build/tasks/create_archives_task.ts b/src/dev/build/tasks/create_archives_task.ts index 37c4becae76a83..e2d3ff7149c4c5 100644 --- a/src/dev/build/tasks/create_archives_task.ts +++ b/src/dev/build/tasks/create_archives_task.ts @@ -77,14 +77,14 @@ export const CreateArchives: Task = { const metrics: CiStatsMetric[] = []; for (const { format, path, fileCount } of archives) { metrics.push({ - group: `distributable size`, + group: `${build.isOss() ? 'oss ' : ''}distributable size`, id: format, value: (await asyncStat(path)).size, }); metrics.push({ group: 'distributable file count', - id: 'default', + id: build.isOss() ? 'oss' : 'default', value: fileCount, }); } diff --git a/src/dev/build/tasks/install_chromium.js b/src/dev/build/tasks/install_chromium.js index 37abcbad4466eb..b21a8484fa7104 100644 --- a/src/dev/build/tasks/install_chromium.js +++ b/src/dev/build/tasks/install_chromium.js @@ -15,17 +15,21 @@ export const InstallChromium = { description: 'Installing Chromium', async run(config, log, build) { - for (const platform of config.getNodePlatforms()) { - log.info(`Installing Chromium for ${platform.getName()}-${platform.getArchitecture()}`); + if (build.isOss()) { + return; + } else { + for (const platform of config.getNodePlatforms()) { + log.info(`Installing Chromium for ${platform.getName()}-${platform.getArchitecture()}`); - const { binaryPath$ } = installBrowser( - // TODO: https://github.com/elastic/kibana/issues/72496 - log, - build.resolvePathForPlatform(platform, 'x-pack/plugins/reporting/chromium'), - platform.getName(), - platform.getArchitecture() - ); - await binaryPath$.pipe(first()).toPromise(); + const { binaryPath$ } = installBrowser( + // TODO: https://github.com/elastic/kibana/issues/72496 + log, + build.resolvePathForPlatform(platform, 'x-pack/plugins/reporting/chromium'), + platform.getName(), + platform.getArchitecture() + ); + await binaryPath$.pipe(first()).toPromise(); + } } }, }; diff --git a/src/dev/build/tasks/license_file_task.ts b/src/dev/build/tasks/license_file_task.ts index ff33707476576f..7e5ed8da0a27a9 100644 --- a/src/dev/build/tasks/license_file_task.ts +++ b/src/dev/build/tasks/license_file_task.ts @@ -8,13 +8,23 @@ import { write, read, Task } from '../lib'; +const LICENSE_SEPARATOR = `\n------------------------------------------------------------------------\n\n`; + export const UpdateLicenseFile: Task = { description: 'Updating LICENSE.txt file', async run(config, log, build) { const elasticLicense = await read(config.resolveFromRepo('licenses/ELASTIC-LICENSE-2.0.txt')); - - log.info('Copying Elastic license to LICENSE.txt'); - await write(build.resolvePath('LICENSE.txt'), elasticLicense); + if (build.isOss()) { + const ssplLicense = await read(config.resolveFromRepo('licenses/SSPL-LICENSE.txt')); + log.info('Copying dual-license to LICENSE.txt'); + await write( + build.resolvePath('LICENSE.txt'), + ssplLicense + LICENSE_SEPARATOR + elasticLicense + ); + } else { + log.info('Copying Elastic license to LICENSE.txt'); + await write(build.resolvePath('LICENSE.txt'), elasticLicense); + } }, }; diff --git a/src/dev/build/tasks/os_packages/create_os_package_tasks.ts b/src/dev/build/tasks/os_packages/create_os_package_tasks.ts index 99d0e1998e78a8..2ae882000cae00 100644 --- a/src/dev/build/tasks/os_packages/create_os_package_tasks.ts +++ b/src/dev/build/tasks/os_packages/create_os_package_tasks.ts @@ -73,12 +73,15 @@ export const CreateDockerUBI: Task = { description: 'Creating Docker UBI image', async run(config, log, build) { - await runDockerGenerator(config, log, build, { - architecture: 'x64', - context: false, - ubi: true, - image: true, - }); + if (!build.isOss()) { + await runDockerGenerator(config, log, build, { + architecture: 'x64', + context: false, + ubi: true, + image: true, + dockerBuildDate, + }); + } }, }; @@ -92,15 +95,19 @@ export const CreateDockerContexts: Task = { dockerBuildDate, }); - await runDockerGenerator(config, log, build, { - ubi: true, - context: true, - image: false, - }); - await runDockerGenerator(config, log, build, { - ironbank: true, - context: true, - image: false, - }); + if (!build.isOss()) { + await runDockerGenerator(config, log, build, { + ubi: true, + context: true, + image: false, + dockerBuildDate, + }); + await runDockerGenerator(config, log, build, { + ironbank: true, + context: true, + image: false, + dockerBuildDate, + }); + } }, }; diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index 97fd7404097410..c72112b7b6b03d 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -43,18 +43,24 @@ export async function runDockerGenerator( let imageFlavor = ''; if (flags.ubi) imageFlavor += `-${ubiVersionTag}`; if (flags.ironbank) imageFlavor += '-ironbank'; + if (build.isOss()) imageFlavor += '-oss'; // General docker var config - const license = 'Elastic License'; + const license = build.isOss() ? 'ASL 2.0' : 'Elastic License'; const imageTag = 'docker.elastic.co/kibana/kibana'; const version = config.getBuildVersion(); const artifactArchitecture = flags.architecture === 'aarch64' ? 'aarch64' : 'x86_64'; - const artifactPrefix = `kibana-${version}-linux`; + const artifactFlavor = build.isOss() ? '-oss' : ''; + const artifactPrefix = `kibana${artifactFlavor}-${version}-linux`; const artifactTarball = `${artifactPrefix}-${artifactArchitecture}.tar.gz`; const artifactsDir = config.resolveFromTarget('.'); const dockerBuildDate = flags.dockerBuildDate || new Date().toISOString(); // That would produce oss, default and default-ubi7 - const dockerBuildDir = config.resolveFromRepo('build', 'kibana-docker', `default${imageFlavor}`); + const dockerBuildDir = config.resolveFromRepo( + 'build', + 'kibana-docker', + build.isOss() ? `oss` : `default${imageFlavor}` + ); const imageArchitecture = flags.architecture === 'aarch64' ? '-aarch64' : ''; const dockerTargetFilename = config.resolveFromTarget( `kibana${imageFlavor}-${version}-docker-image${imageArchitecture}.tar.gz` diff --git a/src/dev/build/tasks/os_packages/run_fpm.ts b/src/dev/build/tasks/os_packages/run_fpm.ts index b732e4c80ea370..933b3e411b2864 100644 --- a/src/dev/build/tasks/os_packages/run_fpm.ts +++ b/src/dev/build/tasks/os_packages/run_fpm.ts @@ -28,7 +28,11 @@ export async function runFpm( const fromBuild = (...paths: string[]) => build.resolvePathForPlatform(linux, ...paths); const pickLicense = () => { - return type === 'rpm' ? 'Elastic License' : 'Elastic-License'; + if (build.isOss()) { + return type === 'rpm' ? 'ASL 2.0' : 'ASL-2.0'; + } else { + return type === 'rpm' ? 'Elastic License' : 'Elastic-License'; + } }; const envFolder = type === 'rpm' ? 'sysconfig' : 'default'; @@ -53,7 +57,7 @@ export async function runFpm( // general info about the package '--name', - 'kibana', + build.isOss() ? 'kibana-oss' : 'kibana', '--description', 'Explore and visualize your Elasticsearch data', '--version', @@ -67,6 +71,10 @@ export async function runFpm( '--license', pickLicense(), + // prevent installing kibana if installing kibana-oss and vice versa + '--conflicts', + build.isOss() ? 'kibana' : 'kibana-oss', + // define install/uninstall scripts '--after-install', resolve(__dirname, 'package_scripts/post_install.sh'), diff --git a/test/scripts/jenkins_build_kibana.sh b/test/scripts/jenkins_build_kibana.sh index a9edd3ed2a701b..198723908cf487 100755 --- a/test/scripts/jenkins_build_kibana.sh +++ b/test/scripts/jenkins_build_kibana.sh @@ -33,7 +33,7 @@ node x-pack/scripts/functional_tests --assert-none-excluded \ # Do not build kibana for code coverage run if [[ -z "$CODE_COVERAGE" ]] ; then echo " -> building and extracting default Kibana distributable for use in functional tests" - node scripts/build --debug + node scripts/build --debug --no-oss echo " -> shipping metrics from build to ci-stats" node scripts/ship_ci_stats \ diff --git a/test/scripts/jenkins_build_load_testing.sh b/test/scripts/jenkins_build_load_testing.sh index d7c7bda83c9ef2..5571eee4f28edb 100755 --- a/test/scripts/jenkins_build_load_testing.sh +++ b/test/scripts/jenkins_build_load_testing.sh @@ -60,7 +60,7 @@ export KBN_NP_PLUGINS_BUILT=true echo " -> Building and extracting default Kibana distributable for use in functional tests" cd "$KIBANA_DIR" -node scripts/build --debug +node scripts/build --debug --no-oss linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" installDir="$KIBANA_DIR/install/kibana" mkdir -p "$installDir" diff --git a/test/scripts/jenkins_xpack_baseline.sh b/test/scripts/jenkins_xpack_baseline.sh index c68c0f40902f22..8d5624949505a5 100755 --- a/test/scripts/jenkins_xpack_baseline.sh +++ b/test/scripts/jenkins_xpack_baseline.sh @@ -5,7 +5,7 @@ source "$KIBANA_DIR/src/dev/ci_setup/setup_percy.sh" echo " -> building and extracting default Kibana distributable" cd "$KIBANA_DIR" -node scripts/build --debug +node scripts/build --debug --no-oss echo " -> shipping metrics from build to ci-stats" node scripts/ship_ci_stats \ From 6ee79558ab9b8b3c29a4603a88c981ee34587eeb Mon Sep 17 00:00:00 2001 From: Pablo Machado <pablo.nevesmachado@elastic.co> Date: Tue, 29 Jun 2021 17:00:30 +0200 Subject: [PATCH 092/227] [Security Solution][Detections] Fix Investigation guide format issues (#101609) * Fix 'Detection' / 'Investigation Guide' UI broken when it contains long words * Fix investigation guide is not formatted under Alert details flyout * Add LineClamp to investigation guide field * It enhances LineClamp to support a react node instead of only text Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../event_details/alert_summary_view.tsx | 5 ++- .../components/line_clamp/index.test.tsx | 39 +++++++++-------- .../common/components/line_clamp/index.tsx | 42 +++++++++++-------- .../rules/step_about_rule_details/index.tsx | 1 + .../components/flyout/header/index.tsx | 5 ++- .../event_details/expandable_event.tsx | 2 +- 6 files changed, 55 insertions(+), 39 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx index d89f44542318e4..be45e16e456d49 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx @@ -36,6 +36,7 @@ import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../../../networ import { SummaryView } from './summary_view'; import { AlertSummaryRow, getSummaryColumns, SummaryRow } from './helpers'; import { useRuleWithFallback } from '../../../detections/containers/detection_engine/rules/use_rule_with_fallback'; +import { MarkdownRenderer } from '../markdown_editor'; import { LineClamp } from '../line_clamp'; import { endpointAlertCheck } from '../../utils/endpoint_alert_check'; @@ -221,7 +222,9 @@ const AlertSummaryViewComponent: React.FC<{ <StyledEuiDescriptionList data-test-subj={`summary-view-guide`} compressed> <EuiDescriptionListTitle>{i18n.INVESTIGATION_GUIDE}</EuiDescriptionListTitle> <EuiDescriptionListDescription> - <LineClamp content={maybeRule?.note} /> + <LineClamp> + <MarkdownRenderer>{maybeRule.note}</MarkdownRenderer> + </LineClamp> </EuiDescriptionListDescription> </StyledEuiDescriptionList> )} diff --git a/x-pack/plugins/security_solution/public/common/components/line_clamp/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/line_clamp/index.test.tsx index 73f46a17710307..933517c49690c6 100644 --- a/x-pack/plugins/security_solution/public/common/components/line_clamp/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/line_clamp/index.test.tsx @@ -16,25 +16,30 @@ describe('LineClamp', () => { describe('no overflow', () => { test('it does NOT render the expanded line clamp when isOverflow is falsy', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="expanded-line-clamp"]').exists()).toBe(false); }); test('it does NOT render the styled line clamp expanded when isOverflow is falsy', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="styled-line-clamp"]').exists()).toBe(false); }); - test('it renders the default line clamp when isOverflow is falsy', () => { - const wrapper = mount(<LineClamp content={message} />); + test('it renders the children when isOverflow is falsy', () => { + const TestComponent = () => <>{message}</>; + const wrapper = mount( + <LineClamp> + <TestComponent /> + </LineClamp> + ); - expect(wrapper.find('[data-test-subj="default-line-clamp"]').first().text()).toBe(message); + expect(wrapper.childAt(0).type()).toBe(TestComponent); }); test('it does NOT render the `Read More` button when isOverflow is falsy', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="summary-view-readmore"]').exists()).toBe(false); }); @@ -59,25 +64,25 @@ describe('LineClamp', () => { }); test('it does NOT render the expanded line clamp by default when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="expanded-line-clamp"]').exists()).toBe(false); }); test('it renders the styled line clamp when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="styled-line-clamp"]').first().text()).toBe(message); }); test('it does NOT render the default line clamp when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="default-line-clamp"]').exists()).toBe(false); }); test('it renders the `Read More` button with the expected (default) text when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); expect(wrapper.find('[data-test-subj="summary-view-readmore"]').first().text()).toBe( 'Read More' @@ -86,7 +91,7 @@ describe('LineClamp', () => { describe('clicking the Read More button', () => { test('it displays the `Read Less` button text after the user clicks the `Read More` button when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); @@ -97,7 +102,7 @@ describe('LineClamp', () => { }); test('it renders the expanded content after the user clicks the `Read More` button when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); @@ -107,7 +112,7 @@ describe('LineClamp', () => { }); test('it renders the expanded content with a max-height of one third the view height when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); @@ -119,7 +124,7 @@ describe('LineClamp', () => { }); test('it automatically vertically scrolls the content when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); @@ -131,7 +136,7 @@ describe('LineClamp', () => { }); test('it does NOT render the styled line clamp after the user clicks the `Read More` button when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); @@ -140,7 +145,7 @@ describe('LineClamp', () => { }); test('it does NOT render the default line clamp after the user clicks the `Read More` button when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); @@ -149,7 +154,7 @@ describe('LineClamp', () => { }); test('it once again displays the `Read More` button text after the user clicks the `Read Less` when isOverflow is true', () => { - const wrapper = mount(<LineClamp content={message} />); + const wrapper = mount(<LineClamp>{message}</LineClamp>); wrapper.find('[data-test-subj="summary-view-readmore"]').first().simulate('click'); wrapper.update(); // 1st toggle diff --git a/x-pack/plugins/security_solution/public/common/components/line_clamp/index.tsx b/x-pack/plugins/security_solution/public/common/components/line_clamp/index.tsx index d8895490d1e0ff..372e7fd466b07c 100644 --- a/x-pack/plugins/security_solution/public/common/components/line_clamp/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/line_clamp/index.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import { EuiButtonEmpty, EuiText } from '@elastic/eui'; -import React, { useRef, useState, useEffect, useCallback } from 'react'; +import { EuiButtonEmpty } from '@elastic/eui'; +import React, { useRef, useState, useEffect, useCallback, ReactNode } from 'react'; import styled from 'styled-components'; import * as i18n from './translations'; @@ -36,9 +36,9 @@ const StyledLineClamp = styled.div<{ lineClampHeight: number }>` `; const LineClampComponent: React.FC<{ - content?: string | null; + children: ReactNode; lineClampHeight?: number; -}> = ({ content, lineClampHeight = LINE_CLAMP_HEIGHT }) => { +}> = ({ children, lineClampHeight = LINE_CLAMP_HEIGHT }) => { const [isOverflow, setIsOverflow] = useState<boolean | null>(null); const [isExpanded, setIsExpanded] = useState<boolean | null>(null); const descriptionRef = useRef<HTMLDivElement>(null); @@ -47,7 +47,7 @@ const LineClampComponent: React.FC<{ }, []); useEffect(() => { - if (content != null && descriptionRef?.current?.clientHeight != null) { + if (descriptionRef?.current?.clientHeight != null) { if ( (descriptionRef?.current?.scrollHeight ?? 0) > (descriptionRef?.current?.clientHeight ?? 0) ) { @@ -55,38 +55,44 @@ const LineClampComponent: React.FC<{ } if ( - ((content == null || descriptionRef?.current?.scrollHeight) ?? 0) <= - (descriptionRef?.current?.clientHeight ?? 0) + (descriptionRef?.current?.scrollHeight ?? 0) <= (descriptionRef?.current?.clientHeight ?? 0) ) { setIsOverflow(false); } } - }, [content]); + }, []); - if (!content) { - return null; + if (isExpanded) { + return ( + <> + <ExpandedContent data-test-subj="expanded-line-clamp"> + <p>{children}</p> + </ExpandedContent> + {isOverflow && ( + <ReadMore onClick={toggleReadMore} size="s" data-test-subj="summary-view-readmore"> + {i18n.READ_LESS} + </ReadMore> + )} + </> + ); } return ( <> - {isExpanded ? ( - <ExpandedContent data-test-subj="expanded-line-clamp"> - <p>{content}</p> - </ExpandedContent> - ) : isOverflow == null || isOverflow === true ? ( + {isOverflow == null || isOverflow === true ? ( <StyledLineClamp data-test-subj="styled-line-clamp" ref={descriptionRef} lineClampHeight={lineClampHeight} > - {content} + {children} </StyledLineClamp> ) : ( - <EuiText data-test-subj="default-line-clamp">{content}</EuiText> + children )} {isOverflow && ( <ReadMore onClick={toggleReadMore} size="s" data-test-subj="summary-view-readmore"> - {isExpanded ? i18n.READ_LESS : i18n.READ_MORE} + {i18n.READ_MORE} </ReadMore> )} </> diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx index c1078e1ba77e7c..f400887f43927e 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx @@ -37,6 +37,7 @@ const FlexGroupFullHeight = styled(EuiFlexGroup)` const VerticalOverflowContainer = styled.div((props: { maxHeight: number }) => ({ 'max-height': `${props.maxHeight}px`, 'overflow-y': 'hidden', + 'word-break': 'break-word', })); const VerticalOverflowContent = styled.div((props: { maxHeight: number }) => ({ diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx index 216282b72920c5..479b32c2d642e9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx @@ -206,11 +206,12 @@ const TimelineDescriptionComponent: React.FC<FlyoutHeaderProps> = ({ timelineId const description = useDeepEqualSelector( (state) => (getTimeline(state, timelineId) ?? timelineDefaults).description ); - return ( <EuiText size="s" data-test-subj="timeline-description"> {description.length ? ( - <LineClamp key={description.length} content={description} lineClampHeight={4.5} /> + <LineClamp key={description.length} lineClampHeight={4.5}> + {description} + </LineClamp> ) : ( commonI18n.DESCRIPTION )} diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx index d1d5bffc6bd0aa..fff2d4559c8dfc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx @@ -113,7 +113,7 @@ export const ExpandableEvent = React.memo<Props>( <EuiDescriptionList data-test-subj="event-message" compressed> <EuiDescriptionListTitle>{i18n.MESSAGE}</EuiDescriptionListTitle> <EuiDescriptionListDescription> - <LineClamp content={message} /> + <LineClamp>{message}</LineClamp> </EuiDescriptionListDescription> </EuiDescriptionList> <EuiSpacer size="m" /> From 0ba4153d4b58c7fc72458102ce305463a1ae077f Mon Sep 17 00:00:00 2001 From: Alexey Antonov <alexwizp@gmail.com> Date: Tue, 29 Jun 2021 18:14:48 +0300 Subject: [PATCH 093/227] [TSVB] fix wrong labels, for values that are implicitly cast to false (#103631) * [TSVB] fix wrong labels, for values that are implicitly cast to false * getMeaningfulValueOrEmpty -> getValueOrEmpty * fix CI --- src/plugins/vis_type_timeseries/common/empty_label.ts | 7 +++++++ .../application/components/lib/convert_series_to_vars.js | 9 +++++++-- .../public/application/components/vis_types/table/vis.js | 4 ++-- .../public/application/components/vis_with_splits.js | 4 ++-- .../public/application/lib/get_split_by_terms_color.ts | 4 ++-- .../application/visualizations/views/timeseries/index.js | 6 +++--- .../public/application/visualizations/views/top_n.js | 4 ++-- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/plugins/vis_type_timeseries/common/empty_label.ts b/src/plugins/vis_type_timeseries/common/empty_label.ts index d55a58f17dbf3e..d95e8fe3f7f163 100644 --- a/src/plugins/vis_type_timeseries/common/empty_label.ts +++ b/src/plugins/vis_type_timeseries/common/empty_label.ts @@ -11,3 +11,10 @@ import { i18n } from '@kbn/i18n'; export const emptyLabel = i18n.translate('visTypeTimeseries.emptyTextValue', { defaultMessage: '(empty)', }); + +export const getValueOrEmpty = (value: unknown) => { + if (value === '' || value === null || value === undefined) { + return emptyLabel; + } + return `${value}`; +}; diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.js b/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.js index 3616a8c8b348d7..816bce5dac75bb 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_vars.js @@ -9,7 +9,7 @@ import { set } from '@elastic/safer-lodash-set'; import _ from 'lodash'; import { getLastValue } from '../../../../common/last_value_utils'; -import { emptyLabel } from '../../../../common/empty_label'; +import { getValueOrEmpty, emptyLabel } from '../../../../common/empty_label'; import { createTickFormatter } from './tick_formatter'; import { labelDateFormatter } from './label_date_formatter'; import moment from 'moment'; @@ -20,7 +20,12 @@ export const convertSeriesToVars = (series, model, dateFormat = 'lll', getConfig series .filter((row) => _.startsWith(row.id, seriesModel.id)) .forEach((row) => { - const label = row.label ? _.snakeCase(row.label) : emptyLabel; + let label = getValueOrEmpty(row.label); + + if (label !== emptyLabel) { + label = _.snakeCase(label); + } + const varName = [label, _.snakeCase(seriesModel.var_name)].filter((v) => v).join('.'); const formatter = createTickFormatter( diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js index 8f19644132d3fa..4dd8f672c9ea30 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_types/table/vis.js @@ -18,7 +18,7 @@ import { replaceVars } from '../../lib/replace_vars'; import { fieldFormats } from '../../../../../../../plugins/data/public'; import { FormattedMessage } from '@kbn/i18n/react'; import { getFieldFormats, getCoreStart } from '../../../../services'; -import { emptyLabel } from '../../../../../common/empty_label'; +import { getValueOrEmpty } from '../../../../../common/empty_label'; function getColor(rules, colorKey, value) { let color; @@ -98,7 +98,7 @@ class TableVis extends Component { }); return ( <tr key={row.key}> - <td>{rowDisplay || emptyLabel}</td> + <td>{getValueOrEmpty(rowDisplay)}</td> {columns} </tr> ); diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_with_splits.js b/src/plugins/vis_type_timeseries/public/application/components/vis_with_splits.js index 4b933bc81d8825..e55c5d708e4813 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_with_splits.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_with_splits.js @@ -10,7 +10,7 @@ import React, { useCallback } from 'react'; import { getDisplayName } from './lib/get_display_name'; import { labelDateFormatter } from './lib/label_date_formatter'; import { findIndex, first } from 'lodash'; -import { emptyLabel } from '../../../common/empty_label'; +import { getValueOrEmpty } from '../../../common/empty_label'; import { getSplitByTermsColor } from '../lib/get_split_by_terms_color'; export function visWithSplits(WrappedComponent) { @@ -110,7 +110,7 @@ export function visWithSplits(WrappedComponent) { visData={newVisData} onBrush={props.onBrush} onFilterClick={props.onFilterClick} - additionalLabel={additionalLabel || emptyLabel} + additionalLabel={getValueOrEmpty(additionalLabel)} backgroundColor={props.backgroundColor} getConfig={props.getConfig} /> diff --git a/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.ts b/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.ts index 028ce3d028997c..e02965c1b06573 100644 --- a/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.ts +++ b/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.ts @@ -10,7 +10,7 @@ import { PALETTES } from '../../../common/enums'; import type { PanelData } from '../../../common/types'; import { computeGradientFinalColor } from './compute_gradient_final_color'; import { rainbowColors } from './rainbow_colors'; -import { emptyLabel } from '../../../common/empty_label'; +import { getValueOrEmpty } from '../../../common/empty_label'; interface PaletteParams { colors: string[]; @@ -61,7 +61,7 @@ export const getSplitByTermsColor = ({ const outputColor = palettesRegistry?.get(paletteName || 'default').getCategoricalColor( [ { - name: seriesName || emptyLabel, + name: getValueOrEmpty(seriesName), rankAtDepth: seriesById.findIndex(({ id }) => id === seriesId), totalSeriesAtDepth: seriesById.length, }, diff --git a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js index a4d834ea8d2175..ed62c0909e51ba 100644 --- a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js @@ -31,7 +31,7 @@ import { BarSeriesDecorator } from './decorators/bar_decorator'; import { getStackAccessors } from './utils/stack_format'; import { getBaseTheme, getChartClasses } from './utils/theme'; import { TOOLTIP_MODES } from '../../../../../common/enums'; -import { emptyLabel } from '../../../../../common/empty_label'; +import { getValueOrEmpty } from '../../../../../common/empty_label'; import { getSplitByTermsColor } from '../../../lib/get_split_by_terms_color'; import { renderEndzoneTooltip } from '../../../../../../charts/public'; import { getAxisLabelString } from '../../../components/lib/get_axis_label_string'; @@ -237,7 +237,7 @@ export const TimeSeries = ({ key={key} seriesId={id} seriesGroupId={groupId} - name={seriesName || emptyLabel} + name={getValueOrEmpty(seriesName)} data={data} hideInLegend={hideInLegend} bars={bars} @@ -262,7 +262,7 @@ export const TimeSeries = ({ key={key} seriesId={id} seriesGroupId={groupId} - name={seriesName || emptyLabel} + name={getValueOrEmpty(seriesName)} data={data} hideInLegend={hideInLegend} lines={lines} diff --git a/src/plugins/vis_type_timeseries/public/application/visualizations/views/top_n.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/top_n.js index 0c43ab157fbbba..9d6381f21b11f6 100644 --- a/src/plugins/vis_type_timeseries/public/application/visualizations/views/top_n.js +++ b/src/plugins/vis_type_timeseries/public/application/visualizations/views/top_n.js @@ -10,7 +10,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { getLastValue, isEmptyValue } from '../../../../common/last_value_utils'; import { labelDateFormatter } from '../../components/lib/label_date_formatter'; -import { emptyLabel } from '../../../../common/empty_label'; +import { getValueOrEmpty } from '../../../../common/empty_label'; import reactcss from 'reactcss'; const RENDER_MODES = { @@ -131,7 +131,7 @@ export class TopN extends Component { return ( <tr key={key} onClick={this.handleClick({ lastValue, ...item })} style={styles.row}> <td title={item.label} className="tvbVisTopN__label" style={styles.label}> - {label || emptyLabel} + {getValueOrEmpty(label)} </td> <td width="100%" className="tvbVisTopN__bar"> <div className="tvbVisTopN__innerBar" style={styles.innerBar}> From 2f4b9f59166f0ba5343520a192eac39511ce2f7d Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Tue, 29 Jun 2021 16:24:30 +0100 Subject: [PATCH 094/227] revert cypress (#103658) --- .../cypress/integration/cases/attach_timeline.spec.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts b/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts index b8477d5b082802..29105ce1582cf0 100644 --- a/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/cases/attach_timeline.spec.ts @@ -21,12 +21,10 @@ import { createCase } from '../../tasks/api_calls/cases'; describe('attach timeline to case', () => { context('without cases created', () => { - beforeEach((done) => { + beforeEach(() => { cleanKibana(); - createTimeline(timeline).then((response) => { cy.wrap(response.body.data.persistTimeline.timeline).as('myTimeline'); - done(); }); }); From e387d3d98f4a88ab8503ddaad16b1dc839823564 Mon Sep 17 00:00:00 2001 From: Alison Goryachev <alison.goryachev@elastic.co> Date: Tue, 29 Jun 2021 11:32:41 -0400 Subject: [PATCH 095/227] [Snapshot + Restore] Set snapshots response size limit (#103331) --- .../public/doc_links/doc_links_service.ts | 1 + .../helpers/home.helpers.ts | 5 +- .../__jest__/client_integration/home.test.ts | 74 ++++++++++++- .../snapshot_restore/common/constants.ts | 6 + .../common/lib/snapshot_serialization.test.ts | 3 +- .../common/lib/snapshot_serialization.ts | 2 +- .../snapshot_restore/common/types/snapshot.ts | 1 + .../home/snapshot_list/snapshot_list.tsx | 45 +++++++- .../server/routes/api/repositories.test.ts | 7 +- .../server/routes/api/repositories.ts | 7 +- .../server/routes/api/snapshots.test.ts | 89 +++++++++------ .../server/routes/api/snapshots.ts | 104 ++++++------------ .../translations/translations/ja-JP.json | 5 - .../translations/translations/zh-CN.json | 5 - 14 files changed, 223 insertions(+), 131 deletions(-) diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 43c21b37ee2980..9206a4d1b99f1e 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -355,6 +355,7 @@ export class DocLinksService { guide: `${KIBANA_DOCS}snapshot-repositories.html`, changeIndexSettings: `${ELASTICSEARCH_DOCS}snapshots-restore-snapshot.html#change-index-settings-during-restore`, createSnapshot: `${ELASTICSEARCH_DOCS}snapshots-take-snapshot.html`, + getSnapshot: `${ELASTICSEARCH_DOCS}get-snapshot-api.html`, registerSharedFileSystem: `${ELASTICSEARCH_DOCS}snapshots-register-repository.html#snapshots-filesystem-repository`, registerSourceOnly: `${ELASTICSEARCH_DOCS}snapshots-register-repository.html#snapshots-source-only-repository`, registerUrl: `${ELASTICSEARCH_DOCS}snapshots-register-repository.html#snapshots-read-only-repository`, diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts index 00cec284f37473..238d3e04404932 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts @@ -379,4 +379,7 @@ export type TestSubjects = | 'verifyRepositoryButton' | 'version' | 'version.title' - | 'version.value'; + | 'version.value' + | 'maxSnapshotsWarning' + | 'repositoryErrorsWarning' + | 'repositoryErrorsPrompt'; diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts index 9f334ce4d49c84..a1f86e25d97fd4 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/home.test.ts @@ -33,6 +33,16 @@ jest.mock('@kbn/i18n/react', () => { }; }); +jest.mock('../../common/constants', () => { + const original = jest.requireActual('../../common/constants'); + + return { + ...original, + // Mocking this value to a lower number in order to more easily trigger the max snapshots warning in the tests + SNAPSHOT_LIST_MAX_SIZE: 2, + }; +}); + const removeWhiteSpaceOnArrayValues = (array: any[]) => array.map((value) => { if (!value.trim) { @@ -461,7 +471,6 @@ describe('<SnapshotRestoreHome />', () => { httpRequestsMockHelpers.setLoadSnapshotsResponse({ snapshots, repositories: [REPOSITORY_NAME], - errors: {}, }); testBed = await setup(); @@ -494,6 +503,69 @@ describe('<SnapshotRestoreHome />', () => { }); }); + test('should show a warning if the number of snapshots exceeded the limit', () => { + // We have mocked the SNAPSHOT_LIST_MAX_SIZE to 2, so the warning should display + const { find, exists } = testBed; + expect(exists('maxSnapshotsWarning')).toBe(true); + expect(find('maxSnapshotsWarning').text()).toContain( + 'Cannot show the full list of snapshots' + ); + }); + + test('should show a warning if one repository contains errors', async () => { + httpRequestsMockHelpers.setLoadSnapshotsResponse({ + snapshots, + repositories: [REPOSITORY_NAME], + errors: { + repository_with_errors: { + type: 'repository_exception', + reason: + '[repository_with_errors] Could not read repository data because the contents of the repository do not match its expected state.', + }, + }, + }); + + testBed = await setup(); + + await act(async () => { + testBed.actions.selectTab('snapshots'); + }); + + testBed.component.update(); + + const { find, exists } = testBed; + expect(exists('repositoryErrorsWarning')).toBe(true); + expect(find('repositoryErrorsWarning').text()).toContain( + 'Some repositories contain errors' + ); + }); + + test('should show a prompt if a repository contains errors and there are no other repositories', async () => { + httpRequestsMockHelpers.setLoadSnapshotsResponse({ + snapshots, + repositories: [], + errors: { + repository_with_errors: { + type: 'repository_exception', + reason: + '[repository_with_errors] Could not read repository data because the contents of the repository do not match its expected state.', + }, + }, + }); + + testBed = await setup(); + + await act(async () => { + testBed.actions.selectTab('snapshots'); + }); + + testBed.component.update(); + + const { find, exists } = testBed; + expect(exists('repositoryErrorsPrompt')).toBe(true); + expect(find('repositoryErrorsPrompt').text()).toContain('Some repositories contain errors'); + }); + test('each row should have a link to the repository', async () => { const { component, find, exists, table, router } = testBed; diff --git a/x-pack/plugins/snapshot_restore/common/constants.ts b/x-pack/plugins/snapshot_restore/common/constants.ts index b18e118dc5ff69..a7c83ecf702e01 100644 --- a/x-pack/plugins/snapshot_restore/common/constants.ts +++ b/x-pack/plugins/snapshot_restore/common/constants.ts @@ -65,3 +65,9 @@ export const TIME_UNITS: { [key: string]: 'd' | 'h' | 'm' | 's' } = { MINUTE: 'm', SECOND: 's', }; + +/** + * [Temporary workaround] In order to prevent client-side performance issues for users with a large number of snapshots, + * we set a hard-coded limit on the number of snapshots we return from the ES snapshots API + */ +export const SNAPSHOT_LIST_MAX_SIZE = 1000; diff --git a/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.test.ts b/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.test.ts index 07718c6d3d29fd..de769686dc99c1 100644 --- a/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.test.ts +++ b/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.test.ts @@ -12,10 +12,10 @@ describe('Snapshot serialization and deserialization', () => { test('deserializes a snapshot', () => { expect( deserializeSnapshotDetails( - 'repositoryName', { snapshot: 'snapshot name', uuid: 'UUID', + repository: 'repositoryName', version_id: 5, version: 'version', indices: ['index2', 'index3', 'index1'], @@ -55,6 +55,7 @@ describe('Snapshot serialization and deserialization', () => { { snapshot: 'last_successful_snapshot', uuid: 'last_successful_snapshot_UUID', + repository: 'repositoryName', version_id: 5, version: 'version', indices: ['index2', 'index3', 'index1'], diff --git a/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.ts b/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.ts index f8d73b489dc380..f2803a571c475c 100644 --- a/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.ts +++ b/x-pack/plugins/snapshot_restore/common/lib/snapshot_serialization.ts @@ -21,7 +21,6 @@ import { deserializeTime, serializeTime } from './time_serialization'; import { csvToArray } from './utils'; export function deserializeSnapshotDetails( - repository: string, snapshotDetailsEs: SnapshotDetailsEs, managedRepository?: string, successfulSnapshots?: SnapshotDetailsEs[] @@ -33,6 +32,7 @@ export function deserializeSnapshotDetails( const { snapshot, uuid, + repository, version_id: versionId, version, indices = [], diff --git a/x-pack/plugins/snapshot_restore/common/types/snapshot.ts b/x-pack/plugins/snapshot_restore/common/types/snapshot.ts index fba55bec9fa97c..97f3b00d97326d 100644 --- a/x-pack/plugins/snapshot_restore/common/types/snapshot.ts +++ b/x-pack/plugins/snapshot_restore/common/types/snapshot.ts @@ -52,6 +52,7 @@ export interface SnapshotDetails { export interface SnapshotDetailsEs { snapshot: string; uuid: string; + repository: string; version_id: number; version: string; indices: string[]; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx index f1c6b61e27c9c1..92c03d1be936da 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx @@ -19,7 +19,7 @@ import { EuiIcon, } from '@elastic/eui'; -import { APP_SLM_CLUSTER_PRIVILEGES } from '../../../../../common'; +import { APP_SLM_CLUSTER_PRIVILEGES, SNAPSHOT_LIST_MAX_SIZE } from '../../../../../common'; import { WithPrivileges, PageLoading, PageError, Error } from '../../../../shared_imports'; import { BASE_PATH, UIM_SNAPSHOT_LIST_LOAD } from '../../../constants'; import { useLoadSnapshots } from '../../../services/http'; @@ -54,7 +54,7 @@ export const SnapshotList: React.FunctionComponent<RouteComponentProps<MatchPara resendRequest: reload, } = useLoadSnapshots(); - const { uiMetricService } = useServices(); + const { uiMetricService, i18n } = useServices(); const { docLinks } = useCore(); const openSnapshotDetailsUrl = ( @@ -138,6 +138,7 @@ export const SnapshotList: React.FunctionComponent<RouteComponentProps<MatchPara <EuiPageContent verticalPosition="center" horizontalPosition="center" color="danger"> <EuiEmptyPrompt iconType="managementApp" + data-test-subj="repositoryErrorsPrompt" title={ <h1 data-test-subj="title"> <FormattedMessage @@ -319,7 +320,7 @@ export const SnapshotList: React.FunctionComponent<RouteComponentProps<MatchPara ); } else { const repositoryErrorsWarning = Object.keys(errors).length ? ( - <Fragment> + <> <EuiCallOut title={ <FormattedMessage @@ -329,6 +330,7 @@ export const SnapshotList: React.FunctionComponent<RouteComponentProps<MatchPara } color="warning" iconType="alert" + data-test-subj="repositoryErrorsWarning" > <FormattedMessage id="xpack.snapshotRestore.repositoryWarningDescription" @@ -346,13 +348,48 @@ export const SnapshotList: React.FunctionComponent<RouteComponentProps<MatchPara /> </EuiCallOut> <EuiSpacer /> - </Fragment> + </> ) : null; + const maxSnapshotsWarning = snapshots.length === SNAPSHOT_LIST_MAX_SIZE && ( + <> + <EuiCallOut + color="warning" + iconType="help" + data-test-subj="maxSnapshotsWarning" + title={i18n.translate('xpack.snapshotRestore.snapshotsList.maxSnapshotsDisplayedTitle', { + defaultMessage: 'Cannot show the full list of snapshots', + })} + > + <FormattedMessage + id="xpack.snapshotRestore.snapshotsList.maxSnapshotsDisplayedDescription" + defaultMessage="You've reached the maximum number of viewable snapshots. To view all of your snapshots, use {docLink}." + values={{ + docLink: ( + <EuiLink + href={docLinks.links.snapshotRestore.getSnapshot} + target="_blank" + data-test-subj="documentationLink" + > + <FormattedMessage + id="xpack.snapshotRestore.snapshotsList.maxSnapshotsDisplayedDocLinkText" + defaultMessage="the Elasticsearch API" + /> + </EuiLink> + ), + }} + /> + </EuiCallOut> + <EuiSpacer size="l" /> + </> + ); + content = ( <section data-test-subj="snapshotList"> {repositoryErrorsWarning} + {maxSnapshotsWarning} + <SnapshotTable snapshots={snapshots} repositories={repositories} diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/repositories.test.ts b/x-pack/plugins/snapshot_restore/server/routes/api/repositories.test.ts index 7d14d62bfe1a0d..c3389e893407d3 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/repositories.test.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/repositories.test.ts @@ -166,12 +166,7 @@ describe('[Snapshot and Restore API Routes] Repositories', () => { [name]: { type: '', settings: {} }, }; const mockEsSnapshotResponse = { - responses: [ - { - repository: name, - snapshots: [{}, {}], - }, - ], + snapshots: [{ repository: name }, { repository: name }], }; getClusterSettingsFn.mockResolvedValue({ body: mockSnapshotGetManagedRepositoryEsResponse }); diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/repositories.ts b/x-pack/plugins/snapshot_restore/server/routes/api/repositories.ts index 4254562a0a8862..4898c6e299ad30 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/repositories.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/repositories.ts @@ -116,7 +116,7 @@ export function registerRepositoriesRoutes({ snapshot: '_all', }); - const { responses: snapshotResponses } = response.body; + const { snapshots: snapshotList } = response.body; if (repositoryByName[name]) { const { type = '', settings = {} } = repositoryByName[name]; @@ -130,10 +130,7 @@ export function registerRepositoriesRoutes({ }, isManagedRepository: managedRepository === name, snapshots: { - count: - snapshotResponses && snapshotResponses[0] && snapshotResponses[0].snapshots - ? snapshotResponses[0].snapshots.length - : null, + count: snapshotList ? snapshotList.length : null, }, }, }); diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.test.ts b/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.test.ts index bd7dffe987feba..00543d7081d341 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.test.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.test.ts @@ -36,7 +36,6 @@ describe('[Snapshot and Restore API Routes] Snapshots', () => { */ const getClusterSettingsFn = router.getMockApiFn('cluster.getSettings'); const getLifecycleFn = router.getMockApiFn('slm.getLifecycle'); - const getRepoFn = router.getMockApiFn('snapshot.getRepository'); const getSnapshotFn = router.getMockApiFn('snapshot.get'); const deleteSnapshotFn = router.getMockApiFn('snapshot.delete'); @@ -64,37 +63,18 @@ describe('[Snapshot and Restore API Routes] Snapshots', () => { fooPolicy: {}, }; - const mockSnapshotGetRepositoryEsResponse = { - fooRepository: {}, - barRepository: {}, - }; - - const mockGetSnapshotsFooResponse = { - responses: [ - { - repository: 'fooRepository', - snapshots: [{ snapshot: 'snapshot1' }], - }, - ], - }; - - const mockGetSnapshotsBarResponse = { - responses: [ - { - repository: 'barRepository', - snapshots: [{ snapshot: 'snapshot2' }], - }, + const mockGetSnapshotsResponse = { + snapshots: [ + { snapshot: 'snapshot1', repository: 'fooRepository' }, + { snapshot: 'snapshot2', repository: 'barRepository' }, ], }; getClusterSettingsFn.mockResolvedValue({ body: mockSnapshotGetManagedRepositoryEsResponse }); getLifecycleFn.mockResolvedValue({ body: mockSnapshotGetPolicyEsResponse }); - getRepoFn.mockResolvedValue({ body: mockSnapshotGetRepositoryEsResponse }); - getSnapshotFn.mockResolvedValueOnce({ body: mockGetSnapshotsFooResponse }); - getSnapshotFn.mockResolvedValueOnce({ body: mockGetSnapshotsBarResponse }); + getSnapshotFn.mockResolvedValueOnce({ body: mockGetSnapshotsResponse }); const expectedResponse = { - errors: {}, repositories: ['fooRepository', 'barRepository'], policies: ['fooPolicy'], snapshots: [ @@ -123,16 +103,62 @@ describe('[Snapshot and Restore API Routes] Snapshots', () => { expect(response).toEqual({ body: expectedResponse }); }); + test('returns an error object if ES request contains repository failures', async () => { + const mockSnapshotGetPolicyEsResponse = { + fooPolicy: {}, + }; + + const mockGetSnapshotsResponse = { + snapshots: [{ snapshot: 'snapshot1', repository: 'fooRepository' }], + failures: { + bar: { + type: 'repository_exception', + reason: + "[barRepository] Could not read repository data because the contents of the repository do not match its expected state. This is likely the result of either concurrently modifying the contents of the repository by a process other than this cluster or an issue with the repository's underlying storage. The repository has been disabled to prevent corrupting its contents. To re-enable it and continue using it please remove the repository from the cluster and add it again to make the cluster recover the known state of the repository from its physical contents.", + }, + }, + }; + + getClusterSettingsFn.mockResolvedValue({ body: mockSnapshotGetManagedRepositoryEsResponse }); + getLifecycleFn.mockResolvedValue({ body: mockSnapshotGetPolicyEsResponse }); + getSnapshotFn.mockResolvedValueOnce({ body: mockGetSnapshotsResponse }); + + const expectedResponse = { + repositories: ['fooRepository'], + policies: ['fooPolicy'], + snapshots: [ + { + ...defaultSnapshot, + repository: 'fooRepository', + snapshot: 'snapshot1', + managedRepository: + mockSnapshotGetManagedRepositoryEsResponse.defaults[ + 'cluster.metadata.managed_repository' + ], + }, + ], + errors: { + bar: { + type: 'repository_exception', + reason: + "[barRepository] Could not read repository data because the contents of the repository do not match its expected state. This is likely the result of either concurrently modifying the contents of the repository by a process other than this cluster or an issue with the repository's underlying storage. The repository has been disabled to prevent corrupting its contents. To re-enable it and continue using it please remove the repository from the cluster and add it again to make the cluster recover the known state of the repository from its physical contents.", + }, + }, + }; + + const response = await router.runRequest(mockRequest); + expect(response).toEqual({ body: expectedResponse }); + }); + test('returns empty arrays if no snapshots returned from ES', async () => { const mockSnapshotGetPolicyEsResponse = {}; const mockSnapshotGetRepositoryEsResponse = {}; getClusterSettingsFn.mockResolvedValue({ body: mockSnapshotGetManagedRepositoryEsResponse }); getLifecycleFn.mockResolvedValue({ body: mockSnapshotGetPolicyEsResponse }); - getRepoFn.mockResolvedValue({ body: mockSnapshotGetRepositoryEsResponse }); + getSnapshotFn.mockResolvedValue({ body: mockSnapshotGetRepositoryEsResponse }); const expectedResponse = { - errors: [], snapshots: [], repositories: [], policies: [], @@ -145,7 +171,7 @@ describe('[Snapshot and Restore API Routes] Snapshots', () => { test('throws if ES error', async () => { getClusterSettingsFn.mockRejectedValueOnce(new Error()); getLifecycleFn.mockRejectedValueOnce(new Error()); - getRepoFn.mockRejectedValueOnce(new Error()); + getSnapshotFn.mockRejectedValueOnce(new Error()); await expect(router.runRequest(mockRequest)).rejects.toThrowError(); }); @@ -172,12 +198,7 @@ describe('[Snapshot and Restore API Routes] Snapshots', () => { test('returns snapshot object with repository name if returned from ES', async () => { const mockSnapshotGetEsResponse = { - responses: [ - { - repository, - snapshots: [{ snapshot }], - }, - ], + snapshots: [{ snapshot, repository }], }; getClusterSettingsFn.mockResolvedValue({ body: mockSnapshotGetManagedRepositoryEsResponse }); diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts b/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts index af9c08f76f6f7d..7307bad947211e 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/snapshots.ts @@ -6,7 +6,8 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; -import type { SnapshotDetails, SnapshotDetailsEs } from '../../../common/types'; +import type { SnapshotDetailsEs } from '../../../common/types'; +import { SNAPSHOT_LIST_MAX_SIZE } from '../../../common/constants'; import { deserializeSnapshotDetails } from '../../../common/lib'; import type { RouteDependencies } from '../../types'; import { getManagedRepositoryName } from '../../lib'; @@ -36,76 +37,45 @@ export function registerSnapshotsRoutes({ // Silently swallow error as policy names aren't required in UI } - /* - * TODO: For 8.0, replace the logic in this handler with one call to `GET /_snapshot/_all/_all` - * when no repositories bug is fixed: https://github.com/elastic/elasticsearch/issues/43547 - */ - - let repositoryNames: string[]; - try { - const { - body: repositoriesByName, - } = await clusterClient.asCurrentUser.snapshot.getRepository({ + // If any of these repositories 504 they will cost the request significant time. + const { body: fetchedSnapshots } = await clusterClient.asCurrentUser.snapshot.get({ repository: '_all', + snapshot: '_all', + ignore_unavailable: true, // Allow request to succeed even if some snapshots are unavailable. + // @ts-expect-error @elastic/elasticsearch "desc" is a new param + order: 'desc', + // TODO We are temporarily hard-coding the maximum number of snapshots returned + // in order to prevent an unusable UI for users with large number of snapshots + // In the near future, this will be resolved with server-side pagination + size: SNAPSHOT_LIST_MAX_SIZE, }); - repositoryNames = Object.keys(repositoriesByName); - if (repositoryNames.length === 0) { - return res.ok({ - body: { snapshots: [], errors: [], repositories: [], policies }, - }); - } - } catch (e) { - return handleEsError({ error: e, response: res }); - } + const allRepos: string[] = []; - const snapshots: SnapshotDetails[] = []; - const errors: any = {}; - const repositories: string[] = []; - - const fetchSnapshotsForRepository = async (repository: string) => { - try { - // If any of these repositories 504 they will cost the request significant time. - const response = await clusterClient.asCurrentUser.snapshot.get({ - repository, - snapshot: '_all', - ignore_unavailable: true, // Allow request to succeed even if some snapshots are unavailable. - }); - - const { responses: fetchedResponses = [] } = response.body; - - // Decorate each snapshot with the repository with which it's associated. - fetchedResponses.forEach(({ snapshots: fetchedSnapshots = [] }) => { - fetchedSnapshots.forEach((snapshot) => { - snapshots.push( - deserializeSnapshotDetails( - repository, - snapshot as SnapshotDetailsEs, - managedRepository - ) - ); - }); - }); - - repositories.push(repository); - } catch (error) { - // These errors are commonly due to a misconfiguration in the repository or plugin errors, - // which can result in a variety of 400, 404, and 500 errors. - errors[repository] = error; - } - }; + // Decorate each snapshot with the repository with which it's associated. + const snapshots = fetchedSnapshots?.snapshots?.map((snapshot) => { + // @ts-expect-error @elastic/elasticsearch "repository" is a new field in the response + allRepos.push(snapshot.repository); + return deserializeSnapshotDetails(snapshot as SnapshotDetailsEs, managedRepository); + }); - await Promise.all(repositoryNames.map(fetchSnapshotsForRepository)); + const uniqueRepos = allRepos.filter((repo, index) => { + return allRepos.indexOf(repo) === index; + }); - return res.ok({ - body: { - snapshots, - policies, - repositories, - errors, - }, - }); + return res.ok({ + body: { + snapshots: snapshots || [], + policies, + repositories: uniqueRepos, + // @ts-expect-error @elastic/elasticsearch "failures" is a new field in the response + errors: fetchedSnapshots?.failures, + }, + }); + } catch (e) { + return handleEsError({ error: e, response: res }); + } }) ); @@ -132,13 +102,12 @@ export function registerSnapshotsRoutes({ ignore_unavailable: true, }); - const { responses: snapshotsResponse } = response.body; + const { snapshots: snapshotsList } = response.body; - const snapshotsList = - snapshotsResponse && snapshotsResponse[0] && snapshotsResponse[0].snapshots; if (!snapshotsList || snapshotsList.length === 0) { return res.notFound({ body: 'Snapshot not found' }); } + const selectedSnapshot = snapshotsList.find( ({ snapshot: snapshotName }) => snapshot === snapshotName ) as SnapshotDetailsEs; @@ -156,7 +125,6 @@ export function registerSnapshotsRoutes({ return res.ok({ body: deserializeSnapshotDetails( - repository, selectedSnapshot, managedRepository, successfulSnapshots diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index db6ec3ad7dd5b8..c76a762d962275 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -21755,9 +21755,6 @@ "xpack.snapshotRestore.repositoryVerification.verificationErrorValue": "未接続", "xpack.snapshotRestore.repositoryVerification.verificationSuccessfulValue": "接続済み", "xpack.snapshotRestore.repositoryVerification.verificationUnknownValue": "不明", - "xpack.snapshotRestore.repositoryWarningDescription": "スナップショットの読み込みが遅い可能性があります。{repositoryLink} に移動してエラーを解決してください。", - "xpack.snapshotRestore.repositoryWarningLinkText": "レポジトリ", - "xpack.snapshotRestore.repositoryWarningTitle": "一部のレポジトリにエラーがあります", "xpack.snapshotRestore.restoreForm.backButtonLabel": "戻る", "xpack.snapshotRestore.restoreForm.dataStreamsWarningCallOut.body": "各データストリームには、一致するインデックステンプレートが必要です。復元されたすべてのデータストリームに一致するインデックステンプレートがあることを確認してください。インデックステンプレートを復元するには、グローバルクラスター状態を復元します。ただし、既存のテンプレート、クラスター設定、入力パイプライン、ライフサイクルポリシーが上書きされる場合があります。データストリームを含むスナップショットの復元については、{learnMoreLink}。", "xpack.snapshotRestore.restoreForm.dataStreamsWarningCallOut.body.learnMoreLink": "詳細", @@ -21907,14 +21904,12 @@ "xpack.snapshotRestore.snapshotDetails.snapshotIsBeingCreatedMessage": "スナップショットを作成中です。", "xpack.snapshotRestore.snapshotDetails.summaryTabTitle": "まとめ", "xpack.snapshotRestore.snapshotList.emptyPrompt.addPolicyText": "ポリシーを作成", - "xpack.snapshotRestore.snapshotList.emptyPrompt.errorRepositoriesTitle": "一部のレポジトリにエラーがあります", "xpack.snapshotRestore.snapshotList.emptyPrompt.goToPoliciesText": "ポリシーを表示", "xpack.snapshotRestore.snapshotList.emptyPrompt.noRepositoriesAddButtonLabel": "レポジトリを登録", "xpack.snapshotRestore.snapshotList.emptyPrompt.noRepositoriesDescription": "スナップショットがライブである場所が必要です。", "xpack.snapshotRestore.snapshotList.emptyPrompt.noRepositoriesTitle": "リポジトリを登録して始める", "xpack.snapshotRestore.snapshotList.emptyPrompt.noSnapshotsDescription": "Elasticsearch API でスナップショットを作成します。", "xpack.snapshotRestore.snapshotList.emptyPrompt.noSnapshotsTitle": "まだスナップショットがありません", - "xpack.snapshotRestore.snapshotList.emptyPrompt.repositoryWarningDescription": "{repositoryLink} に移動してエラーを解決してください。", "xpack.snapshotRestore.snapshotList.emptyPrompt.usePolicyDescription": "スナップショットを作成するには、スナップショットライフサイクルポリシーを実行してください。スナップショットは {docLink} でも作成できます。", "xpack.snapshotRestore.snapshotList.loadingSnapshotsDescription": "スナップショットを読み込み中…", "xpack.snapshotRestore.snapshotList.loadingSnapshotsErrorMessage": "スナップショットの読み込み中にエラーが発生しました", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 790f41209bd28a..16a63682facdec 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -22101,9 +22101,6 @@ "xpack.snapshotRestore.repositoryVerification.verificationErrorValue": "未连接", "xpack.snapshotRestore.repositoryVerification.verificationSuccessfulValue": "已连接", "xpack.snapshotRestore.repositoryVerification.verificationUnknownValue": "未知", - "xpack.snapshotRestore.repositoryWarningDescription": "快照可能加载缓慢。前往 {repositoryLink} 以修复错误。", - "xpack.snapshotRestore.repositoryWarningLinkText": "存储库", - "xpack.snapshotRestore.repositoryWarningTitle": "一些存储库包含错误", "xpack.snapshotRestore.restoreForm.backButtonLabel": "返回", "xpack.snapshotRestore.restoreForm.dataStreamsWarningCallOut.body": "每个数据流需要匹配的索引模板。请确保任何存储的数据流有匹配的索引模板。可以通过存储全局集群状态来存储索引模板。不过,这可能会覆盖现有模板、集群设置、采集管道和生命周期策略。{learnMoreLink}如何存储包含数据流的快照。", "xpack.snapshotRestore.restoreForm.dataStreamsWarningCallOut.body.learnMoreLink": "了解详情", @@ -22259,14 +22256,12 @@ "xpack.snapshotRestore.snapshotDetails.snapshotIsBeingCreatedMessage": "正在创建快照。", "xpack.snapshotRestore.snapshotDetails.summaryTabTitle": "摘要", "xpack.snapshotRestore.snapshotList.emptyPrompt.addPolicyText": "创建策略", - "xpack.snapshotRestore.snapshotList.emptyPrompt.errorRepositoriesTitle": "一些存储库包含错误", "xpack.snapshotRestore.snapshotList.emptyPrompt.goToPoliciesText": "查看策略", "xpack.snapshotRestore.snapshotList.emptyPrompt.noRepositoriesAddButtonLabel": "注册存储库", "xpack.snapshotRestore.snapshotList.emptyPrompt.noRepositoriesDescription": "您需要将用于安置快照的位置。", "xpack.snapshotRestore.snapshotList.emptyPrompt.noRepositoriesTitle": "首先注册存储库", "xpack.snapshotRestore.snapshotList.emptyPrompt.noSnapshotsDescription": "使用 Elasticsearch API 创建快照", "xpack.snapshotRestore.snapshotList.emptyPrompt.noSnapshotsTitle": "您尚未有任何快照", - "xpack.snapshotRestore.snapshotList.emptyPrompt.repositoryWarningDescription": "前往 {repositoryLink} 以修复错误。", "xpack.snapshotRestore.snapshotList.emptyPrompt.usePolicyDescription": "运行快照生命周期策略以创建快照。还可以使用 {docLink} 创建快照。", "xpack.snapshotRestore.snapshotList.loadingSnapshotsDescription": "正在加载快照……", "xpack.snapshotRestore.snapshotList.loadingSnapshotsErrorMessage": "加载快照时出错", From 46402538d2771b2a448e1c9a71e306e72af86fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ester=20Mart=C3=AD=20Vilaseca?= <ester.martivilaseca@elastic.co> Date: Tue, 29 Jun 2021 17:35:37 +0200 Subject: [PATCH 096/227] [Monitoring] Enable out of the box alerts modal (#101565) * Remove api call to create alerts * Add enable alerts modal * Update modal title * Add simple alerts dropdown * change alerts modal design * refactor alerts modal provider * Add alerts dropdown * Show toast after alert creation and add error handling * Do not show alerts modal if alerts already exist * Fix stack monitoring test * Fix more stack monitoring tests and types * Fix tests after merge * Attempt to fix stack monitoring tests * remove console.log * Change text * Remove commented comment * Update docs for stack monitoring alerts * Fix docs Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/user/monitoring/kibana-alerts.asciidoc | 12 +- .../public/alerts/alerts_dropdown.tsx | 77 +++++++++ .../public/alerts/enable_alerts_modal.tsx | 148 ++++++++++++++++++ .../monitoring/public/angular/app_modules.ts | 5 + .../monitoring/public/angular/index.ts | 2 + .../plugins/monitoring/public/legacy_shims.ts | 13 +- x-pack/plugins/monitoring/public/plugin.ts | 1 + .../monitoring/public/services/clusters.js | 14 +- .../public/services/enable_alerts_modal.js | 53 +++++++ x-pack/plugins/monitoring/public/types.ts | 3 +- .../public/views/base_controller.js | 7 + .../public/views/cluster/overview/index.js | 2 + .../apps/monitoring/beats/beat_detail.js | 2 + .../apps/monitoring/beats/cluster.js | 2 + .../apps/monitoring/beats/listing.js | 2 + .../apps/monitoring/beats/overview.js | 2 + .../apps/monitoring/cluster/list.js | 1 + .../apps/monitoring/cluster/overview.js | 6 + .../monitoring/elasticsearch/index_detail.js | 2 + .../elasticsearch/index_detail_mb.js | 2 + .../apps/monitoring/elasticsearch/indices.js | 2 + .../monitoring/elasticsearch/indices_mb.js | 2 + .../monitoring/elasticsearch/node_detail.js | 6 + .../elasticsearch/node_detail_mb.js | 6 + .../apps/monitoring/elasticsearch/nodes.js | 2 + .../apps/monitoring/elasticsearch/nodes_mb.js | 4 + .../apps/monitoring/elasticsearch/overview.js | 2 + .../monitoring/elasticsearch/overview_mb.js | 2 + .../monitoring/enable_monitoring/index.js | 1 + .../apps/monitoring/kibana/instance.js | 2 + .../apps/monitoring/kibana/instance_mb.js | 2 + .../apps/monitoring/kibana/instances.js | 2 + .../apps/monitoring/kibana/instances_mb.js | 2 + .../apps/monitoring/kibana/overview.js | 2 + .../apps/monitoring/kibana/overview_mb.js | 2 + .../apps/monitoring/logstash/pipelines.js | 2 + .../apps/monitoring/logstash/pipelines_mb.js | 2 + .../page_objects/monitoring_page.ts | 4 + .../services/monitoring/cluster_overview.js | 4 + 39 files changed, 389 insertions(+), 18 deletions(-) create mode 100644 x-pack/plugins/monitoring/public/alerts/alerts_dropdown.tsx create mode 100644 x-pack/plugins/monitoring/public/alerts/enable_alerts_modal.tsx create mode 100644 x-pack/plugins/monitoring/public/services/enable_alerts_modal.js diff --git a/docs/user/monitoring/kibana-alerts.asciidoc b/docs/user/monitoring/kibana-alerts.asciidoc index ccd023f180c99b..67e4520f5c70c3 100644 --- a/docs/user/monitoring/kibana-alerts.asciidoc +++ b/docs/user/monitoring/kibana-alerts.asciidoc @@ -11,8 +11,8 @@ specific needs. [role="screenshot"] image::user/monitoring/images/monitoring-kibana-alerting-notification.png["{kib} alerting notifications in {stack-monitor-app}"] -When you open *{stack-monitor-app}*, the preconfigured rules are created -automatically. They are initially configured to detect and notify on various +When you open *{stack-monitor-app}*, you will be ask to create these rules +They are initially configured to detect and notify on various conditions across your monitored clusters. You can view notifications for: *Cluster health*, *Resource utilization*, and *Errors and exceptions* for {es} in real time. @@ -131,6 +131,14 @@ soon the expiration date is: The 60-day and 30-day thresholds are skipped for Trial licenses, which are only valid for 30 days. +[discrete] +== Alerts and rules +[discrete] +=== Create default rules +This option can be used to create default rules in this kibana spaces. This is +useful for scenarios when you didn't choose to create these default rules initially +or anytime later if the rules were accidentally deleted. + NOTE: Some action types are subscription features, while others are free. For a comparison of the Elastic subscription levels, see the alerting section of the {subscriptions}[Subscriptions page]. diff --git a/x-pack/plugins/monitoring/public/alerts/alerts_dropdown.tsx b/x-pack/plugins/monitoring/public/alerts/alerts_dropdown.tsx new file mode 100644 index 00000000000000..df0cbb43f85695 --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/alerts_dropdown.tsx @@ -0,0 +1,77 @@ +/* + * 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 { + EuiButtonEmpty, + EuiContextMenu, + EuiContextMenuPanelDescriptor, + EuiPopover, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { Legacy } from '../legacy_shims'; + +export const AlertsDropdown: React.FC<{}> = () => { + const $injector = Legacy.shims.getAngularInjector(); + const alertsEnableModalProvider: any = $injector.get('enableAlertsModal'); + + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const closePopover = () => { + alertsEnableModalProvider.enableAlerts(); + setIsPopoverOpen(false); + }; + + const togglePopoverVisibility = () => { + setIsPopoverOpen(!isPopoverOpen); + }; + + const createDefaultRules = () => { + closePopover(); + }; + + const button = ( + <EuiButtonEmpty iconSide={'right'} iconType={'arrowDown'} onClick={togglePopoverVisibility}> + <FormattedMessage + id="xpack.monitoring.alerts.dropdown.button" + defaultMessage="Alerts and rules" + /> + </EuiButtonEmpty> + ); + + const items = [ + { + name: i18n.translate('xpack.monitoring.alerts.dropdown.createAlerts', { + defaultMessage: 'Create default rules', + }), + onClick: createDefaultRules, + }, + ]; + + const panels: EuiContextMenuPanelDescriptor[] = [ + { + id: 0, + title: i18n.translate('xpack.monitoring.alerts.dropdown.title', { + defaultMessage: 'Alerts and rules', + }), + items, + }, + ]; + + return ( + <EuiPopover + panelPaddingSize="none" + anchorPosition="downLeft" + button={button} + isOpen={isPopoverOpen} + closePopover={closePopover} + > + <EuiContextMenu initialPanelId={0} panels={panels} /> + </EuiPopover> + ); +}; diff --git a/x-pack/plugins/monitoring/public/alerts/enable_alerts_modal.tsx b/x-pack/plugins/monitoring/public/alerts/enable_alerts_modal.tsx new file mode 100644 index 00000000000000..914446c42aaa79 --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/enable_alerts_modal.tsx @@ -0,0 +1,148 @@ +/* + * 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, { useEffect, useState, useContext } from 'react'; + +import { + EuiButton, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiButtonEmpty, + EuiText, + EuiLink, + EuiRadioGroup, + EuiSpacer, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; +import { AlertsContext } from './context'; +import { Legacy } from '../legacy_shims'; + +export const EnableAlertsModal: React.FC<{}> = () => { + const [isModalVisible, setIsModalVisible] = useState(false); + const $injector = Legacy.shims.getAngularInjector(); + const alertsEnableModalProvider: any = $injector.get('enableAlertsModal'); + const alertsContext = useContext(AlertsContext); + + const closeModal = () => { + setIsModalVisible(false); + alertsEnableModalProvider.hideModalForSession(); + }; + + const radios = [ + { + id: 'create-alerts', + label: i18n.translate('xpack.monitoring.alerts.modal.yesOption', { + defaultMessage: 'Yes (Recommended - create default rules in this kibana spaces)', + }), + }, + { + id: 'not-create-alerts', + label: i18n.translate('xpack.monitoring.alerts.modal.noOption', { + defaultMessage: 'No', + }), + }, + ]; + + const [radioIdSelected, setRadioIdSelected] = useState('create-alerts'); + + const onChange = (optionId: string) => { + setRadioIdSelected(optionId); + }; + + useEffect(() => { + if (alertsEnableModalProvider.shouldShowAlertsModal(alertsContext)) { + setIsModalVisible(true); + } + }, [alertsEnableModalProvider, alertsContext]); + + const confirmButtonClick = () => { + if (radioIdSelected === 'create-alerts') { + alertsEnableModalProvider.enableAlerts(); + } else { + alertsEnableModalProvider.notAskAgain(); + } + + closeModal(); + }; + + const remindLaterClick = () => { + alertsEnableModalProvider.hideModalForSession(); + closeModal(); + }; + + return isModalVisible ? ( + <EuiModal onClose={closeModal}> + <EuiModalHeader> + <EuiModalHeaderTitle> + <h1> + <FormattedMessage + id="xpack.monitoring.alerts.modal.title" + defaultMessage="Create rules" + /> + </h1> + </EuiModalHeaderTitle> + </EuiModalHeader> + + <EuiModalBody> + <EuiText> + <p> + <FormattedMessage + id="xpack.monitoring.alerts.modal.description" + defaultMessage="Stack monitoring comes with many out-of-the box rules to notify you of common issues + around cluster health, resource utilization and errors or exceptions. {learnMoreLink}" + values={{ + learnMoreLink: ( + <EuiLink + href={Legacy.shims.docLinks.links.monitoring.alertsKibana} + target="_blank" + > + <FormattedMessage + id="xpack.monitoring.alerts.modal.description.link" + defaultMessage="Learn more..." + /> + </EuiLink> + ), + }} + /> + </p> + <div> + <FormattedMessage + id="xpack.monitoring.alerts.modal.createDescription" + defaultMessage="Create these out-of-the box rules?" + /> + + <EuiSpacer size="xs" /> + + <EuiRadioGroup + options={radios} + idSelected={radioIdSelected} + onChange={(id) => onChange(id)} + name="radio group" + /> + </div> + </EuiText> + </EuiModalBody> + + <EuiModalFooter> + <EuiButtonEmpty onClick={remindLaterClick}> + <FormattedMessage + id="xpack.monitoring.alerts.modal.remindLater" + defaultMessage="Remind me later" + /> + </EuiButtonEmpty> + + <EuiButton onClick={confirmButtonClick} fill data-test-subj="alerts-modal-button"> + <FormattedMessage id="xpack.monitoring.alerts.modal.confirm" defaultMessage="Ok" /> + </EuiButton> + </EuiModalFooter> + </EuiModal> + ) : null; +}; diff --git a/x-pack/plugins/monitoring/public/angular/app_modules.ts b/x-pack/plugins/monitoring/public/angular/app_modules.ts index 71dc4919237e5f..e7b2f7a5370009 100644 --- a/x-pack/plugins/monitoring/public/angular/app_modules.ts +++ b/x-pack/plugins/monitoring/public/angular/app_modules.ts @@ -42,6 +42,8 @@ import { licenseProvider } from '../services/license'; // @ts-ignore import { titleProvider } from '../services/title'; // @ts-ignore +import { enableAlertsModalProvider } from '../services/enable_alerts_modal'; +// @ts-ignore import { monitoringMlListingProvider } from '../directives/elasticsearch/ml_job_listing'; // @ts-ignore import { monitoringMainProvider } from '../directives/main'; @@ -142,6 +144,9 @@ function createMonitoringAppServices() { .service('features', function (Private: IPrivate) { return Private(featuresProvider); }) + .service('enableAlertsModal', function (Private: IPrivate) { + return Private(enableAlertsModalProvider); + }) .service('license', function (Private: IPrivate) { return Private(licenseProvider); }) diff --git a/x-pack/plugins/monitoring/public/angular/index.ts b/x-pack/plugins/monitoring/public/angular/index.ts index 0c605abb828bd3..de52b714a7241c 100644 --- a/x-pack/plugins/monitoring/public/angular/index.ts +++ b/x-pack/plugins/monitoring/public/angular/index.ts @@ -29,6 +29,7 @@ export class AngularApp { triggersActionsUi, usageCollection, kibanaLegacy, + appMountParameters, } = deps; const app: IModule = localAppModule(deps); app.run(($injector: angular.auto.IInjectorService) => { @@ -45,6 +46,7 @@ export class AngularApp { kibanaLegacy, triggersActionsUi, usageCollection, + appMountParameters, }, this.injector ); diff --git a/x-pack/plugins/monitoring/public/legacy_shims.ts b/x-pack/plugins/monitoring/public/legacy_shims.ts index 7da0f8590a8962..a723eea8b6d653 100644 --- a/x-pack/plugins/monitoring/public/legacy_shims.ts +++ b/x-pack/plugins/monitoring/public/legacy_shims.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CoreStart, HttpSetup, IUiSettingsClient } from 'kibana/public'; +import { CoreStart, HttpSetup, IUiSettingsClient, AppMountParameters } from 'kibana/public'; import { Observable } from 'rxjs'; import { HttpRequestInit } from '../../../../src/core/public'; import { MonitoringStartPluginDependencies } from './types'; @@ -63,13 +63,21 @@ export interface IShims { triggersActionsUi: TriggersAndActionsUIPublicPluginStart; usageCollection: UsageCollectionSetup; kibanaServices: CoreStart & { usageCollection: UsageCollectionSetup }; + appMountParameters: AppMountParameters; } export class Legacy { private static _shims: IShims; public static init( - { core, data, isCloud, triggersActionsUi, usageCollection }: MonitoringStartPluginDependencies, + { + core, + data, + isCloud, + triggersActionsUi, + usageCollection, + appMountParameters, + }: MonitoringStartPluginDependencies, ngInjector: angular.auto.IInjectorService ) { this._shims = { @@ -129,6 +137,7 @@ export class Legacy { ...core, usageCollection, }, + appMountParameters, }; } diff --git a/x-pack/plugins/monitoring/public/plugin.ts b/x-pack/plugins/monitoring/public/plugin.ts index a597754d6c4099..a5b7d4906b5869 100644 --- a/x-pack/plugins/monitoring/public/plugin.ts +++ b/x-pack/plugins/monitoring/public/plugin.ts @@ -105,6 +105,7 @@ export class MonitoringPlugin externalConfig: this.getExternalConfig(), triggersActionsUi: pluginsStart.triggersActionsUi, usageCollection: plugins.usageCollection, + appMountParameters: params, }; const monitoringApp = new AngularApp(deps); diff --git a/x-pack/plugins/monitoring/public/services/clusters.js b/x-pack/plugins/monitoring/public/services/clusters.js index 71ae128072b7fa..937a69cbbc32d5 100644 --- a/x-pack/plugins/monitoring/public/services/clusters.js +++ b/x-pack/plugins/monitoring/public/services/clusters.js @@ -9,7 +9,6 @@ import { ajaxErrorHandlersProvider } from '../lib/ajax_error_handler'; import { Legacy } from '../legacy_shims'; import { STANDALONE_CLUSTER_CLUSTER_UUID } from '../../common/constants'; import { showInternalMonitoringToast } from '../lib/internal_monitoring_toasts'; -import { showAlertsToast } from '../alerts/lib/alerts_toast'; function formatClusters(clusters) { return clusters.map(formatCluster); @@ -58,16 +57,6 @@ export function monitoringClustersProvider($injector) { } } - async function ensureAlertsEnabled() { - try { - return $http.post('../api/monitoring/v1/alerts/enable', {}); - } catch (err) { - const Private = $injector.get('Private'); - const ajaxErrorHandlers = Private(ajaxErrorHandlersProvider); - return ajaxErrorHandlers(err); - } - } - async function ensureMetricbeatEnabled() { if (Legacy.shims.isCloud) { return; @@ -97,8 +86,7 @@ export function monitoringClustersProvider($injector) { const clusters = await getClusters(); if (clusters.length) { try { - const [{ data }] = await Promise.all([ensureAlertsEnabled(), ensureMetricbeatEnabled()]); - showAlertsToast(data); + await ensureMetricbeatEnabled(); } catch (_err) { // Intentionally swallow the error as this will retry the next page load } diff --git a/x-pack/plugins/monitoring/public/services/enable_alerts_modal.js b/x-pack/plugins/monitoring/public/services/enable_alerts_modal.js new file mode 100644 index 00000000000000..0232e302517afa --- /dev/null +++ b/x-pack/plugins/monitoring/public/services/enable_alerts_modal.js @@ -0,0 +1,53 @@ +/* + * 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 { ajaxErrorHandlersProvider } from '../lib/ajax_error_handler'; +import { showAlertsToast } from '../alerts/lib/alerts_toast'; + +export function enableAlertsModalProvider($http, $window, $injector) { + function shouldShowAlertsModal(alerts) { + const modalHasBeenShown = $window.sessionStorage.getItem('ALERTS_MODAL_HAS_BEEN_SHOWN'); + const decisionMade = $window.localStorage.getItem('ALERTS_MODAL_DECISION_MADE'); + + if (Object.keys(alerts.allAlerts).length > 0) { + $window.localStorage.setItem('ALERTS_MODAL_DECISION_MADE', true); + return false; + } + + if (!modalHasBeenShown && !decisionMade) { + return true; + } + + return false; + } + + async function enableAlerts() { + try { + const { data } = await $http.post('../api/monitoring/v1/alerts/enable', {}); + $window.localStorage.setItem('ALERTS_MODAL_DECISION_MADE', true); + showAlertsToast(data); + } catch (err) { + const Private = $injector.get('Private'); + const ajaxErrorHandlers = Private(ajaxErrorHandlersProvider); + return ajaxErrorHandlers(err); + } + } + + function notAskAgain() { + $window.localStorage.setItem('ALERTS_MODAL_DECISION_MADE', true); + } + + function hideModalForSession() { + $window.sessionStorage.setItem('ALERTS_MODAL_HAS_BEEN_SHOWN', true); + } + + return { + shouldShowAlertsModal, + enableAlerts, + notAskAgain, + hideModalForSession, + }; +} diff --git a/x-pack/plugins/monitoring/public/types.ts b/x-pack/plugins/monitoring/public/types.ts index f722a08be3866b..da65a3a3d64f16 100644 --- a/x-pack/plugins/monitoring/public/types.ts +++ b/x-pack/plugins/monitoring/public/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { PluginInitializerContext, CoreStart } from 'kibana/public'; +import { PluginInitializerContext, CoreStart, AppMountParameters } from 'kibana/public'; import { NavigationPublicPluginStart as NavigationStart } from '../../../../src/plugins/navigation/public'; import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; import { TriggersAndActionsUIPublicPluginStart } from '../../triggers_actions_ui/public'; @@ -26,4 +26,5 @@ export interface MonitoringStartPluginDependencies { externalConfig: Array<Array<string | number> | Array<string | boolean>>; triggersActionsUi: TriggersAndActionsUIPublicPluginStart; usageCollection: UsageCollectionSetup; + appMountParameters: AppMountParameters; } diff --git a/x-pack/plugins/monitoring/public/views/base_controller.js b/x-pack/plugins/monitoring/public/views/base_controller.js index ce541a1806e55e..dd9898a6e195c2 100644 --- a/x-pack/plugins/monitoring/public/views/base_controller.js +++ b/x-pack/plugins/monitoring/public/views/base_controller.js @@ -16,6 +16,8 @@ import { SetupModeFeature } from '../../common/enums'; import { updateSetupModeData, isSetupModeFeatureEnabled } from '../lib/setup_mode'; import { AlertsContext } from '../alerts/context'; import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { AlertsDropdown } from '../alerts/alerts_dropdown'; +import { HeaderMenuPortal } from '../../../observability/public'; /** * Given a timezone, this function will calculate the offset in milliseconds @@ -246,6 +248,11 @@ export class MonitoringViewBaseController { <KibanaContextProvider services={Legacy.shims.kibanaServices}> <I18nContext> <AlertsContext.Provider value={{ allAlerts: this.alerts }}> + <HeaderMenuPortal + setHeaderActionMenu={Legacy.shims.appMountParameters.setHeaderActionMenu} + > + <AlertsDropdown /> + </HeaderMenuPortal> {!this._isDataInitialized ? ( <PageLoading pageViewTitle={trackPageView ? this.telemetryPageViewTitle : null} /> ) : ( diff --git a/x-pack/plugins/monitoring/public/views/cluster/overview/index.js b/x-pack/plugins/monitoring/public/views/cluster/overview/index.js index 9fc9dd1c6f685b..bf34650bdb700d 100644 --- a/x-pack/plugins/monitoring/public/views/cluster/overview/index.js +++ b/x-pack/plugins/monitoring/public/views/cluster/overview/index.js @@ -16,6 +16,7 @@ import { Overview } from '../../../components/cluster/overview'; import { SetupModeRenderer } from '../../../components/renderers'; import { SetupModeContext } from '../../../components/setup_mode/setup_mode_context'; import { CODE_PATH_ALL } from '../../../../common/constants'; +import { EnableAlertsModal } from '../../../alerts/enable_alerts_modal.tsx'; const CODE_PATHS = [CODE_PATH_ALL]; @@ -82,6 +83,7 @@ uiRoutes.when('/overview', { setupMode={setupMode} showLicenseExpiration={showLicenseExpiration} /> + <EnableAlertsModal /> {bottomBarComponent} </SetupModeContext.Provider> )} diff --git a/x-pack/test/functional/apps/monitoring/beats/beat_detail.js b/x-pack/test/functional/apps/monitoring/beats/beat_detail.js index f3d89ebdeddbdf..35a74a0877aa5c 100644 --- a/x-pack/test/functional/apps/monitoring/beats/beat_detail.js +++ b/x-pack/test/functional/apps/monitoring/beats/beat_detail.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Dec 19, 2017 @ 18:15:09.000', }); + await clusterOverview.closeAlertsModal(); + // go to beats detail await clusterOverview.clickBeatsListing(); expect(await listing.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/beats/cluster.js b/x-pack/test/functional/apps/monitoring/beats/cluster.js index 7f8f1b181b724c..9d291814ae19c9 100644 --- a/x-pack/test/functional/apps/monitoring/beats/cluster.js +++ b/x-pack/test/functional/apps/monitoring/beats/cluster.js @@ -19,6 +19,8 @@ export default function ({ getService, getPageObjects }) { from: 'Dec 19, 2017 @ 17:14:09.000', to: 'Dec 19, 2017 @ 18:15:09.000', }); + + await overview.closeAlertsModal(); }); after(async () => { diff --git a/x-pack/test/functional/apps/monitoring/beats/listing.js b/x-pack/test/functional/apps/monitoring/beats/listing.js index 4030f80f5b8b9f..67dc9181bda395 100644 --- a/x-pack/test/functional/apps/monitoring/beats/listing.js +++ b/x-pack/test/functional/apps/monitoring/beats/listing.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Dec 19, 2017 @ 18:15:09.000', }); + await clusterOverview.closeAlertsModal(); + // go to beats listing await clusterOverview.clickBeatsListing(); expect(await listing.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/beats/overview.js b/x-pack/test/functional/apps/monitoring/beats/overview.js index cf544f5e659fde..7d2eaa0689b23b 100644 --- a/x-pack/test/functional/apps/monitoring/beats/overview.js +++ b/x-pack/test/functional/apps/monitoring/beats/overview.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Dec 19, 2017 @ 18:15:09.000', }); + await clusterOverview.closeAlertsModal(); + // go to beats overview await clusterOverview.clickBeatsOverview(); expect(await overview.isOnOverview()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/cluster/list.js b/x-pack/test/functional/apps/monitoring/cluster/list.js index 98ea3959d6b29e..f88e30f717141e 100644 --- a/x-pack/test/functional/apps/monitoring/cluster/list.js +++ b/x-pack/test/functional/apps/monitoring/cluster/list.js @@ -140,6 +140,7 @@ export default function ({ getService, getPageObjects }) { expect(await clusterOverview.isOnClusterOverview()).to.be(true); expect(await clusterOverview.getClusterName()).to.be('production'); + await PageObjects.monitoring.closeAlertsModal(); await PageObjects.monitoring.clickBreadcrumb('~breadcrumbClusters'); // reset for next test }); diff --git a/x-pack/test/functional/apps/monitoring/cluster/overview.js b/x-pack/test/functional/apps/monitoring/cluster/overview.js index 389c3313d29546..902c82f0881527 100644 --- a/x-pack/test/functional/apps/monitoring/cluster/overview.js +++ b/x-pack/test/functional/apps/monitoring/cluster/overview.js @@ -20,6 +20,8 @@ export default function ({ getService, getPageObjects }) { from: 'Aug 23, 2017 @ 21:29:35.267', to: 'Aug 23, 2017 @ 21:47:25.556', }); + + await overview.closeAlertsModal(); }); after(async () => { @@ -71,6 +73,8 @@ export default function ({ getService, getPageObjects }) { from: 'Aug 29, 2017 @ 17:23:47.528', to: 'Aug 29, 2017 @ 17:25:50.701', }); + + await overview.closeAlertsModal(); }); after(async () => { @@ -117,6 +121,8 @@ export default function ({ getService, getPageObjects }) { from: 'Aug 29, 2017 @ 17:55:43.879', to: 'Aug 29, 2017 @ 18:01:34.958', }); + + await overview.closeAlertsModal(); }); after(async () => { diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail.js b/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail.js index 5ea7904e039a1d..663b05442ba249 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail.js @@ -32,6 +32,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to indices listing await overview.clickEsIndices(); expect(await indicesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail_mb.js b/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail_mb.js index 9d6938fb09c53a..61a84cd60fbe0e 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail_mb.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/index_detail_mb.js @@ -32,6 +32,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to indices listing await overview.clickEsIndices(); expect(await indicesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/indices.js b/x-pack/test/functional/apps/monitoring/elasticsearch/indices.js index 44ded151f0713f..ae35f53350ec96 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/indices.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/indices.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Oct 6, 2017 @ 20:15:30.212', }); + await overview.closeAlertsModal(); + // go to indices listing await overview.clickEsIndices(); expect(await indicesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/indices_mb.js b/x-pack/test/functional/apps/monitoring/elasticsearch/indices_mb.js index 551afbc71b7258..b0c53839fab367 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/indices_mb.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/indices_mb.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Oct 6, 2017 @ 20:15:30.212', }); + await overview.closeAlertsModal(); + // go to indices listing await overview.clickEsIndices(); expect(await indicesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js index 79fb399db8a4ea..6b1658dd9ed0ed 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail.js @@ -27,6 +27,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); @@ -82,6 +84,8 @@ export default function ({ getService, getPageObjects }) { to: 'Oct 6, 2017 @ 20:15:30.212', }); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); @@ -121,6 +125,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js index 342668533e963f..9130ce91e7b4db 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/node_detail_mb.js @@ -27,6 +27,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); @@ -82,6 +84,8 @@ export default function ({ getService, getPageObjects }) { to: 'Oct 6, 2017 @ 20:15:30.212', }); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); @@ -121,6 +125,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/nodes.js b/x-pack/test/functional/apps/monitoring/elasticsearch/nodes.js index 9c03faf72eff1f..d7c4e5dd12f524 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/nodes.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/nodes.js @@ -29,6 +29,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/nodes_mb.js b/x-pack/test/functional/apps/monitoring/elasticsearch/nodes_mb.js index 78462e0d5ec3de..7e9a0fec708241 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/nodes_mb.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/nodes_mb.js @@ -29,6 +29,8 @@ export default function ({ getService, getPageObjects }) { } ); + await overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); @@ -261,6 +263,8 @@ export default function ({ getService, getPageObjects }) { } ); + overview.closeAlertsModal(); + // go to nodes listing await overview.clickEsNodes(); expect(await nodesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/overview.js b/x-pack/test/functional/apps/monitoring/elasticsearch/overview.js index 61c8c6b266b0d4..c539ca0b2623b6 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/overview.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/overview.js @@ -25,6 +25,8 @@ export default function ({ getService, getPageObjects }) { } ); + await clusterOverview.closeAlertsModal(); + // go to overview await clusterOverview.clickEsOverview(); expect(await overview.isOnOverview()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/elasticsearch/overview_mb.js b/x-pack/test/functional/apps/monitoring/elasticsearch/overview_mb.js index 7c279119e65d7c..d93a2c3e77b935 100644 --- a/x-pack/test/functional/apps/monitoring/elasticsearch/overview_mb.js +++ b/x-pack/test/functional/apps/monitoring/elasticsearch/overview_mb.js @@ -25,6 +25,8 @@ export default function ({ getService, getPageObjects }) { } ); + await clusterOverview.closeAlertsModal(); + // go to overview await clusterOverview.clickEsOverview(); expect(await overview.isOnOverview()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/enable_monitoring/index.js b/x-pack/test/functional/apps/monitoring/enable_monitoring/index.js index dca81fd6fc07e5..79bd479c45a177 100644 --- a/x-pack/test/functional/apps/monitoring/enable_monitoring/index.js +++ b/x-pack/test/functional/apps/monitoring/enable_monitoring/index.js @@ -55,6 +55,7 @@ export default function ({ getService, getPageObjects }) { await retry.tryForTime(20000, async () => { // Click the refresh button await testSubjects.click('querySubmitButton'); + await clusterOverview.closeAlertsModal(); expect(await clusterOverview.isOnClusterOverview()).to.be(true); }); }); diff --git a/x-pack/test/functional/apps/monitoring/kibana/instance.js b/x-pack/test/functional/apps/monitoring/kibana/instance.js index 97f73795e44e06..112642bff9b109 100644 --- a/x-pack/test/functional/apps/monitoring/kibana/instance.js +++ b/x-pack/test/functional/apps/monitoring/kibana/instance.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Aug 29, 2017 @ 17:25:44.142', }); + await clusterOverview.closeAlertsModal(); + // go to kibana instance await clusterOverview.clickKibanaInstances(); expect(await instances.isOnInstances()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/kibana/instance_mb.js b/x-pack/test/functional/apps/monitoring/kibana/instance_mb.js index a615ed0cf9d59a..0d993add1020ad 100644 --- a/x-pack/test/functional/apps/monitoring/kibana/instance_mb.js +++ b/x-pack/test/functional/apps/monitoring/kibana/instance_mb.js @@ -25,6 +25,8 @@ export default function ({ getService, getPageObjects }) { } ); + await clusterOverview.closeAlertsModal(); + // go to kibana instance await clusterOverview.clickKibanaInstances(); expect(await instances.isOnInstances()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/kibana/instances.js b/x-pack/test/functional/apps/monitoring/kibana/instances.js index 554c3c3ece0e1e..f2c403578f52a4 100644 --- a/x-pack/test/functional/apps/monitoring/kibana/instances.js +++ b/x-pack/test/functional/apps/monitoring/kibana/instances.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Aug 29, 2017 @ 17:25:44.142', }); + await clusterOverview.closeAlertsModal(); + // go to kibana instances await clusterOverview.clickKibanaInstances(); expect(await instances.isOnInstances()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/kibana/instances_mb.js b/x-pack/test/functional/apps/monitoring/kibana/instances_mb.js index 695ef81bf71fb2..c05366c294e87f 100644 --- a/x-pack/test/functional/apps/monitoring/kibana/instances_mb.js +++ b/x-pack/test/functional/apps/monitoring/kibana/instances_mb.js @@ -26,6 +26,8 @@ export default function ({ getService, getPageObjects }) { } ); + await clusterOverview.closeAlertsModal(); + // go to kibana instances await clusterOverview.clickKibanaInstances(); expect(await instances.isOnInstances()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/kibana/overview.js b/x-pack/test/functional/apps/monitoring/kibana/overview.js index 060c368563a950..a366033e1baf6a 100644 --- a/x-pack/test/functional/apps/monitoring/kibana/overview.js +++ b/x-pack/test/functional/apps/monitoring/kibana/overview.js @@ -22,6 +22,8 @@ export default function ({ getService, getPageObjects }) { to: 'Aug 29, 2017 @ 17:25:44.142', }); + await clusterOverview.closeAlertsModal(); + // go to kibana overview await clusterOverview.clickKibanaOverview(); expect(await overview.isOnOverview()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/kibana/overview_mb.js b/x-pack/test/functional/apps/monitoring/kibana/overview_mb.js index 5f8b926e5d17c8..519903c201474c 100644 --- a/x-pack/test/functional/apps/monitoring/kibana/overview_mb.js +++ b/x-pack/test/functional/apps/monitoring/kibana/overview_mb.js @@ -25,6 +25,8 @@ export default function ({ getService, getPageObjects }) { } ); + await clusterOverview.closeAlertsModal(); + // go to kibana overview await clusterOverview.clickKibanaOverview(); expect(await overview.isOnOverview()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/logstash/pipelines.js b/x-pack/test/functional/apps/monitoring/logstash/pipelines.js index 2f698f83912c11..72a6ff8e1af23f 100644 --- a/x-pack/test/functional/apps/monitoring/logstash/pipelines.js +++ b/x-pack/test/functional/apps/monitoring/logstash/pipelines.js @@ -24,6 +24,8 @@ export default function ({ getService, getPageObjects }) { to: 'Jan 22, 2018 @ 09:41:00.000', }); + await overview.closeAlertsModal(); + // go to pipelines listing await overview.clickLsPipelines(); expect(await pipelinesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/apps/monitoring/logstash/pipelines_mb.js b/x-pack/test/functional/apps/monitoring/logstash/pipelines_mb.js index 508f919d97efde..89afac834414b4 100644 --- a/x-pack/test/functional/apps/monitoring/logstash/pipelines_mb.js +++ b/x-pack/test/functional/apps/monitoring/logstash/pipelines_mb.js @@ -24,6 +24,8 @@ export default function ({ getService, getPageObjects }) { to: 'Jan 22, 2018 @ 09:41:00.000', }); + await overview.closeAlertsModal(); + // go to pipelines listing await overview.clickLsPipelines(); expect(await pipelinesList.isOnListing()).to.be(true); diff --git a/x-pack/test/functional/page_objects/monitoring_page.ts b/x-pack/test/functional/page_objects/monitoring_page.ts index 151b6733509e6a..acd9a443eb7ce3 100644 --- a/x-pack/test/functional/page_objects/monitoring_page.ts +++ b/x-pack/test/functional/page_objects/monitoring_page.ts @@ -16,6 +16,10 @@ export class MonitoringPageObject extends FtrService { return this.testSubjects.getVisibleText('accessDeniedTitle'); } + async closeAlertsModal() { + return this.testSubjects.click('alerts-modal-button'); + } + async clickBreadcrumb(subj: string) { return this.testSubjects.click(subj); } diff --git a/x-pack/test/functional/services/monitoring/cluster_overview.js b/x-pack/test/functional/services/monitoring/cluster_overview.js index 3da0c82c87a63a..5128cbffd34cff 100644 --- a/x-pack/test/functional/services/monitoring/cluster_overview.js +++ b/x-pack/test/functional/services/monitoring/cluster_overview.js @@ -75,6 +75,10 @@ export function MonitoringClusterOverviewProvider({ getService }) { return testSubjects.exists(SUBJ_CLUSTER_ALERTS); } + closeAlertsModal() { + return testSubjects.click('alerts-modal-button'); + } + getEsStatus() { return testSubjects.getVisibleText(SUBJ_ES_STATUS); } From f1719af2d66eba04b80445c633bdb25b34c208c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20FOUCRET?= <aurelien.foucret@elastic.co> Date: Tue, 29 Jun 2021 17:46:43 +0200 Subject: [PATCH 097/227] Fix crawler URL in the landing page. (#103479) --- .../app_search/components/crawler/crawler_landing.test.tsx | 2 +- .../app_search/components/crawler/crawler_landing.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.test.tsx index 045fd9ee7be1b4..9e0379aa1ce278 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.test.tsx @@ -35,6 +35,6 @@ describe('CrawlerLanding', () => { it('contains a link to standalone App Search', () => { const externalDocumentationLink = wrapper.find('[data-test-subj="CrawlerStandaloneLink"]'); - expect(externalDocumentationLink.prop('href')).toBe('/as/engines/some-engine/crawler'); + expect(externalDocumentationLink.prop('href')).toBe('/as#/engines/some-engine/crawler'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.tsx index 91a0a7c5edcc0f..0a53c84525a826 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_landing.tsx @@ -63,7 +63,7 @@ export const CrawlerLanding: React.FC = () => ( iconType="popout" fill color="primary" - href={getAppSearchUrl(generateEnginePath(ENGINE_CRAWLER_PATH))} + href={getAppSearchUrl(`#${generateEnginePath(ENGINE_CRAWLER_PATH)}`)} target="_blank" data-test-subj="CrawlerStandaloneLink" > From cdfc90ca3040c5efd954911b1fc5a14e4a37169b Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Tue, 29 Jun 2021 11:48:11 -0400 Subject: [PATCH 098/227] Removing the title edit icon for read only (#103540) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/components/case_view/index.tsx | 2 +- .../editable_title.test.tsx.snap | 1 - .../header_page/editable_title.test.tsx | 42 +++++++++++++------ .../components/header_page/editable_title.tsx | 11 +++-- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index 0e49173a6b8386..2fffd6464dbb1e 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -381,7 +381,7 @@ export const CaseComponent = React.memo<CaseComponentProps>( data-test-subj="case-view-title" titleNode={ <EditableTitle - disabled={!userCanCrud} + userCanCrud={userCanCrud} isLoading={isLoading && updateKey === 'title'} title={caseData.title} onSubmit={onSubmitTitle} diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap index c8d4b6ec3b4c8d..24b1756aade2e8 100644 --- a/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/editable_title.test.tsx.snap @@ -19,7 +19,6 @@ exports[`EditableTitle it renders 1`] = ` aria-label="You can edit Test title by clicking" data-test-subj="editable-title-edit-icon" iconType="pencil" - isDisabled={false} onClick={[Function]} /> </EuiFlexItem> diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx index 90a10a388d717f..babfeb584677b3 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx @@ -10,25 +10,43 @@ import React from 'react'; import '../../common/mock/match_media'; import { TestProviders } from '../../common/mock'; -import { EditableTitle } from './editable_title'; +import { EditableTitle, EditableTitleProps } from './editable_title'; import { useMountAppended } from '../../utils/use_mount_appended'; describe('EditableTitle', () => { const mount = useMountAppended(); const submitTitle = jest.fn(); + const defaultProps: EditableTitleProps = { + title: 'Test title', + onSubmit: submitTitle, + isLoading: false, + userCanCrud: true, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); test('it renders', () => { - const wrapper = shallow( - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> - ); + const wrapper = shallow(<EditableTitle {...defaultProps} />); expect(wrapper).toMatchSnapshot(); }); + test('it does not show the edit icon when the user does not have edit permissions', () => { + const wrapper = mount( + <TestProviders> + <EditableTitle {...{ ...defaultProps, userCanCrud: false }} /> + </TestProviders> + ); + + expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').exists()).toBeFalsy(); + }); + test('it shows the edit title input field', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); @@ -43,7 +61,7 @@ describe('EditableTitle', () => { test('it shows the submit button', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); @@ -58,7 +76,7 @@ describe('EditableTitle', () => { test('it shows the cancel button', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); @@ -73,7 +91,7 @@ describe('EditableTitle', () => { test('it DOES NOT shows the edit icon when in edit mode', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); @@ -88,7 +106,7 @@ describe('EditableTitle', () => { test('it switch to non edit mode when canceled', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); @@ -104,7 +122,7 @@ describe('EditableTitle', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); @@ -128,7 +146,7 @@ describe('EditableTitle', () => { const wrapper = mount( <TestProviders> - <EditableTitle title={title} onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...{ ...defaultProps, title }} /> </TestProviders> ); @@ -151,7 +169,7 @@ describe('EditableTitle', () => { const wrapper = mount( <TestProviders> - <EditableTitle title="Test title" onSubmit={submitTitle} isLoading={false} /> + <EditableTitle {...defaultProps} /> </TestProviders> ); diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx index b53560db6745b6..c897f8a7bf8322 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx @@ -34,15 +34,15 @@ const MySpinner = styled(EuiLoadingSpinner)` `} `; -interface Props { - disabled?: boolean; +export interface EditableTitleProps { + userCanCrud: boolean; isLoading: boolean; title: string | React.ReactNode; onSubmit: (title: string) => void; } -const EditableTitleComponent: React.FC<Props> = ({ - disabled = false, +const EditableTitleComponent: React.FC<EditableTitleProps> = ({ + userCanCrud = false, onSubmit, isLoading, title, @@ -106,9 +106,8 @@ const EditableTitleComponent: React.FC<Props> = ({ </EuiFlexItem> <EuiFlexItem grow={false}> {isLoading && <MySpinner data-test-subj="editable-title-loading" />} - {!isLoading && ( + {!isLoading && userCanCrud && ( <MyEuiButtonIcon - isDisabled={disabled} aria-label={i18n.EDIT_TITLE_ARIA(title as string)} iconType="pencil" onClick={onClickEditIcon} From 096ee92f3b272473409decd13875b3b11afb30b5 Mon Sep 17 00:00:00 2001 From: Pete Hampton <pjhampton@users.noreply.github.com> Date: Tue, 29 Jun 2021 16:53:11 +0100 Subject: [PATCH 099/227] Remove <7.14 EP Metrics from Security Solution usage collector (#103632) * Remove <7.14 EP Metrics from Security Solution usage collector. * Update telemetry schema. * Fix reworked method signature. --- .../security_solution/server/plugin.ts | 1 - .../server/usage/collector.ts | 63 +-- .../usage/detections/detections.test.ts | 12 +- .../server/usage/detections/index.ts | 8 +- .../server/usage/endpoints/endpoint.mocks.ts | 259 ------------ .../server/usage/endpoints/endpoint.test.ts | 394 ------------------ .../usage/endpoints/fleet_saved_objects.ts | 43 -- .../server/usage/endpoints/index.ts | 284 ------------- .../security_solution/server/usage/types.ts | 2 - .../schema/xpack_plugins.json | 81 +--- 10 files changed, 19 insertions(+), 1128 deletions(-) delete mode 100644 x-pack/plugins/security_solution/server/usage/endpoints/endpoint.mocks.ts delete mode 100644 x-pack/plugins/security_solution/server/usage/endpoints/endpoint.test.ts delete mode 100644 x-pack/plugins/security_solution/server/usage/endpoints/fleet_saved_objects.ts delete mode 100644 x-pack/plugins/security_solution/server/usage/endpoints/index.ts diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 9f8b1923ff5b8a..453e98b020cbea 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -171,7 +171,6 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S initUsageCollectors({ core, - endpointAppContext: endpointContext, kibanaIndex: globalConfig.kibana.index, signalsIndex: config.signalsIndex, ml: plugins.ml, diff --git a/x-pack/plugins/security_solution/server/usage/collector.ts b/x-pack/plugins/security_solution/server/usage/collector.ts index 204da762bba8f0..bb09a2a063d33b 100644 --- a/x-pack/plugins/security_solution/server/usage/collector.ts +++ b/x-pack/plugins/security_solution/server/usage/collector.ts @@ -9,11 +9,9 @@ import { CoreSetup, SavedObjectsClientContract } from '../../../../../src/core/s import { CollectorFetchContext } from '../../../../../src/plugins/usage_collection/server'; import { CollectorDependencies } from './types'; import { fetchDetectionsMetrics } from './detections'; -import { EndpointUsage, getEndpointTelemetryFromFleet } from './endpoints'; export type RegisterCollector = (deps: CollectorDependencies) => void; export interface UsageData { - endpoints: EndpointUsage | {}; detectionMetrics: {}; } @@ -25,7 +23,6 @@ export async function getInternalSavedObjectsClient(core: CoreSetup) { export const registerCollector: RegisterCollector = ({ core, - endpointAppContext, kibanaIndex, signalsIndex, ml, @@ -397,69 +394,15 @@ export const registerCollector: RegisterCollector = ({ }, }, }, - endpoints: { - total_installed: { - type: 'long', - _meta: { description: 'The number of installed endpoints' }, - }, - active_within_last_24_hours: { - type: 'long', - _meta: { description: 'The number of active endpoints' }, - }, - os: { - type: 'array', - items: { - full_name: { - type: 'keyword', - _meta: { description: 'Full name of the operating system' }, - }, - platform: { - type: 'keyword', - _meta: { description: 'OS Platform. eg Centos, Ubuntu' }, - }, - version: { - type: 'keyword', - _meta: { - description: - 'The version of the operating system, eg 16.04.7 LTS (Xenial Xerus), 8 (Core)', - }, - }, - count: { - type: 'long', - _meta: { description: 'The total number of endpoints from that platform' }, - }, - }, - }, - policies: { - malware: { - active: { - type: 'long', - _meta: { description: 'The total number of active malware policies' }, - }, - inactive: { - type: 'long', - _meta: { description: 'The total number of inactive malware policies' }, - }, - failure: { - type: 'long', - _meta: { description: 'The total number of failing malware policies' }, - }, - }, - }, - }, }, isReady: () => true, fetch: async ({ esClient }: CollectorFetchContext): Promise<UsageData> => { const internalSavedObjectsClient = await getInternalSavedObjectsClient(core); - const savedObjectsClient = (internalSavedObjectsClient as unknown) as SavedObjectsClientContract; - const [detectionMetrics, endpoints] = await Promise.allSettled([ - fetchDetectionsMetrics(kibanaIndex, signalsIndex, esClient, ml, savedObjectsClient), - getEndpointTelemetryFromFleet(savedObjectsClient, endpointAppContext, esClient), - ]); + const soClient = (internalSavedObjectsClient as unknown) as SavedObjectsClientContract; return { - detectionMetrics: detectionMetrics.status === 'fulfilled' ? detectionMetrics.value : {}, - endpoints: endpoints.status === 'fulfilled' ? endpoints.value : {}, + detectionMetrics: + (await fetchDetectionsMetrics(kibanaIndex, signalsIndex, esClient, soClient, ml)) || {}, }; }, }); diff --git a/x-pack/plugins/security_solution/server/usage/detections/detections.test.ts b/x-pack/plugins/security_solution/server/usage/detections/detections.test.ts index 7365c210172fe4..ab0267d8b2787c 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/detections.test.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/detections.test.ts @@ -37,7 +37,7 @@ describe('Detections Usage and Metrics', () => { }); it('returns zeroed counts if calls are empty', async () => { - const result = await fetchDetectionsMetrics('', '', esClientMock, mlMock, savedObjectsClient); + const result = await fetchDetectionsMetrics('', '', esClientMock, savedObjectsClient, mlMock); expect(result).toEqual( expect.objectContaining({ @@ -99,7 +99,7 @@ describe('Detections Usage and Metrics', () => { .mockReturnValue({ body: getMockRuleAlertsResponse(3400) }); (savedObjectsClient.find as jest.Mock).mockReturnValue(getMockAlertCasesResponse()); - const result = await fetchDetectionsMetrics('', '', esClientMock, mlMock, savedObjectsClient); + const result = await fetchDetectionsMetrics('', '', esClientMock, savedObjectsClient, mlMock); expect(result).toEqual( expect.objectContaining({ @@ -174,7 +174,7 @@ describe('Detections Usage and Metrics', () => { .mockReturnValue({ body: getMockRuleAlertsResponse(800) }); (savedObjectsClient.find as jest.Mock).mockReturnValue(getMockAlertCasesResponse()); - const result = await fetchDetectionsMetrics('', '', esClientMock, mlMock, savedObjectsClient); + const result = await fetchDetectionsMetrics('', '', esClientMock, savedObjectsClient, mlMock); expect(result).toEqual( expect.objectContaining({ @@ -236,7 +236,7 @@ describe('Detections Usage and Metrics', () => { .mockReturnValue({ body: getMockRuleAlertsResponse(0) }); (savedObjectsClient.find as jest.Mock).mockReturnValue(getMockAlertCasesResponse()); - const result = await fetchDetectionsMetrics('', '', esClientMock, mlMock, savedObjectsClient); + const result = await fetchDetectionsMetrics('', '', esClientMock, savedObjectsClient, mlMock); expect(result).toEqual( expect.objectContaining({ @@ -317,7 +317,7 @@ describe('Detections Usage and Metrics', () => { jobs: null, jobStats: null, } as unknown) as ReturnType<typeof mlMock.anomalyDetectorsProvider>); - const result = await fetchDetectionsMetrics('', '', esClientMock, mlMock, savedObjectsClient); + const result = await fetchDetectionsMetrics('', '', esClientMock, savedObjectsClient, mlMock); expect(result).toEqual( expect.objectContaining({ @@ -347,7 +347,7 @@ describe('Detections Usage and Metrics', () => { datafeedStats: mockDatafeedStatsResponse, } as unknown) as ReturnType<typeof mlMock.anomalyDetectorsProvider>); - const result = await fetchDetectionsMetrics('', '', esClientMock, mlMock, savedObjectsClient); + const result = await fetchDetectionsMetrics('', '', esClientMock, savedObjectsClient, mlMock); expect(result).toEqual( expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/usage/detections/index.ts b/x-pack/plugins/security_solution/server/usage/detections/index.ts index 823e29fd0dd30d..a8d2ead83eec7e 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/index.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/index.ts @@ -20,12 +20,12 @@ export const fetchDetectionsMetrics = async ( kibanaIndex: string, signalsIndex: string, esClient: ElasticsearchClient, - ml: MlPluginSetup | undefined, - savedObjectClient: SavedObjectsClientContract + soClient: SavedObjectsClientContract, + mlClient: MlPluginSetup | undefined ): Promise<DetectionMetrics> => { const [mlJobMetrics, detectionRuleMetrics] = await Promise.allSettled([ - getMlJobMetrics(ml, savedObjectClient), - getDetectionRuleMetrics(kibanaIndex, signalsIndex, esClient, savedObjectClient), + getMlJobMetrics(mlClient, soClient), + getDetectionRuleMetrics(kibanaIndex, signalsIndex, esClient, soClient), ]); return { diff --git a/x-pack/plugins/security_solution/server/usage/endpoints/endpoint.mocks.ts b/x-pack/plugins/security_solution/server/usage/endpoints/endpoint.mocks.ts deleted file mode 100644 index 3458f228a0fdd8..00000000000000 --- a/x-pack/plugins/security_solution/server/usage/endpoints/endpoint.mocks.ts +++ /dev/null @@ -1,259 +0,0 @@ -/* - * 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 { SavedObjectsFindResponse } from 'src/core/server'; - -import { Agent, FLEET_ENDPOINT_PACKAGE } from '../../../../fleet/common'; -import { AGENT_EVENT_SAVED_OBJECT_TYPE } from './fleet_saved_objects'; - -const testAgentId = 'testAgentId'; -const testAgentPolicyId = 'testAgentPolicyId'; -const testHostId = 'randoHostId'; -const testHostName = 'testDesktop'; - -/** Mock OS Platform for endpoint telemetry */ -export const MockOSPlatform = 'somePlatform'; -/** Mock OS Name for endpoint telemetry */ -export const MockOSName = 'somePlatformName'; -/** Mock OS Version for endpoint telemetry */ -export const MockOSVersion = '1'; -/** Mock OS Full Name for endpoint telemetry */ -export const MockOSFullName = 'somePlatformFullName'; - -/** - * - * @param lastCheckIn - the last time the agent checked in. Defaults to current ISO time. - * @description We request the install and OS related telemetry information from the 'fleet-agents' saved objects in ingest_manager. This mocks that response - */ -export const mockFleetObjectsResponse = ( - hasDuplicates = true, - lastCheckIn = new Date().toISOString() -): { agents: Agent[]; total: number; page: number; perPage: number } | undefined => ({ - page: 1, - perPage: 20, - total: 1, - agents: [ - { - active: true, - id: testAgentId, - policy_id: 'randoAgentPolicyId', - type: 'PERMANENT', - user_provided_metadata: {}, - enrolled_at: lastCheckIn, - local_metadata: { - elastic: { - agent: { - id: testAgentId, - }, - }, - host: { - hostname: testHostName, - name: testHostName, - id: testHostId, - }, - os: { - platform: MockOSPlatform, - version: MockOSVersion, - name: MockOSName, - full: MockOSFullName, - }, - }, - packages: [FLEET_ENDPOINT_PACKAGE, 'system'], - last_checkin: lastCheckIn, - }, - { - active: true, - id: 'oldTestAgentId', - policy_id: 'randoAgentPolicyId', - type: 'PERMANENT', - user_provided_metadata: {}, - enrolled_at: lastCheckIn, - local_metadata: { - elastic: { - agent: { - id: 'oldTestAgentId', - }, - }, - host: { - hostname: hasDuplicates ? testHostName : 'oldRandoHostName', - name: hasDuplicates ? testHostName : 'oldRandoHostName', - id: hasDuplicates ? testHostId : 'oldRandoHostId', - }, - os: { - platform: MockOSPlatform, - version: MockOSVersion, - name: MockOSName, - full: MockOSFullName, - }, - }, - packages: [FLEET_ENDPOINT_PACKAGE, 'system'], - last_checkin: lastCheckIn, - }, - ], -}); - -const mockPolicyPayload = ( - policyStatus: 'success' | 'warning' | 'failure', - policyMode: 'prevent' | 'detect' | 'off' = 'prevent' -) => - JSON.stringify({ - 'endpoint-security': { - Endpoint: { - configuration: { - inputs: [ - { - id: '0d466df0-c60f-11ea-a5c5-151665e785c4', - policy: { - linux: { - events: { - file: true, - network: true, - process: true, - }, - logging: { - file: 'info', - }, - }, - mac: { - events: { - file: true, - network: true, - process: true, - }, - logging: { - file: 'info', - }, - malware: { - mode: policyMode, - }, - }, - windows: { - events: { - dll_and_driver_load: true, - dns: true, - file: true, - network: true, - process: true, - registry: true, - security: true, - }, - logging: { - file: 'info', - }, - malware: { - mode: policyMode, - }, - }, - }, - }, - ], - }, - policy: { - applied: { - id: '0d466df0-c60f-11ea-a5c5-151665e785c4', - response: { - configurations: { - malware: { - concerned_actions: [ - 'load_config', - 'workflow', - 'download_global_artifacts', - 'download_user_artifacts', - 'configure_malware', - 'read_malware_config', - 'load_malware_model', - 'read_kernel_config', - 'configure_kernel', - 'detect_process_events', - 'detect_file_write_events', - 'connect_kernel', - 'detect_file_open_events', - 'detect_sync_image_load_events', - ], - status: `${policyStatus}`, - }, - }, - }, - status: `${policyStatus}`, - }, - }, - }, - agent: { - id: 'testAgentId', - version: '8.0.0-SNAPSHOT', - }, - host: { - architecture: 'x86_64', - id: 'a4148b63-1758-ab1f-a6d3-f95075cb1a9c', - os: { - Ext: { - variant: 'Windows 10 Pro', - }, - full: 'Windows 10 Pro 2004 (10.0.19041.329)', - name: 'Windows', - version: '2004 (10.0.19041.329)', - }, - }, - }, - }); - -/** - * - * @param running - allows us to set whether the mocked endpoint is in an active or disabled/failed state - * @param updatedDate - the last time the endpoint was updated. Defaults to current ISO time. - * @description We request the events triggered by the agent and get the most recent endpoint event to confirm it is still running. This allows us to mock both scenarios - */ -export const mockFleetEventsObjectsResponse = ( - running?: boolean, - updatedDate = new Date().toISOString(), - policyStatus: 'success' | 'failure' = running ? 'success' : 'failure', - policyMode: 'prevent' | 'detect' | 'off' = 'prevent' -): SavedObjectsFindResponse => { - return { - page: 1, - per_page: 20, - total: 2, - saved_objects: [ - { - type: AGENT_EVENT_SAVED_OBJECT_TYPE, - id: 'id1', - attributes: { - agent_id: testAgentId, - type: running ? 'STATE' : 'ERROR', - timestamp: updatedDate, - subtype: running ? 'RUNNING' : 'FAILED', - message: `Application: endpoint-security--8.0.0[d8f7f6e8-9375-483c-b456-b479f1d7a4f2]: State changed to ${ - running ? 'RUNNING' : 'FAILED' - }: `, - payload: running ? mockPolicyPayload(policyStatus, policyMode) : undefined, - policy_id: testAgentPolicyId, - }, - references: [], - updated_at: updatedDate, - version: 'WzExOCwxXQ==', - score: 0, - }, - { - type: AGENT_EVENT_SAVED_OBJECT_TYPE, - id: 'id2', - attributes: { - agent_id: testAgentId, - type: 'STATE', - timestamp: updatedDate, - subtype: 'STARTING', - message: - 'Application: endpoint-security--8.0.0[d8f7f6e8-9375-483c-b456-b479f1d7a4f2]: State changed to STARTING: Starting', - policy_id: testAgentPolicyId, - }, - references: [], - updated_at: updatedDate, - version: 'WzExNywxXQ==', - score: 0, - }, - ], - }; -}; diff --git a/x-pack/plugins/security_solution/server/usage/endpoints/endpoint.test.ts b/x-pack/plugins/security_solution/server/usage/endpoints/endpoint.test.ts deleted file mode 100644 index 11e16c2f9e7819..00000000000000 --- a/x-pack/plugins/security_solution/server/usage/endpoints/endpoint.test.ts +++ /dev/null @@ -1,394 +0,0 @@ -/* - * 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 { elasticsearchServiceMock, savedObjectsClientMock } from 'src/core/server/mocks'; -import { - mockFleetObjectsResponse, - mockFleetEventsObjectsResponse, - MockOSFullName, - MockOSPlatform, - MockOSVersion, -} from './endpoint.mocks'; -import { SavedObjectsClientContract, SavedObjectsFindResponse } from 'src/core/server'; -import { Agent } from '../../../../fleet/common'; -import * as endpointTelemetry from './index'; -import * as fleetSavedObjects from './fleet_saved_objects'; -import { createMockEndpointAppContext } from '../../endpoint/mocks'; -import { EndpointAppContext } from '../../endpoint/types'; - -describe('test security solution endpoint telemetry', () => { - let mockSavedObjectsClient: jest.Mocked<SavedObjectsClientContract>; - let mockEndpointAppContext: EndpointAppContext; - let mockEsClient: ReturnType<typeof elasticsearchServiceMock.createElasticsearchClient>; - let getEndpointIntegratedFleetMetadataSpy: jest.SpyInstance< - Promise<{ agents: Agent[]; total: number; page: number; perPage: number } | undefined> - >; - let getLatestFleetEndpointEventSpy: jest.SpyInstance<Promise<SavedObjectsFindResponse>>; - - beforeAll(() => { - getLatestFleetEndpointEventSpy = jest.spyOn(fleetSavedObjects, 'getLatestFleetEndpointEvent'); - getEndpointIntegratedFleetMetadataSpy = jest.spyOn( - fleetSavedObjects, - 'getEndpointIntegratedFleetMetadata' - ); - mockSavedObjectsClient = savedObjectsClientMock.create(); - mockEndpointAppContext = createMockEndpointAppContext(); - mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); - }); - - afterAll(() => { - jest.resetAllMocks(); - }); - - it('should have a default shape', () => { - expect(endpointTelemetry.getDefaultEndpointTelemetry()).toMatchInlineSnapshot(` - Object { - "active_within_last_24_hours": 0, - "os": Array [], - "policies": Object { - "malware": Object { - "active": 0, - "failure": 0, - "inactive": 0, - }, - }, - "total_installed": 0, - } - `); - }); - - describe('when a request for endpoint agents fails', () => { - it('should return an empty object', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.reject(Error('No agents for you')) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(getEndpointIntegratedFleetMetadataSpy).toHaveBeenCalled(); - expect(endpointUsage).toEqual({}); - }); - }); - - describe('when an agent has not been installed', () => { - it('should return the default shape if no agents are found', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve({ agents: [], total: 0, perPage: 0, page: 0 }) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(getEndpointIntegratedFleetMetadataSpy).toHaveBeenCalled(); - expect(endpointUsage).toEqual({ - total_installed: 0, - active_within_last_24_hours: 0, - os: [], - policies: { - malware: { - failure: 0, - active: 0, - inactive: 0, - }, - }, - }); - }); - }); - - describe('when agent(s) have been installed', () => { - describe('when a request for events has failed', () => { - it('should show only one endpoint installed but it is inactive', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse()) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.reject(Error('No events for you')) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 1, - active_within_last_24_hours: 0, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 1, - }, - ], - policies: { - malware: { - failure: 0, - active: 0, - inactive: 0, - }, - }, - }); - }); - }); - - describe('when a request for events is successful', () => { - it('should show one endpoint installed but endpoint has failed to run', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse()) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.resolve(mockFleetEventsObjectsResponse()) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 1, - active_within_last_24_hours: 0, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 1, - }, - ], - policies: { - malware: { - failure: 0, - active: 0, - inactive: 0, - }, - }, - }); - }); - - it('should show two endpoints installed but both endpoints have failed to run', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse(false)) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.resolve(mockFleetEventsObjectsResponse()) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 2, - active_within_last_24_hours: 0, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 2, - }, - ], - policies: { - malware: { - failure: 0, - active: 0, - inactive: 0, - }, - }, - }); - }); - - it('should show two endpoints installed but agents have not checked in within past day', async () => { - const twoDaysAgo = new Date(); - twoDaysAgo.setDate(twoDaysAgo.getDate() - 2); - const twoDaysAgoISOString = twoDaysAgo.toISOString(); - - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse(false, twoDaysAgoISOString)) - ); - getLatestFleetEndpointEventSpy.mockImplementation( - () => Promise.resolve(mockFleetEventsObjectsResponse(true, twoDaysAgoISOString)) // agent_id doesn't matter for mock here - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 2, - active_within_last_24_hours: 0, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 2, - }, - ], - policies: { - malware: { - failure: 0, - active: 2, - inactive: 0, - }, - }, - }); - }); - - it('should show one endpoint installed and endpoint is running', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse()) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.resolve(mockFleetEventsObjectsResponse(true)) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 1, - active_within_last_24_hours: 1, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 1, - }, - ], - policies: { - malware: { - failure: 0, - active: 1, - inactive: 0, - }, - }, - }); - }); - - describe('malware policy', () => { - it('should have failed to enable', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse()) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.resolve( - mockFleetEventsObjectsResponse(true, new Date().toISOString(), 'failure') - ) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 1, - active_within_last_24_hours: 1, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 1, - }, - ], - policies: { - malware: { - failure: 1, - active: 0, - inactive: 0, - }, - }, - }); - }); - - it('should be enabled successfully', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse()) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.resolve(mockFleetEventsObjectsResponse(true)) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 1, - active_within_last_24_hours: 1, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 1, - }, - ], - policies: { - malware: { - failure: 0, - active: 1, - inactive: 0, - }, - }, - }); - }); - - it('should be disabled successfully', async () => { - getEndpointIntegratedFleetMetadataSpy.mockImplementation(() => - Promise.resolve(mockFleetObjectsResponse()) - ); - getLatestFleetEndpointEventSpy.mockImplementation(() => - Promise.resolve( - mockFleetEventsObjectsResponse(true, new Date().toISOString(), 'success', 'off') - ) - ); - - const endpointUsage = await endpointTelemetry.getEndpointTelemetryFromFleet( - mockSavedObjectsClient, - mockEndpointAppContext, - mockEsClient - ); - expect(endpointUsage).toEqual({ - total_installed: 1, - active_within_last_24_hours: 1, - os: [ - { - full_name: MockOSFullName, - platform: MockOSPlatform, - version: MockOSVersion, - count: 1, - }, - ], - policies: { - malware: { - failure: 0, - active: 0, - inactive: 1, - }, - }, - }); - }); - }); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/usage/endpoints/fleet_saved_objects.ts b/x-pack/plugins/security_solution/server/usage/endpoints/fleet_saved_objects.ts deleted file mode 100644 index d477a0f59f71f4..00000000000000 --- a/x-pack/plugins/security_solution/server/usage/endpoints/fleet_saved_objects.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 { - ElasticsearchClient, - SavedObjectsClientContract, - SavedObjectsFindResponse, -} from 'src/core/server'; -import { AgentService } from '../../../../fleet/server'; -import { FLEET_ENDPOINT_PACKAGE } from '../../../../fleet/common'; - -export const AGENT_EVENT_SAVED_OBJECT_TYPE = 'donotexistsanymore-since-7.13'; - -export const getEndpointIntegratedFleetMetadata = async ( - agentService: AgentService | undefined, - esClient: ElasticsearchClient -) => { - return agentService?.listAgents(esClient, { - kuery: `(packages : ${FLEET_ENDPOINT_PACKAGE})`, - perPage: 10000, - showInactive: false, - sortField: 'enrolled_at', - sortOrder: 'desc', - }); -}; - -/* - TODO: AS OF 7.13, this access will no longer work due to the enabling of fleet server. An alternative route will have - to be discussed to retrieve the policy data we need, as well as when the endpoint was last active, which is obtained - via the last endpoint 'check in' event that was sent to fleet. Also, the only policy currently tracked is `malware`, - but the hope is to add more, so a better/more scalable solution would be desirable. -*/ - -export const getLatestFleetEndpointEvent = async ( - savedObjectsClient: SavedObjectsClientContract, - agentId: string -): Promise<SavedObjectsFindResponse> => - // Agent events saved object do not exists in Fleet anymore - ({ total: 0, saved_objects: [], page: 0, per_page: 0 }); diff --git a/x-pack/plugins/security_solution/server/usage/endpoints/index.ts b/x-pack/plugins/security_solution/server/usage/endpoints/index.ts deleted file mode 100644 index ed8db14e466055..00000000000000 --- a/x-pack/plugins/security_solution/server/usage/endpoints/index.ts +++ /dev/null @@ -1,284 +0,0 @@ -/* - * 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 { cloneDeep } from 'lodash'; -import { ElasticsearchClient, SavedObjectsClientContract } from 'src/core/server'; -import { SavedObject } from './../../../../../../src/core/types/saved_objects'; -import { Agent } from './../../../../fleet/common/types/models/agent'; -import { AgentMetadata } from '../../../../fleet/common/types/models/agent'; -import { - getEndpointIntegratedFleetMetadata, - getLatestFleetEndpointEvent, -} from './fleet_saved_objects'; -import { EndpointAppContext } from '../../endpoint/types'; - -export interface AgentOSMetadataTelemetry { - full_name: string; - platform: string; - version: string; - count: number; -} -export interface PolicyTelemetry { - active: number; - inactive: number; - failure: number; -} - -export interface PoliciesTelemetry { - malware: PolicyTelemetry; -} - -export interface EndpointUsage { - total_installed: number; - active_within_last_24_hours: number; - os: AgentOSMetadataTelemetry[]; - policies: PoliciesTelemetry; -} - -type EndpointOSNames = 'Linux' | 'Windows' | 'macOS'; - -export interface AgentLocalMetadata extends AgentMetadata { - elastic: { - agent: { - id: string; - }; - }; - host: { - hostname: string; - id: string; - name: string; - }; - os: { - name: string; - platform: string; - version: string; - full: string; - }; -} - -type OSTracker = Record<string, AgentOSMetadataTelemetry>; - -/** - * @description returns an empty telemetry object to be incrmented and updated within the `getEndpointTelemetryFromFleet` fn - */ -export const getDefaultEndpointTelemetry = (): EndpointUsage => ({ - total_installed: 0, - active_within_last_24_hours: 0, - os: [], - policies: { - malware: { - active: 0, - inactive: 0, - failure: 0, - }, - }, -}); - -/** - * @description this function updates the os telemetry. We use the fullName field as the key as it contains the name and version details. - * If it has already been tracked, the count will be updated, otherwise a tracker will be initialized for that fullName. - */ -export const updateEndpointOSTelemetry = ( - os: AgentLocalMetadata['os'], - osTracker: OSTracker -): OSTracker => { - let updatedOSTracker = osTracker; - if (os && typeof os === 'object') { - updatedOSTracker = cloneDeep(osTracker); - const { version: osVersion, platform: osPlatform, full: osFullName } = os; - if (osFullName && osVersion) { - if (updatedOSTracker[osFullName]) updatedOSTracker[osFullName].count += 1; - else { - updatedOSTracker[osFullName] = { - full_name: osFullName, - platform: osPlatform, - version: osVersion, - count: 1, - }; - } - } - } - - return updatedOSTracker; -}; - -/** - * @description we take the latest endpoint specific agent event, get the status of the endpoint, and if it is running - * and the agent itself has been active within the last 24 hours, we can safely assume the endpoint has been active within - * the same time span. - */ -export const updateEndpointDailyActiveCount = ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - latestEndpointEvent: SavedObject<any>, // TODO: This information will be lost in 7.13, need to find an alternative route. - lastAgentCheckin: Agent['last_checkin'], - currentCount: number -) => { - const aDayAgo = new Date(); - aDayAgo.setDate(aDayAgo.getDate() - 1); - - const agentWasActiveOverLastDay = !!lastAgentCheckin && new Date(lastAgentCheckin) > aDayAgo; - return agentWasActiveOverLastDay && latestEndpointEvent.attributes.subtype === 'RUNNING' - ? currentCount + 1 - : currentCount; -}; - -/** - * @description We take the latest endpoint specific agent event, and as long as it provides the payload with policy details, we will parse that policy - * to populate the success of it's application. The policy is provided in the agent health checks. - */ -export const updateEndpointPolicyTelemetry = ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - latestEndpointEvent: SavedObject<any>, - policiesTracker: PoliciesTelemetry -): PoliciesTelemetry => { - const policyHostTypeToPolicyType = { - Linux: 'linux', - macOS: 'mac', - Windows: 'windows', - }; - const enabledMalwarePolicyTypes = ['prevent', 'detect']; - - // The policy details are sent as a string on the 'payload' attribute of the agent event - const { payload } = latestEndpointEvent.attributes; - - if (!payload) { - // This payload may not always be provided depending on the state of the endpoint. Guard again situations where it is not sent - return policiesTracker; - } - - let endpointPolicyPayload; - try { - endpointPolicyPayload = JSON.parse(latestEndpointEvent.attributes.payload); - } catch (error) { - return policiesTracker; - } - - // Get the platform: windows, mac, or linux - const hostType = - policyHostTypeToPolicyType[ - endpointPolicyPayload['endpoint-security']?.host?.os?.name as EndpointOSNames - ]; - // Get whether the malware setting for the platform on the most recently provided config is active (prevent or detect is on) or off - const userDesiredMalwareState = - endpointPolicyPayload['endpoint-security'].Endpoint?.configuration?.inputs[0]?.policy[hostType] - ?.malware?.mode; - - // Get the status of the application of the malware protection - const malwareStatus = - endpointPolicyPayload['endpoint-security'].Endpoint?.policy?.applied?.response?.configurations - ?.malware?.status; - - if (!userDesiredMalwareState || !malwareStatus) { - // If we get policy information without the mode or status, then nothing to track or update - return policiesTracker; - } - - const updatedPoliciesTracker = { - malware: { ...policiesTracker.malware }, - }; - - const isAnActiveMalwareState = enabledMalwarePolicyTypes.includes(userDesiredMalwareState); - - // we only check for 'not failure' as the 'warning' state for malware is still technically actively enabled (with warnings) - const successfullyEnabled = !!malwareStatus && malwareStatus !== 'failure'; - const failedToEnable = !!malwareStatus && malwareStatus === 'failure'; - - if (isAnActiveMalwareState && successfullyEnabled) { - updatedPoliciesTracker.malware.active += 1; - } else if (!isAnActiveMalwareState && successfullyEnabled) { - updatedPoliciesTracker.malware.inactive += 1; - } else if (isAnActiveMalwareState && failedToEnable) { - updatedPoliciesTracker.malware.failure += 1; - } - - return updatedPoliciesTracker; -}; - -/** - * @description This aggregates the telemetry details from the fleet agent service `listAgents` and the fleet saved object `fleet-agent-events` to populate - * the telemetry details for endpoint. Since we cannot access our own indices due to `kibana_system` not having access, this is the best alternative. - * Once the data is requested, we iterate over all agents with endpoints registered, and then request the events for each active agent (within last 24 hours) - * to confirm whether or not the endpoint is still active - */ -export const getEndpointTelemetryFromFleet = async ( - soClient: SavedObjectsClientContract, - endpointAppContext: EndpointAppContext, - esClient: ElasticsearchClient -): Promise<EndpointUsage | {}> => { - // Retrieve every agent (max 10000) that references the endpoint as an installed package. It will not be listed if it was never installed - let endpointAgents; - const agentService = endpointAppContext.service.getAgentService(); - try { - const response = await getEndpointIntegratedFleetMetadata(agentService, esClient); - endpointAgents = response?.agents ?? []; - } catch (error) { - // Better to provide an empty object rather than default telemetry as this better informs us of an error - return {}; - } - - const endpointAgentsCount = endpointAgents.length; - const endpointTelemetry = getDefaultEndpointTelemetry(); - - // If there are no installed endpoints return the default telemetry object - if (!endpointAgents || endpointAgentsCount < 1) return endpointTelemetry; - - // Use unique hosts to prevent any potential duplicates - const uniqueHosts: Set<string> = new Set(); - let osTracker: OSTracker = {}; - let dailyActiveCount = 0; - let policyTracker: PoliciesTelemetry = { malware: { active: 0, inactive: 0, failure: 0 } }; - - for (let i = 0; i < endpointAgentsCount; i += 1) { - try { - const { last_checkin: lastCheckin, local_metadata: localMetadata } = endpointAgents[i]; - const { host, os, elastic } = localMetadata as AgentLocalMetadata; - - // Although not perfect, the goal is to dedupe hosts to get the most recent data for a host - // An agent re-installed on the same host will have the same id and hostname - // A cloned VM will have the same id, but "may" have the same hostname, but it's really up to the user. - const compoundUniqueId = `${host?.id}-${host?.hostname}`; - if (!uniqueHosts.has(compoundUniqueId)) { - uniqueHosts.add(compoundUniqueId); - const agentId = elastic?.agent?.id; - osTracker = updateEndpointOSTelemetry(os, osTracker); - - if (agentId) { - const { saved_objects: agentEvents } = await getLatestFleetEndpointEvent( - soClient, - agentId - ); - - // AgentEvents will have a max length of 1 - if (agentEvents && agentEvents.length > 0) { - const latestEndpointEvent = agentEvents[0]; - dailyActiveCount = updateEndpointDailyActiveCount( - latestEndpointEvent, - lastCheckin, - dailyActiveCount - ); - policyTracker = updateEndpointPolicyTelemetry(latestEndpointEvent, policyTracker); - } - } - } - } catch (error) { - // All errors thrown in the loop would be handled here - // Not logging any errors to avoid leaking any potential PII - // Depending on when the error is thrown in the loop some specifics may be missing, but it allows the loop to continue - } - } - - // All unique hosts with an endpoint installed, thus all unique endpoint installs - endpointTelemetry.total_installed = uniqueHosts.size; - // Set the daily active count for the endpoints - endpointTelemetry.active_within_last_24_hours = dailyActiveCount; - // Get the objects to populate our OS Telemetry - endpointTelemetry.os = Object.values(osTracker); - // Provide the updated policy information - endpointTelemetry.policies = policyTracker; - - return endpointTelemetry; -}; diff --git a/x-pack/plugins/security_solution/server/usage/types.ts b/x-pack/plugins/security_solution/server/usage/types.ts index 4e1e647952a72b..1a3b5d1e2e29fd 100644 --- a/x-pack/plugins/security_solution/server/usage/types.ts +++ b/x-pack/plugins/security_solution/server/usage/types.ts @@ -6,12 +6,10 @@ */ import { CoreSetup } from 'src/core/server'; -import { EndpointAppContext } from '../endpoint/types'; import { SetupPlugins } from '../plugin'; export type CollectorDependencies = { kibanaIndex: string; signalsIndex: string; core: CoreSetup; - endpointAppContext: EndpointAppContext; } & Pick<SetupPlugins, 'ml' | 'usageCollection'>; diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 89925786636da7..34f191f58f1d34 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -2192,7 +2192,9 @@ }, "open_formula_popover": { "type": "long", - "_meta": { "description": "Number of times the user opened the in-product formula help popover." } + "_meta": { + "description": "Number of times the user opened the in-product formula help popover." + } }, "toggle_fullscreen_formula": { "type": "long", @@ -2431,7 +2433,9 @@ }, "open_formula_popover": { "type": "long", - "_meta": { "description": "Number of times the user opened the in-product formula help popover." } + "_meta": { + "description": "Number of times the user opened the in-product formula help popover." + } }, "toggle_fullscreen_formula": { "type": "long", @@ -5429,79 +5433,6 @@ } } } - }, - "endpoints": { - "properties": { - "total_installed": { - "type": "long", - "_meta": { - "description": "The number of installed endpoints" - } - }, - "active_within_last_24_hours": { - "type": "long", - "_meta": { - "description": "The number of active endpoints" - } - }, - "os": { - "type": "array", - "items": { - "properties": { - "full_name": { - "type": "keyword", - "_meta": { - "description": "Full name of the operating system" - } - }, - "platform": { - "type": "keyword", - "_meta": { - "description": "OS Platform. eg Centos, Ubuntu" - } - }, - "version": { - "type": "keyword", - "_meta": { - "description": "The version of the operating system, eg 16.04.7 LTS (Xenial Xerus), 8 (Core)" - } - }, - "count": { - "type": "long", - "_meta": { - "description": "The total number of endpoints from that platform" - } - } - } - } - }, - "policies": { - "properties": { - "malware": { - "properties": { - "active": { - "type": "long", - "_meta": { - "description": "The total number of active malware policies" - } - }, - "inactive": { - "type": "long", - "_meta": { - "description": "The total number of inactive malware policies" - } - }, - "failure": { - "type": "long", - "_meta": { - "description": "The total number of failing malware policies" - } - } - } - } - } - } - } } } }, From 06eb881781474a095b018c84d84c811079418a27 Mon Sep 17 00:00:00 2001 From: Annalisa Valente <annalisa.adv@gmail.com> Date: Tue, 29 Jun 2021 17:00:43 +0100 Subject: [PATCH 100/227] [Uptime][User Experience] Updating labels in sidenav (#103336) * [Uptime][User Experience] Updating labels in sidenav * Updating translations script Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/apm/public/plugin.ts | 2 +- x-pack/plugins/uptime/public/apps/plugin.ts | 2 +- x-pack/plugins/uptime/public/routes.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/apm/public/plugin.ts b/x-pack/plugins/apm/public/plugin.ts index 0f0d0727990612..46cbc26a74d2d1 100644 --- a/x-pack/plugins/apm/public/plugin.ts +++ b/x-pack/plugins/apm/public/plugin.ts @@ -121,7 +121,7 @@ export class ApmPlugin implements Plugin<ApmPluginSetup, ApmPluginStart> { entries: [ { label: i18n.translate('xpack.apm.ux.overview.heading', { - defaultMessage: 'Overview', + defaultMessage: 'Dashboard', }), app: 'ux', path: '/', diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/uptime/public/apps/plugin.ts index 01fa320bbc789c..63d32948388d73 100644 --- a/x-pack/plugins/uptime/public/apps/plugin.ts +++ b/x-pack/plugins/uptime/public/apps/plugin.ts @@ -115,7 +115,7 @@ export class UptimePlugin entries: [ { label: i18n.translate('xpack.uptime.overview.heading', { - defaultMessage: 'Monitoring overview', + defaultMessage: 'Monitors', }), app: 'uptime', path: '/', diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index 192b5552fea40a..e3c558cee2c320 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -42,7 +42,7 @@ interface RouteProps { const baseTitle = 'Uptime - Kibana'; export const MONITORING_OVERVIEW_LABEL = i18n.translate('xpack.uptime.overview.heading', { - defaultMessage: 'Monitoring overview', + defaultMessage: 'Monitors', }); const Routes: RouteProps[] = [ From bfd801078f6b7f9624c3c6e8adcd46a1f3259137 Mon Sep 17 00:00:00 2001 From: Oliver Gupte <ogupte@users.noreply.github.com> Date: Tue, 29 Jun 2021 12:03:54 -0400 Subject: [PATCH 101/227] [APM] Migrate to data streams - Fleet on Cloud (#102682) * [APM] Adds migration to fleet-managed APM server in APM UI Settings (#100657) * adds useStrictParams option to apm server routes to allow unknown record type in param.bopy * Adds checks for required roles, policies, and config before allowing user to initiate migration * refactored and cleaned up server-side code * i18n and link to Fleet * fixes linting issues and unit tests * updates the apm package policy to 0.3.0 and adds some missing config mappings * PR feedback * Handles case where the cloud policy doesn't exist * Reverts the addition of the useStrictParams option since strictKeysRt now supports records * fixes default input var values and uses correct published package version * displays reasons the switch to data streams is disabled * Store apm-server schema with the internal saved objects client --- .../apm/common/apm_saved_object_constants.ts | 4 + .../Settings/schema/blog-rocket-720x420.png | Bin 0 -> 116012 bytes .../Settings/schema/confirm_switch_modal.tsx | 143 +++++++ .../components/app/Settings/schema/index.tsx | 137 +++++++ .../app/Settings/schema/schema_overview.tsx | 355 ++++++++++++++++++ .../components/routing/apm_route_config.tsx | 19 + .../routing/templates/settings_template.tsx | 10 +- .../shared/Links/ElasticDocsLink.tsx | 10 +- .../public/components/shared/Links/kibana.ts | 9 + x-pack/plugins/apm/server/index.test.ts | 6 +- x-pack/plugins/apm/server/index.ts | 6 + .../fleet/create_cloud_apm_package_policy.ts | 50 +++ .../get_apm_package_policy_definition.ts | 176 +++++++++ .../lib/fleet/get_cloud_apm_package_policy.ts | 44 +++ .../get_unsupported_apm_server_schema.ts | 30 ++ .../apm/server/lib/fleet/is_superuser.ts | 20 + x-pack/plugins/apm/server/plugin.ts | 3 +- x-pack/plugins/apm/server/routes/fleet.ts | 137 ++++++- .../get_global_apm_server_route_repository.ts | 4 +- .../saved_objects/apm_server_settings.ts | 32 ++ .../plugins/apm/server/saved_objects/index.ts | 1 + 21 files changed, 1179 insertions(+), 17 deletions(-) create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/blog-rocket-720x420.png create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx create mode 100644 x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx create mode 100644 x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts create mode 100644 x-pack/plugins/apm/server/lib/fleet/is_superuser.ts create mode 100644 x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts diff --git a/x-pack/plugins/apm/common/apm_saved_object_constants.ts b/x-pack/plugins/apm/common/apm_saved_object_constants.ts index c8e8f893ad3ec3..7d9e571242afef 100644 --- a/x-pack/plugins/apm/common/apm_saved_object_constants.ts +++ b/x-pack/plugins/apm/common/apm_saved_object_constants.ts @@ -15,3 +15,7 @@ export const APM_INDICES_SAVED_OBJECT_ID = 'apm-indices'; // APM telemetry export const APM_TELEMETRY_SAVED_OBJECT_TYPE = 'apm-telemetry'; export const APM_TELEMETRY_SAVED_OBJECT_ID = 'apm-telemetry'; + +// APM Server schema +export const APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE = 'apm-server-schema'; +export const APM_SERVER_SCHEMA_SAVED_OBJECT_ID = 'apm-server-schema'; diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/blog-rocket-720x420.png b/x-pack/plugins/apm/public/components/app/Settings/schema/blog-rocket-720x420.png new file mode 100644 index 0000000000000000000000000000000000000000..c444e7641e3fb1e93e52fad27795425196390766 GIT binary patch literal 116012 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 literal 0 HcmV?d00001 diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx new file mode 100644 index 00000000000000..47e83fa079e638 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/confirm_switch_modal.tsx @@ -0,0 +1,143 @@ +/* + * 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, { useState } from 'react'; +import { + EuiConfirmModal, + EuiCallOut, + EuiCheckbox, + EuiSpacer, + EuiCodeBlock, + htmlIdGenerator, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ElasticDocsLink } from '../../../shared/Links/ElasticDocsLink'; + +interface Props { + onConfirm: () => void; + onCancel: () => void; + unsupportedConfigs: Array<{ key: string; value: string }>; + isLoading: boolean; +} +export function ConfirmSwitchModal({ + onConfirm, + onCancel, + unsupportedConfigs, + isLoading, +}: Props) { + const [isConfirmChecked, setIsConfirmChecked] = useState(false); + const hasUnsupportedConfigs = !!unsupportedConfigs.length; + return ( + <EuiConfirmModal + title={i18n.translate('xpack.apm.settings.schema.confirm.title', { + defaultMessage: 'Please confirm your choice', + })} + cancelButtonText={i18n.translate( + 'xpack.apm.settings.schema.confirm.cancelText', + { + defaultMessage: 'Cancel', + } + )} + onCancel={onCancel} + confirmButtonText={i18n.translate( + 'xpack.apm.settings.schema.confirm.switchButtonText', + { + defaultMessage: 'Switch to data streams', + } + )} + defaultFocusedButton="confirm" + onConfirm={onConfirm} + confirmButtonDisabled={!isConfirmChecked} + isLoading={isLoading} + > + <p> + {i18n.translate('xpack.apm.settings.schema.confirm.descriptionText', { + defaultMessage: + 'If you have custom dashboards, machine learning jobs, or source maps that use classic APM indices, you must reconfigure them for data streams. Stack monitoring is not currently supported with Fleet-managed APM.', + })} + </p> + {!hasUnsupportedConfigs && ( + <p> + {i18n.translate( + 'xpack.apm.settings.schema.confirm.unsupportedConfigs.descriptionText', + { + defaultMessage: `Compatible custom apm-server.yml user settings will be moved to Fleet Server settings for you. We'll let you know which settings are incompatible before removing them.`, + } + )} + </p> + )} + <EuiCallOut + title={i18n.translate( + 'xpack.apm.settings.schema.confirm.irreversibleWarning.title', + { + defaultMessage: `Switching to data streams is an irreversible action`, + } + )} + color="warning" + iconType="help" + > + <p> + {i18n.translate( + 'xpack.apm.settings.schema.confirm.irreversibleWarning.message', + { + defaultMessage: `It might temporarily affect your APM data collection while the migration is in progress. The process of migrating should only take a few minutes.`, + } + )} + </p> + </EuiCallOut> + <EuiSpacer size="m" /> + {hasUnsupportedConfigs && ( + <> + <EuiCallOut + title={i18n.translate( + 'xpack.apm.settings.schema.confirm.unsupportedConfigs.title', + { + defaultMessage: `The following apm-server.yml user settings are incompatible and will be removed`, + } + )} + iconType="iInCircle" + > + <EuiCodeBlock language="yaml"> + {unsupportedConfigs + .map(({ key, value }) => `${key}: ${JSON.stringify(value)}`) + .join('\n')} + </EuiCodeBlock> + <p> + <ElasticDocsLink + section="/cloud" + path="/ec-manage-apm-settings.html" + target="_blank" + > + {i18n.translate( + 'xpack.apm.settings.schema.confirm.apmServerSettingsCloudLinkText', + { defaultMessage: 'Go to APM Server settings in Cloud' } + )} + </ElasticDocsLink> + </p> + </EuiCallOut> + <EuiSpacer size="m" /> + </> + )} + <p> + <EuiCheckbox + id={htmlIdGenerator()()} + label={i18n.translate( + 'xpack.apm.settings.schema.confirm.checkboxLabel', + { + defaultMessage: `I confirm that I wish to switch to data streams`, + } + )} + checked={isConfirmChecked} + onChange={(e) => { + setIsConfirmChecked(e.target.checked); + }} + disabled={isLoading} + /> + </p> + </EuiConfirmModal> + ); +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx new file mode 100644 index 00000000000000..fee072470f05a3 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx @@ -0,0 +1,137 @@ +/* + * 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, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { NotificationsStart } from 'kibana/public'; +import { SchemaOverview } from './schema_overview'; +import { ConfirmSwitchModal } from './confirm_switch_modal'; +import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; +import { + callApmApi, + APIReturnType, +} from '../../../../services/rest/createCallApmApi'; +import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; + +type FleetMigrationCheckResponse = APIReturnType<'GET /api/apm/fleet/migration_check'>; + +export function Schema() { + const { toasts } = useApmPluginContext().core.notifications; + const [isSwitchActive, setIsSwitchActive] = useState(false); + const [isLoadingMigration, setIsLoadingMigration] = useState(false); + const [isLoadingConfirmation, setIsLoadingConfirmation] = useState(false); + const [unsupportedConfigs, setUnsupportedConfigs] = useState< + Array<{ key: string; value: any }> + >([]); + + const { + refetch, + data = {} as FleetMigrationCheckResponse, + status, + } = useFetcher( + (callApi) => callApi({ endpoint: 'GET /api/apm/fleet/migration_check' }), + [], + { preservePreviousData: false } + ); + const isLoading = status !== FETCH_STATUS.SUCCESS; + const cloudApmMigrationEnabled = !!data.cloud_apm_migration_enabled; + const hasCloudAgentPolicy = !!data.has_cloud_agent_policy; + const hasCloudApmPackagePolicy = !!data.has_cloud_apm_package_policy; + const hasRequiredRole = !!data.has_required_role; + return ( + <> + <SchemaOverview + onSwitch={async () => { + setIsLoadingConfirmation(true); + const unsupported = await getUnsupportedApmServerConfigs(toasts); + if (!unsupported) { + setIsLoadingConfirmation(false); + return; + } + setUnsupportedConfigs(unsupported); + setIsLoadingConfirmation(false); + setIsSwitchActive(true); + }} + isMigrated={hasCloudApmPackagePolicy} + isLoading={isLoading} + isLoadingConfirmation={isLoadingConfirmation} + cloudApmMigrationEnabled={cloudApmMigrationEnabled} + hasCloudAgentPolicy={hasCloudAgentPolicy} + hasRequiredRole={hasRequiredRole} + /> + {isSwitchActive && ( + <ConfirmSwitchModal + isLoading={isLoadingMigration} + onConfirm={async () => { + setIsLoadingMigration(true); + const apmPackagePolicy = await createCloudApmPackagePolicy(toasts); + if (!apmPackagePolicy) { + setIsLoadingMigration(false); + return; + } + setIsSwitchActive(false); + refetch(); + }} + onCancel={() => { + if (isLoadingMigration) { + return; + } + setIsSwitchActive(false); + }} + unsupportedConfigs={unsupportedConfigs} + /> + )} + </> + ); +} + +async function getUnsupportedApmServerConfigs( + toasts: NotificationsStart['toasts'] +) { + try { + const { unsupported } = await callApmApi({ + endpoint: 'GET /api/apm/fleet/apm_server_schema/unsupported', + signal: null, + }); + return unsupported; + } catch (error) { + toasts.addDanger({ + title: i18n.translate( + 'xpack.apm.settings.unsupportedConfigs.errorToast.title', + { + defaultMessage: 'Unable to fetch APM Server settings', + } + ), + text: error.body?.message || error.message, + }); + } +} + +async function createCloudApmPackagePolicy( + toasts: NotificationsStart['toasts'] +) { + try { + const { + cloud_apm_package_policy: cloudApmPackagePolicy, + } = await callApmApi({ + endpoint: 'POST /api/apm/fleet/cloud_apm_package_policy', + signal: null, + }); + return cloudApmPackagePolicy; + } catch (error) { + toasts.addDanger({ + title: i18n.translate( + 'xpack.apm.settings.createApmPackagePolicy.errorToast.title', + { + defaultMessage: + 'Unable to create APM package policy on cloud agent policy', + } + ), + text: error.body?.message || error.message, + }); + } +} diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx new file mode 100644 index 00000000000000..1005c09cb11b0d --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/schema_overview.tsx @@ -0,0 +1,355 @@ +/* + * 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 { + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, + EuiText, + EuiCard, + EuiIcon, + EuiButton, + EuiCallOut, + EuiLoadingSpinner, + EuiToolTip, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { ElasticDocsLink } from '../../../shared/Links/ElasticDocsLink'; +import rocketLaunchGraphic from './blog-rocket-720x420.png'; +import { APMLink } from '../../../shared/Links/apm/APMLink'; +import { useFleetCloudAgentPolicyHref } from '../../../shared/Links/kibana'; + +interface Props { + onSwitch: () => void; + isMigrated: boolean; + isLoading: boolean; + isLoadingConfirmation: boolean; + cloudApmMigrationEnabled: boolean; + hasCloudAgentPolicy: boolean; + hasRequiredRole: boolean; +} +export function SchemaOverview({ + onSwitch, + isMigrated, + isLoading, + isLoadingConfirmation, + cloudApmMigrationEnabled, + hasCloudAgentPolicy, + hasRequiredRole, +}: Props) { + const fleetCloudAgentPolicyHref = useFleetCloudAgentPolicyHref(); + const isDisabled = + !cloudApmMigrationEnabled || !hasCloudAgentPolicy || !hasRequiredRole; + + if (isLoading) { + return ( + <> + <SchemaOverviewHeading /> + <EuiFlexGroup justifyContent="center"> + <EuiLoadingSpinner size="xl" /> + </EuiFlexGroup> + </> + ); + } + + if (isMigrated) { + return ( + <> + <SchemaOverviewHeading /> + <EuiFlexGroup justifyContent="center"> + <EuiFlexItem /> + <EuiFlexItem grow={2}> + <EuiCard + icon={ + <EuiIcon + size="xxl" + type="checkInCircleFilled" + color="success" + /> + } + title={i18n.translate('xpack.apm.settings.schema.success.title', { + defaultMessage: 'Data streams successfully setup!', + })} + description={i18n.translate( + 'xpack.apm.settings.schema.success.description', + { + defaultMessage: + 'Your APM integration is now setup and ready to receive data from your currently instrumented agents. Feel free to review the policies applied to your integtration.', + } + )} + footer={ + <div> + <EuiButton href={fleetCloudAgentPolicyHref}> + {i18n.translate( + 'xpack.apm.settings.schema.success.viewIntegrationInFleet.buttonText', + { defaultMessage: 'View the APM integration in Fleet' } + )} + </EuiButton> + <EuiSpacer size="xs" /> + <EuiText size="s"> + <p> + <FormattedMessage + id="xpack.apm.settings.schema.success.returnText" + defaultMessage="or simply return to the {serviceInventoryLink}." + values={{ + serviceInventoryLink: ( + <APMLink path="/services"> + {i18n.translate( + 'xpack.apm.settings.schema.success.returnText.serviceInventoryLink', + { defaultMessage: 'Service inventory' } + )} + </APMLink> + ), + }} + /> + </p> + </EuiText> + </div> + } + /> + </EuiFlexItem> + <EuiFlexItem /> + </EuiFlexGroup> + </> + ); + } + + return ( + <> + <SchemaOverviewHeading /> + <EuiFlexGroup justifyContent="center"> + <EuiFlexItem /> + <EuiFlexItem> + <EuiCard + icon={<EuiIcon size="xxl" type="documents" />} + title={i18n.translate( + 'xpack.apm.settings.schema.migrate.classicIndices.title', + { defaultMessage: 'Classic APM indices' } + )} + display="subdued" + description={i18n.translate( + 'xpack.apm.settings.schema.migrate.classicIndices.description', + { + defaultMessage: + 'You are currently using classic APM indices for your data. This data schema is going away and is being replaced by data streams in Elastic Stack version 8.0.', + } + )} + footer={ + <div> + <EuiText size="s" color="subdued"> + <p> + {i18n.translate( + 'xpack.apm.settings.schema.migrate.classicIndices.currentSetup', + { defaultMessage: 'Current setup' } + )} + </p> + </EuiText> + </div> + } + /> + </EuiFlexItem> + <EuiFlexItem> + <EuiCard + betaBadgeLabel={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.betaBadge.label', + { defaultMessage: 'Beta' } + )} + betaBadgeTitle={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.betaBadge.title', + { defaultMessage: 'Data streams' } + )} + betaBadgeTooltipContent={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.betaBadge.description', + { + defaultMessage: + 'The switch to data streams is not GA. Please help us by reporting any bugs.', + } + )} + image={ + <div> + <img src={rocketLaunchGraphic} alt="rocket launch" /> + </div> + } + title={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.title', + { defaultMessage: 'Data streams' } + )} + description={i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.description', + { + defaultMessage: + 'Going forward, any newly ingested data gets stored in data streams. Previously ingested data remains in classic APM indices. The APM and UX apps will continue to support both indices.', + } + )} + footer={ + <div> + <EuiToolTip + position="bottom" + content={getDisabledReason({ + cloudApmMigrationEnabled, + hasCloudAgentPolicy, + hasRequiredRole, + })} + > + <EuiButton + fill + isLoading={isLoadingConfirmation} + isDisabled={isDisabled} + > + {i18n.translate( + 'xpack.apm.settings.schema.migrate.dataStreams.buttonText', + { defaultMessage: 'Switch to data streams' } + )} + </EuiButton> + </EuiToolTip> + </div> + } + onClick={onSwitch} + isDisabled={isDisabled} + /> + </EuiFlexItem> + <EuiFlexItem /> + </EuiFlexGroup> + <EuiSpacer size="l" /> + <EuiFlexGroup justifyContent="center" gutterSize="s"> + <EuiFlexItem /> + <EuiFlexItem grow={2}> + <EuiCallOut + title={i18n.translate( + 'xpack.apm.settings.schema.migrate.calloutNote.title', + { defaultMessage: 'Please note before switching' } + )} + iconType="iInCircle" + > + <p> + {i18n.translate( + 'xpack.apm.settings.schema.migrate.calloutNote.message', + { + defaultMessage: + 'If you have custom dashboards, machine learning jobs, or source maps that use classic APM indices, you must reconfigure them for data streams.', + } + )} + </p> + </EuiCallOut> + </EuiFlexItem> + <EuiFlexItem /> + </EuiFlexGroup> + </> + ); +} + +export function SchemaOverviewHeading() { + return ( + <> + <EuiText color="subdued"> + <FormattedMessage + id="xpack.apm.settings.schema.descriptionText" + defaultMessage="We have created a simple and seamless process for switching from the classic APM indices to immediately take advantage of the new data streams features. Beware this action is {irreversibleEmphasis} and can only be performed by a {superuserEmphasis} with access to Fleet. Learn more about {dataStreamsDocLink}." + values={{ + irreversibleEmphasis: ( + <strong> + {i18n.translate( + 'xpack.apm.settings.schema.descriptionText.irreversibleEmphasisText', + { defaultMessage: 'irreversible' } + )} + </strong> + ), + superuserEmphasis: ( + <strong> + {i18n.translate( + 'xpack.apm.settings.schema.descriptionText.superuserEmphasisText', + { defaultMessage: 'superuser' } + )} + </strong> + ), + dataStreamsDocLink: ( + <ElasticDocsLink + section="/elasticsearch/reference" + path="/data-streams.html" + target="_blank" + > + {i18n.translate( + 'xpack.apm.settings.schema.descriptionText.dataStreamsDocLinkText', + { defaultMessage: 'data streams' } + )} + </ElasticDocsLink> + ), + }} + /> + </EuiText> + <EuiSpacer size="m" /> + <EuiFlexGroup alignItems="center"> + <EuiFlexItem grow={false}> + <EuiTitle size="s"> + <h2> + {i18n.translate('xpack.apm.settings.schema.title', { + defaultMessage: 'Schema', + })} + </h2> + </EuiTitle> + </EuiFlexItem> + </EuiFlexGroup> + <EuiSpacer size="m" /> + </> + ); +} + +function getDisabledReason({ + cloudApmMigrationEnabled, + hasCloudAgentPolicy, + hasRequiredRole, +}: { + cloudApmMigrationEnabled: boolean; + hasCloudAgentPolicy: boolean; + hasRequiredRole: boolean; +}) { + const reasons: string[] = []; + if (!cloudApmMigrationEnabled) { + reasons.push( + i18n.translate( + 'xpack.apm.settings.schema.disabledReason.cloudApmMigrationEnabled', + { defaultMessage: 'Cloud migration is not enabled' } + ) + ); + } + if (!hasCloudAgentPolicy) { + reasons.push( + i18n.translate( + 'xpack.apm.settings.schema.disabledReason.hasCloudAgentPolicy', + { defaultMessage: 'Cloud agent policy does not exist' } + ) + ); + } + if (!hasRequiredRole) { + reasons.push( + i18n.translate( + 'xpack.apm.settings.schema.disabledReason.hasRequiredRole', + { defaultMessage: 'User does not have superuser role' } + ) + ); + } + if (reasons.length) { + return ( + <FormattedMessage + id="xpack.apm.settings.schema.disabledReason" + defaultMessage="Switch to data streams is unavailable: {reasons}" + values={{ + reasons: ( + <ul> + {reasons.map((reasonText, index) => ( + <li key={index}>- {reasonText}</li> + ))} + </ul> + ), + }} + /> + ); + } +} diff --git a/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx b/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx index 36580d38e660da..5214489c9142b0 100644 --- a/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx +++ b/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx @@ -19,6 +19,7 @@ import { AgentConfigurations } from '../app/Settings/AgentConfigurations'; import { AnomalyDetection } from '../app/Settings/anomaly_detection'; import { ApmIndices } from '../app/Settings/ApmIndices'; import { CustomizeUI } from '../app/Settings/CustomizeUI'; +import { Schema } from '../app/Settings/schema'; import { TraceLink } from '../app/TraceLink'; import { TransactionLink } from '../app/transaction_link'; import { TransactionDetails } from '../app/transaction_details'; @@ -250,6 +251,14 @@ function SettingsCustomizeUI() { ); } +function SettingsSchema() { + return ( + <SettingsTemplate selectedTab="schema"> + <Schema /> + </SettingsTemplate> + ); +} + export function EditAgentConfigurationRouteView(props: RouteComponentProps) { const { search } = props.history.location; @@ -315,6 +324,10 @@ const SettingsCustomizeUITitle = i18n.translate( 'xpack.apm.views.settings.customizeUI.title', { defaultMessage: 'Customize app' } ); +const SettingsSchemaTitle = i18n.translate( + 'xpack.apm.views.settings.schema.title', + { defaultMessage: 'Schema' } +); const SettingsAnomalyDetectionTitle = i18n.translate( 'xpack.apm.views.settings.anomalyDetection.title', { defaultMessage: 'Anomaly detection' } @@ -395,6 +408,12 @@ export const apmRouteConfig: APMRouteDefinition[] = [ component: SettingsCustomizeUI, breadcrumb: SettingsCustomizeUITitle, }, + { + exact: true, + path: '/settings/schema', + component: SettingsSchema, + breadcrumb: SettingsSchemaTitle, + }, { exact: true, path: '/settings/anomaly-detection', diff --git a/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx index 0e610722a76e7e..a76b4647315134 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx @@ -20,7 +20,8 @@ type Tab = NonNullable<EuiPageHeaderProps['tabs']>[0] & { | 'agent-configurations' | 'anomaly-detection' | 'apm-indices' - | 'customize-ui'; + | 'customize-ui' + | 'schema'; hidden?: boolean; }; @@ -100,6 +101,13 @@ function getTabs({ }), href: getAPMHref({ basePath, path: `/settings/apm-indices`, search }), }, + { + key: 'schema', + label: i18n.translate('xpack.apm.settings.schema', { + defaultMessage: 'Schema', + }), + href: getAPMHref({ basePath, path: `/settings/schema`, search }), + }, ]; return tabs diff --git a/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx index 6d9d38328968a1..5a7cc4623ea7b5 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx @@ -10,7 +10,13 @@ import React from 'react'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; // union type constisting of valid guide sections that we link to -type DocsSection = '/apm/get-started' | '/x-pack' | '/apm/server' | '/kibana'; +type DocsSection = + | '/apm/get-started' + | '/x-pack' + | '/apm/server' + | '/kibana' + | '/elasticsearch/reference' + | '/cloud'; interface Props extends EuiLinkAnchorProps { section: DocsSection; @@ -20,7 +26,7 @@ interface Props extends EuiLinkAnchorProps { export function ElasticDocsLink({ section, path, children, ...rest }: Props) { const { docLinks } = useApmPluginContext().core; const baseUrl = docLinks.ELASTIC_WEBSITE_URL; - const version = docLinks.DOC_LINK_VERSION; + const version = section === '/cloud' ? 'current' : docLinks.DOC_LINK_VERSION; const href = `${baseUrl}guide/en${section}/${version}${path}`; return typeof children === 'function' ? ( diff --git a/x-pack/plugins/apm/public/components/shared/Links/kibana.ts b/x-pack/plugins/apm/public/components/shared/Links/kibana.ts index f974a7e29ae47c..bfb7cf849f567f 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/kibana.ts +++ b/x-pack/plugins/apm/public/components/shared/Links/kibana.ts @@ -17,3 +17,12 @@ export function useUpgradeAssistantHref() { return getUpgradeAssistantHref(core.http.basePath); } + +export function useFleetCloudAgentPolicyHref() { + const { + core: { + http: { basePath }, + }, + } = useApmPluginContext(); + return basePath.prepend('/app/fleet#/policies/policy-elastic-agent-on-cloud'); +} diff --git a/x-pack/plugins/apm/server/index.test.ts b/x-pack/plugins/apm/server/index.test.ts index 006a21b5974587..226dfd6e95bd31 100644 --- a/x-pack/plugins/apm/server/index.test.ts +++ b/x-pack/plugins/apm/server/index.test.ts @@ -25,6 +25,7 @@ describe('mergeConfigs', () => { ui: { enabled: false }, enabled: true, metricsInterval: 2000, + agent: { migrations: { enabled: true } }, } as APMXPackConfig; expect(mergeConfigs(apmOssConfig, apmConfig)).toEqual({ @@ -35,6 +36,7 @@ describe('mergeConfigs', () => { 'apm_oss.transactionIndices': 'apm-*-transaction-*', 'xpack.apm.metricsInterval': 2000, 'xpack.apm.ui.enabled': false, + 'xpack.apm.agent.migrations.enabled': true, }); }); @@ -47,7 +49,7 @@ describe('mergeConfigs', () => { fleetMode: true, } as APMOSSConfig; - const apmConfig = { ui: {} } as APMXPackConfig; + const apmConfig = { ui: {}, agent: { migrations: {} } } as APMXPackConfig; expect(mergeConfigs(apmOssConfig, apmConfig)).toEqual({ 'apm_oss.errorIndices': 'logs-apm*,apm-*-error-*', @@ -66,7 +68,7 @@ describe('mergeConfigs', () => { fleetMode: false, } as APMOSSConfig; - const apmConfig = { ui: {} } as APMXPackConfig; + const apmConfig = { ui: {}, agent: { migrations: {} } } as APMXPackConfig; expect(mergeConfigs(apmOssConfig, apmConfig)).toEqual({ 'apm_oss.errorIndices': 'apm-*-error-*', diff --git a/x-pack/plugins/apm/server/index.ts b/x-pack/plugins/apm/server/index.ts index 9ab56c1a303ea7..413efcdb788128 100644 --- a/x-pack/plugins/apm/server/index.ts +++ b/x-pack/plugins/apm/server/index.ts @@ -49,6 +49,11 @@ export const config = { maxServiceEnvironments: schema.number({ defaultValue: 100 }), maxServiceSelection: schema.number({ defaultValue: 50 }), profilingEnabled: schema.boolean({ defaultValue: false }), + agent: schema.object({ + migrations: schema.object({ + enabled: schema.boolean({ defaultValue: false }), + }), + }), }), }; @@ -94,6 +99,7 @@ export function mergeConfigs( 'xpack.apm.searchAggregatedTransactions': apmConfig.searchAggregatedTransactions, 'xpack.apm.metricsInterval': apmConfig.metricsInterval, + 'xpack.apm.agent.migrations.enabled': apmConfig.agent.migrations.enabled, }; if (apmOssConfig.fleetMode) { diff --git a/x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts b/x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts new file mode 100644 index 00000000000000..9e3095a8d1bcab --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/create_cloud_apm_package_policy.ts @@ -0,0 +1,50 @@ +/* + * 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 { + ElasticsearchClient, + SavedObjectsClientContract, + Logger, +} from 'kibana/server'; +import { + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID, +} from '../../../common/apm_saved_object_constants'; +import { APMPluginStartDependencies } from '../../types'; +import { getApmPackagePolicyDefinition } from './get_apm_package_policy_definition'; + +export async function createCloudApmPackgePolicy({ + fleetPluginStart, + savedObjectsClient, + esClient, + logger, +}: { + fleetPluginStart: NonNullable<APMPluginStartDependencies['fleet']>; + savedObjectsClient: SavedObjectsClientContract; + esClient: ElasticsearchClient; + logger: Logger; +}) { + const { attributes } = await savedObjectsClient.get( + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID + ); + const apmServerSchema: Record<string, any> = JSON.parse( + (attributes as { schemaJson: string }).schemaJson + ); + const apmPackagePolicyDefinition = getApmPackagePolicyDefinition( + apmServerSchema + ); + logger.info(`Fleet migration on Cloud - apmPackagePolicy create start`); + const apmPackagePolicy = await fleetPluginStart.packagePolicyService.create( + savedObjectsClient, + esClient, + apmPackagePolicyDefinition, + { force: true, bumpRevision: true } + ); + logger.info(`Fleet migration on Cloud - apmPackagePolicy create end`); + return apmPackagePolicy; +} diff --git a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts new file mode 100644 index 00000000000000..fb88a092cb265d --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts @@ -0,0 +1,176 @@ +/* + * 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 { + POLICY_ELASTIC_AGENT_ON_CLOUD, + APM_PACKAGE_NAME, +} from './get_cloud_apm_package_policy'; + +export function getApmPackagePolicyDefinition( + apmServerSchema: Record<string, any> +) { + return { + name: 'apm', + namespace: 'default', + enabled: true, + policy_id: POLICY_ELASTIC_AGENT_ON_CLOUD, + output_id: '', + inputs: [ + { + type: 'apm', + enabled: true, + streams: [], + vars: getApmPackageInputVars(apmServerSchema), + }, + ], + package: { + name: APM_PACKAGE_NAME, + version: '0.3.0-dev.1', + title: 'Elastic APM', + }, + }; +} + +function getApmPackageInputVars(apmServerSchema: Record<string, any>) { + const apmServerConfigs = Object.entries( + apmConfigMapping + ).map(([key, { name, type }]) => ({ key, name, type })); + + const inputVars: Record< + string, + { type: string; value: any } + > = apmServerConfigs.reduce((acc, { key, name, type }) => { + const value = apmServerSchema[key] ?? ''; // defaults to an empty string to be edited in Fleet UI + return { + ...acc, + [name]: { type, value }, + }; + }, {}); + return inputVars; +} + +export const apmConfigMapping: Record< + string, + { name: string; type: string } +> = { + 'apm-server.host': { + name: 'host', + type: 'text', + }, + 'apm-server.url': { + name: 'url', + type: 'text', + }, + 'apm-server.secret_token': { + name: 'secret_token', + type: 'text', + }, + 'apm-server.api_key.enabled': { + name: 'api_key_enabled', + type: 'bool', + }, + 'apm-server.rum.enabled': { + name: 'enable_rum', + type: 'bool', + }, + 'apm-server.default_service_environment': { + name: 'default_service_environment', + type: 'text', + }, + 'apm-server.rum.allow_service_names': { + name: 'rum_allow_service_names', + type: 'text', + }, + 'apm-server.rum.allow_origins': { + name: 'rum_allow_origins', + type: 'text', + }, + 'apm-server.rum.allow_headers': { + name: 'rum_allow_headers', + type: 'text', + }, + 'apm-server.rum.response_headers': { + name: 'rum_response_headers', + type: 'yaml', + }, + 'apm-server.rum.event_rate.limit': { + name: 'rum_event_rate_limit', + type: 'integer', + }, + 'apm-server.rum.event_rate.lru_size': { + name: 'rum_event_rate_lru_size', + type: 'integer', + }, + 'apm-server.api_key.limit': { + name: 'api_key_limit', + type: 'integer', + }, + 'apm-server.max_event_size': { + name: 'max_event_bytes', + type: 'integer', + }, + 'apm-server.capture_personal_data': { + name: 'capture_personal_data', + type: 'bool', + }, + 'apm-server.max_header_size': { + name: 'max_header_bytes', + type: 'integer', + }, + 'apm-server.idle_timeout': { + name: 'idle_timeout', + type: 'text', + }, + 'apm-server.read_timeout': { + name: 'read_timeout', + type: 'text', + }, + 'apm-server.shutdown_timeout': { + name: 'shutdown_timeout', + type: 'text', + }, + 'apm-server.write_timeout': { + name: 'write_timeout', + type: 'text', + }, + 'apm-server.max_connections': { + name: 'max_connections', + type: 'integer', + }, + 'apm-server.response_headers': { + name: 'response_headers', + type: 'yaml', + }, + 'apm-server.expvar.enabled': { + name: 'expvar_enabled', + type: 'bool', + }, + 'apm-server.ssl.enabled': { + name: 'tls_enabled', + type: 'bool', + }, + 'apm-server.ssl.certificate': { + name: 'tls_certificate', + type: 'text', + }, + 'apm-server.ssl.key': { + name: 'tls_key', + type: 'text', + }, + 'apm-server.ssl.supported_protocols': { + name: 'tls_supported_protocols', + type: 'text', + }, + 'apm-server.ssl.cipher_suites': { + name: 'tls_cipher_suites', + type: 'text', + }, + 'apm-server.ssl.curve_types': { + name: 'tls_curve_types', + type: 'text', + }, +}; diff --git a/x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts b/x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts new file mode 100644 index 00000000000000..b0044701e4020e --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_cloud_apm_package_policy.ts @@ -0,0 +1,44 @@ +/* + * 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 { SavedObjectsClientContract } from 'kibana/server'; +import { Maybe } from '../../../typings/common'; +import { AgentPolicy, PackagePolicy } from '../../../../fleet/common'; +import { APMPluginStartDependencies } from '../../types'; + +export const POLICY_ELASTIC_AGENT_ON_CLOUD = 'policy-elastic-agent-on-cloud'; +export const APM_PACKAGE_NAME = 'apm'; + +export async function getCloudAgentPolicy({ + fleetPluginStart, + savedObjectsClient, +}: { + fleetPluginStart: NonNullable<APMPluginStartDependencies['fleet']>; + savedObjectsClient: SavedObjectsClientContract; +}) { + try { + return await fleetPluginStart.agentPolicyService.get( + savedObjectsClient, + POLICY_ELASTIC_AGENT_ON_CLOUD + ); + } catch (error) { + if (error?.output.statusCode === 404) { + return; + } + throw error; + } +} + +export function getApmPackagePolicy(agentPolicy: Maybe<AgentPolicy>) { + if (!agentPolicy) { + return; + } + const packagePolicies = agentPolicy.package_policies as PackagePolicy[]; + return packagePolicies.find( + (packagePolicy) => packagePolicy?.package?.name === APM_PACKAGE_NAME + ); +} diff --git a/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts new file mode 100644 index 00000000000000..5fec3c94cf7ac7 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/get_unsupported_apm_server_schema.ts @@ -0,0 +1,30 @@ +/* + * 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 { SavedObjectsClientContract } from 'kibana/server'; +import { + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID, +} from '../../../common/apm_saved_object_constants'; +import { apmConfigMapping } from './get_apm_package_policy_definition'; + +export async function getUnsupportedApmServerSchema({ + savedObjectsClient, +}: { + savedObjectsClient: SavedObjectsClientContract; +}) { + const { attributes } = await savedObjectsClient.get( + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID + ); + const apmServerSchema: Record<string, any> = JSON.parse( + (attributes as { schemaJson: string }).schemaJson + ); + return Object.entries(apmServerSchema) + .filter(([name]) => !(name in apmConfigMapping)) + .map(([key, value]) => ({ key, value })); +} diff --git a/x-pack/plugins/apm/server/lib/fleet/is_superuser.ts b/x-pack/plugins/apm/server/lib/fleet/is_superuser.ts new file mode 100644 index 00000000000000..1e4e596ab76e7f --- /dev/null +++ b/x-pack/plugins/apm/server/lib/fleet/is_superuser.ts @@ -0,0 +1,20 @@ +/* + * 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 { KibanaRequest } from 'kibana/server'; +import { APMPluginStartDependencies } from '../../types'; + +export function isSuperuser({ + securityPluginStart, + request, +}: { + securityPluginStart: NonNullable<APMPluginStartDependencies['security']>; + request: KibanaRequest; +}) { + const user = securityPluginStart.authc.getCurrentUser(request); + return user?.roles.includes('superuser'); +} diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index c9391eba29f8da..dd422e51550a20 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -31,7 +31,7 @@ import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_ import { createApmAgentConfigurationIndex } from './lib/settings/agent_configuration/create_agent_config_index'; import { getApmIndices } from './lib/settings/apm_indices/get_apm_indices'; import { createApmCustomLinkIndex } from './lib/settings/custom_link/create_custom_link_index'; -import { apmIndices, apmTelemetry } from './saved_objects'; +import { apmIndices, apmTelemetry, apmServerSettings } from './saved_objects'; import { uiSettings } from './ui_settings'; import type { ApmPluginRequestHandlerContext, @@ -78,6 +78,7 @@ export class APMPlugin core.savedObjects.registerType(apmIndices); core.savedObjects.registerType(apmTelemetry); + core.savedObjects.registerType(apmServerSettings); core.uiSettings.register(uiSettings); diff --git a/x-pack/plugins/apm/server/routes/fleet.ts b/x-pack/plugins/apm/server/routes/fleet.ts index 01323add276df2..7d2080c894ec6a 100644 --- a/x-pack/plugins/apm/server/routes/fleet.ts +++ b/x-pack/plugins/apm/server/routes/fleet.ts @@ -7,18 +7,24 @@ import { keyBy } from 'lodash'; import Boom from '@hapi/boom'; +import * as t from 'io-ts'; import { i18n } from '@kbn/i18n'; +import { + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + APM_SERVER_SCHEMA_SAVED_OBJECT_ID, +} from '../../common/apm_saved_object_constants'; import { getFleetAgents } from '../lib/fleet/get_agents'; import { getApmPackgePolicies } from '../lib/fleet/get_apm_package_policies'; import { createApmServerRoute } from './create_apm_server_route'; import { createApmServerRouteRepository } from './create_apm_server_route_repository'; - -const FLEET_REQUIRED_MESSAGE = i18n.translate( - 'xpack.apm.fleet_has_data.fleetRequired', - { - defaultMessage: `Fleet plugin is required`, - } -); +import { + getCloudAgentPolicy, + getApmPackagePolicy, +} from '../lib/fleet/get_cloud_apm_package_policy'; +import { createCloudApmPackgePolicy } from '../lib/fleet/create_cloud_apm_package_policy'; +import { getUnsupportedApmServerSchema } from '../lib/fleet/get_unsupported_apm_server_schema'; +import { isSuperuser } from '../lib/fleet/is_superuser'; +import { getInternalSavedObjectsClient } from '../lib/helpers/get_internal_saved_objects_client'; const hasFleetDataRoute = createApmServerRoute({ endpoint: 'GET /api/apm/fleet/has_data', @@ -84,6 +90,119 @@ const fleetAgentsRoute = createApmServerRoute({ }, }); -export const ApmFleetRouteRepository = createApmServerRouteRepository() +const saveApmServerSchemaRoute = createApmServerRoute({ + endpoint: 'POST /api/apm/fleet/apm_server_schema', + options: { tags: ['access:apm', 'access:apm_write'] }, + params: t.type({ + body: t.type({ + schema: t.record(t.string, t.unknown), + }), + }), + handler: async (resources) => { + const { params, logger, core } = resources; + const savedObjectsClient = await getInternalSavedObjectsClient(core.setup); + const { schema } = params.body; + await savedObjectsClient.create( + APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + { schemaJson: JSON.stringify(schema) }, + { id: APM_SERVER_SCHEMA_SAVED_OBJECT_ID, overwrite: true } + ); + logger.info(`Stored apm-server schema.`); + }, +}); + +const getUnsupportedApmServerSchemaRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/fleet/apm_server_schema/unsupported', + options: { tags: ['access:apm'] }, + handler: async (resources) => { + const { context } = resources; + const savedObjectsClient = context.core.savedObjects.client; + return { + unsupported: await getUnsupportedApmServerSchema({ savedObjectsClient }), + }; + }, +}); + +const getMigrationCheckRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/fleet/migration_check', + options: { tags: ['access:apm'] }, + handler: async (resources) => { + const { plugins, context, config, request } = resources; + const cloudApmMigrationEnabled = + config['xpack.apm.agent.migrations.enabled']; + if (!plugins.fleet || !plugins.security) { + throw Boom.internal(FLEET_SECURITY_REQUIRED_MESSAGE); + } + const savedObjectsClient = context.core.savedObjects.client; + const fleetPluginStart = await plugins.fleet.start(); + const securityPluginStart = await plugins.security.start(); + const hasRequiredRole = isSuperuser({ securityPluginStart, request }); + const cloudAgentPolicy = await getCloudAgentPolicy({ + savedObjectsClient, + fleetPluginStart, + }); + return { + has_cloud_agent_policy: !!cloudAgentPolicy, + has_cloud_apm_package_policy: !!getApmPackagePolicy(cloudAgentPolicy), + cloud_apm_migration_enabled: cloudApmMigrationEnabled, + has_required_role: hasRequiredRole, + }; + }, +}); + +const createCloudApmPackagePolicyRoute = createApmServerRoute({ + endpoint: 'POST /api/apm/fleet/cloud_apm_package_policy', + options: { tags: ['access:apm', 'access:apm_write'] }, + handler: async (resources) => { + const { plugins, context, config, request, logger } = resources; + const cloudApmMigrationEnabled = + config['xpack.apm.agent.migrations.enabled']; + if (!plugins.fleet || !plugins.security) { + throw Boom.internal(FLEET_SECURITY_REQUIRED_MESSAGE); + } + const savedObjectsClient = context.core.savedObjects.client; + const coreStart = await resources.core.start(); + const esClient = coreStart.elasticsearch.client.asScoped(resources.request) + .asCurrentUser; + const fleetPluginStart = await plugins.fleet.start(); + const securityPluginStart = await plugins.security.start(); + const hasRequiredRole = isSuperuser({ securityPluginStart, request }); + if (!hasRequiredRole || !cloudApmMigrationEnabled) { + throw Boom.forbidden(CLOUD_SUPERUSER_REQUIRED_MESSAGE); + } + return { + cloud_apm_package_policy: await createCloudApmPackgePolicy({ + fleetPluginStart, + savedObjectsClient, + esClient, + logger, + }), + }; + }, +}); + +export const apmFleetRouteRepository = createApmServerRouteRepository() .add(hasFleetDataRoute) - .add(fleetAgentsRoute); + .add(fleetAgentsRoute) + .add(saveApmServerSchemaRoute) + .add(getUnsupportedApmServerSchemaRoute) + .add(getMigrationCheckRoute) + .add(createCloudApmPackagePolicyRoute); + +const FLEET_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.fleet_has_data.fleetRequired', + { defaultMessage: `Fleet plugin is required` } +); + +const FLEET_SECURITY_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.api.fleet.fleetSecurityRequired', + { defaultMessage: `Fleet and Security plugins are required` } +); + +const CLOUD_SUPERUSER_REQUIRED_MESSAGE = i18n.translate( + 'xpack.apm.api.fleet.cloud_apm_package_policy.requiredRoleOnCloud', + { + defaultMessage: + 'Operation only permitted by Elastic Cloud users with the superuser role.', + } +); diff --git a/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts b/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts index fa2f80f073958a..4a277e2a423369 100644 --- a/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts +++ b/x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts @@ -15,6 +15,7 @@ import { correlationsRouteRepository } from './correlations'; import { createApmServerRouteRepository } from './create_apm_server_route_repository'; import { environmentsRouteRepository } from './environments'; import { errorsRouteRepository } from './errors'; +import { apmFleetRouteRepository } from './fleet'; import { indexPatternRouteRepository } from './index_pattern'; import { metricsRouteRepository } from './metrics'; import { observabilityOverviewRouteRepository } from './observability_overview'; @@ -30,7 +31,6 @@ import { sourceMapsRouteRepository } from './source_maps'; import { traceRouteRepository } from './traces'; import { transactionRouteRepository } from './transactions'; import { APMRouteHandlerResources } from './typings'; -import { ApmFleetRouteRepository } from './fleet'; const getTypedGlobalApmServerRouteRepository = () => { const repository = createApmServerRouteRepository() @@ -52,7 +52,7 @@ const getTypedGlobalApmServerRouteRepository = () => { .merge(apmIndicesRouteRepository) .merge(customLinkRouteRepository) .merge(sourceMapsRouteRepository) - .merge(ApmFleetRouteRepository); + .merge(apmFleetRouteRepository); return repository; }; diff --git a/x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts b/x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts new file mode 100644 index 00000000000000..84c52e85c4397c --- /dev/null +++ b/x-pack/plugins/apm/server/saved_objects/apm_server_settings.ts @@ -0,0 +1,32 @@ +/* + * 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 { SavedObjectsType } from 'src/core/server'; +import { i18n } from '@kbn/i18n'; +import { APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE } from '../../common/apm_saved_object_constants'; + +export const apmServerSettings: SavedObjectsType = { + name: APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + mappings: { + properties: { + schemaJson: { + type: 'text', + index: false, + }, + }, + }, + management: { + importableAndExportable: false, + icon: 'apmApp', + getTitle: () => + i18n.translate('xpack.apm.apmSchema.index', { + defaultMessage: 'APM Server Schema - Index', + }), + }, +}; diff --git a/x-pack/plugins/apm/server/saved_objects/index.ts b/x-pack/plugins/apm/server/saved_objects/index.ts index 370137af3dd44a..ba4285a2389689 100644 --- a/x-pack/plugins/apm/server/saved_objects/index.ts +++ b/x-pack/plugins/apm/server/saved_objects/index.ts @@ -7,3 +7,4 @@ export { apmIndices } from './apm_indices'; export { apmTelemetry } from './apm_telemetry'; +export { apmServerSettings } from './apm_server_settings'; From 16ae487a5f60c375fb18f08a3c9bef7e0018b637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= <alejandro.fernandez@elastic.co> Date: Tue, 29 Jun 2021 18:16:03 +0200 Subject: [PATCH 102/227] [Fleet] Warn when trying to unenroll agents with fleet server (#103671) --- .../components/actions_menu.tsx | 14 +++++++++-- .../agents/agent_details_page/index.tsx | 1 + .../sections/agents/agent_list_page/index.tsx | 23 +++++++++++++++++-- .../components/agent_unenroll_modal/index.tsx | 23 ++++++++++++++++++- 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx index d814d2d0646a87..01627159f39bce 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/actions_menu.tsx @@ -9,7 +9,7 @@ import React, { memo, useState, useMemo } from 'react'; import { EuiPortal, EuiContextMenuItem } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import type { Agent } from '../../../../types'; +import type { Agent, AgentPolicy, PackagePolicy } from '../../../../types'; import { useCapabilities, useKibanaVersion } from '../../../../hooks'; import { ContextMenuActions } from '../../../../components'; import { @@ -19,12 +19,14 @@ import { } from '../../components'; import { useAgentRefresh } from '../hooks'; import { isAgentUpgradeable } from '../../../../services'; +import { FLEET_SERVER_PACKAGE } from '../../../../constants'; export const AgentDetailsActionMenu: React.FunctionComponent<{ agent: Agent; + agentPolicy?: AgentPolicy; assignFlyoutOpenByDefault?: boolean; onCancelReassign?: () => void; -}> = memo(({ agent, assignFlyoutOpenByDefault = false, onCancelReassign }) => { +}> = memo(({ agent, assignFlyoutOpenByDefault = false, onCancelReassign, agentPolicy }) => { const hasWriteCapabilites = useCapabilities().write; const kibanaVersion = useKibanaVersion(); const refreshAgent = useAgentRefresh(); @@ -33,6 +35,13 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false); const isUnenrolling = agent.status === 'unenrolling'; + const hasFleetServer = + agentPolicy && + agentPolicy.package_policies.some( + (ap: string | PackagePolicy) => + typeof ap !== 'string' && ap.package?.name === FLEET_SERVER_PACKAGE + ); + const onClose = useMemo(() => { if (onCancelReassign) { return onCancelReassign; @@ -58,6 +67,7 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ refreshAgent(); }} useForceUnenroll={isUnenrolling} + hasFleetServer={hasFleetServer} /> </EuiPortal> )} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx index 559cefc5fc720a..1edf1bf6972511 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx @@ -193,6 +193,7 @@ export const AgentDetailsPage: React.FunctionComponent = () => { isAgentPolicyLoading || agentPolicyData?.item?.is_managed ? undefined : ( <AgentDetailsActionMenu agent={agentData.item} + agentPolicy={agentPolicyData?.item} assignFlyoutOpenByDefault={openReassignFlyoutOpenByDefault} onCancelReassign={ routeState && routeState.onDoneNavigateTo diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index 431c4da3efb5b2..c6e92cbce8d184 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -22,7 +22,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage, FormattedRelative } from '@kbn/i18n/react'; -import type { Agent, AgentPolicy, SimplifiedAgentStatus } from '../../../types'; +import type { Agent, AgentPolicy, PackagePolicy, SimplifiedAgentStatus } from '../../../types'; import { usePagination, useCapabilities, @@ -42,7 +42,7 @@ import { ContextMenuActions, } from '../../../components'; import { AgentStatusKueryHelper, isAgentUpgradeable } from '../../../services'; -import { AGENT_SAVED_OBJECT_TYPE } from '../../../constants'; +import { AGENT_SAVED_OBJECT_TYPE, FLEET_SERVER_PACKAGE } from '../../../constants'; import { AgentReassignAgentPolicyModal, AgentHealth, @@ -328,6 +328,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { const agentPoliciesRequest = useGetAgentPolicies({ page: 1, perPage: 1000, + full: true, }); const agentPolicies = useMemo( @@ -351,6 +352,23 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { return !isHosted; }; + const agentToUnenrollHasFleetServer = useMemo(() => { + if (!agentToUnenroll || !agentToUnenroll.policy_id) { + return false; + } + + const agentPolicy = agentPoliciesIndexedById[agentToUnenroll.policy_id]; + + if (!agentPolicy) { + return false; + } + + return agentPolicy.package_policies.some( + (ap: string | PackagePolicy) => + typeof ap !== 'string' && ap.package?.name === FLEET_SERVER_PACKAGE + ); + }, [agentToUnenroll, agentPoliciesIndexedById]); + const columns = [ { field: 'local_metadata.host.hostname', @@ -512,6 +530,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { fetchData(); }} useForceUnenroll={agentToUnenroll.status === 'unenrolling'} + hasFleetServer={agentToUnenrollHasFleetServer} /> </EuiPortal> )} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx index 5507fd6395c6ff..0b13fcc9c72be3 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/components/agent_unenroll_modal/index.tsx @@ -7,7 +7,7 @@ import React, { useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiConfirmModal, EuiFormFieldset, EuiCheckbox } from '@elastic/eui'; +import { EuiCallOut, EuiConfirmModal, EuiFormFieldset, EuiCheckbox, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import type { Agent } from '../../../../types'; @@ -22,6 +22,7 @@ interface Props { agents: Agent[] | string; agentCount: number; useForceUnenroll?: boolean; + hasFleetServer?: boolean; } export const AgentUnenrollAgentModal: React.FunctionComponent<Props> = ({ @@ -29,6 +30,7 @@ export const AgentUnenrollAgentModal: React.FunctionComponent<Props> = ({ agents, agentCount, useForceUnenroll, + hasFleetServer = false, }) => { const { notifications } = useStartServices(); const [forceUnenroll, setForceUnenroll] = useState<boolean>(useForceUnenroll || false); @@ -123,6 +125,25 @@ export const AgentUnenrollAgentModal: React.FunctionComponent<Props> = ({ buttonColor="danger" > <p> + {hasFleetServer && isSingleAgent ? ( + <> + <EuiCallOut + title={i18n.translate('xpack.fleet.unenrollAgents.unenrollFleetServerTitle', { + defaultMessage: 'This agent is running Fleet Server', + })} + color="warning" + iconType="alert" + > + <p> + <FormattedMessage + id="xpack.fleet.unenrollAgents.unenrollFleetServerDescription" + defaultMessage="Unenrolling this agent will disconnect a Fleet Server and prevent agents from sendind data if no other Fleet Servers exist." + /> + </p> + </EuiCallOut> + <EuiSpacer /> + </> + ) : null} {isSingleAgent ? ( <FormattedMessage id="xpack.fleet.unenrollAgents.deleteSingleDescription" From 7ff28959b1baad15a81ecba8993f561e560e915c Mon Sep 17 00:00:00 2001 From: Stacey Gammon <gammon@elastic.co> Date: Tue, 29 Jun 2021 12:29:58 -0400 Subject: [PATCH 103/227] Update api docs (#103310) * Update api docs * update api docs after merge from master --- api_docs/actions.json | 4 +- api_docs/actions.mdx | 1 - api_docs/advanced_settings.mdx | 1 - api_docs/alerting.json | 116 +- api_docs/alerting.mdx | 3 +- api_docs/apm.json | 210 +- api_docs/apm.mdx | 1 - api_docs/apm_oss.mdx | 1 - api_docs/banners.mdx | 1 - api_docs/bfetch.mdx | 1 - api_docs/canvas.mdx | 1 - api_docs/cases.json | 1593 +- api_docs/cases.mdx | 7 +- api_docs/charts.json | 8 +- api_docs/charts.mdx | 1 - api_docs/cloud.json | 56 +- api_docs/cloud.mdx | 3 +- api_docs/console.mdx | 1 - api_docs/core.json | 496 +- api_docs/core.mdx | 3 +- api_docs/core_application.json | 82 +- api_docs/core_application.mdx | 3 +- api_docs/core_chrome.mdx | 3 +- api_docs/core_http.json | 4 +- api_docs/core_http.mdx | 3 +- api_docs/core_saved_objects.json | 1083 +- api_docs/core_saved_objects.mdx | 3 +- api_docs/dashboard.json | 449 +- api_docs/dashboard.mdx | 3 +- api_docs/dashboard_enhanced.json | 46 +- api_docs/dashboard_enhanced.mdx | 1 - api_docs/dashboard_mode.mdx | 1 - api_docs/data.json | 2946 +- api_docs/data.mdx | 3 +- api_docs/data_autocomplete.mdx | 3 +- api_docs/data_enhanced.json | 2 +- api_docs/data_enhanced.mdx | 1 - api_docs/data_field_formats.json | 16 +- api_docs/data_field_formats.mdx | 3 +- api_docs/data_index_patterns.json | 1293 +- api_docs/data_index_patterns.mdx | 3 +- api_docs/data_query.json | 4 +- api_docs/data_query.mdx | 3 +- api_docs/data_search.json | 443 +- api_docs/data_search.mdx | 6 +- api_docs/data_ui.json | 8 +- api_docs/data_ui.mdx | 3 +- api_docs/data_visualizer.json | 8 +- api_docs/data_visualizer.mdx | 5 +- api_docs/deprecations.mdx | 424 +- api_docs/dev_tools.mdx | 1 - api_docs/discover.json | 427 +- api_docs/discover.mdx | 7 +- api_docs/discover_enhanced.json | 34 +- api_docs/discover_enhanced.mdx | 1 - api_docs/embeddable.json | 180 +- api_docs/embeddable.mdx | 3 +- api_docs/embeddable_enhanced.mdx | 1 - api_docs/encrypted_saved_objects.mdx | 5 +- api_docs/enterprise_search.mdx | 5 +- api_docs/es_ui_shared.json | 102 +- api_docs/es_ui_shared.mdx | 3 +- api_docs/event_log.json | 22 +- api_docs/event_log.mdx | 1 - api_docs/expressions.json | 2799 +- api_docs/expressions.mdx | 3 +- api_docs/features.mdx | 1 - api_docs/file_upload.mdx | 5 +- api_docs/fleet.json | 3710 ++- api_docs/fleet.mdx | 3 +- api_docs/global_search.mdx | 1 - api_docs/home.json | 172 +- api_docs/home.mdx | 3 +- api_docs/index_lifecycle_management.json | 63 +- api_docs/index_lifecycle_management.mdx | 3 +- api_docs/index_management.mdx | 1 - api_docs/index_pattern_field_editor.mdx | 1 - api_docs/index_pattern_management.json | 983 - api_docs/index_pattern_management.mdx | 40 - api_docs/infra.mdx | 1 - api_docs/ingest_pipelines.json | 220 - api_docs/ingest_pipelines.mdx | 34 - api_docs/inspector.mdx | 1 - api_docs/kibana_legacy.mdx | 1 - api_docs/kibana_react.json | 311 +- api_docs/kibana_react.mdx | 3 +- api_docs/kibana_utils.json | 196 - api_docs/kibana_utils.mdx | 3 +- api_docs/lens.json | 319 +- api_docs/lens.mdx | 7 +- api_docs/license_api_guard.mdx | 1 - api_docs/license_management.mdx | 1 - api_docs/licensing.json | 82 +- api_docs/licensing.mdx | 1 - api_docs/lists.json | 106 +- api_docs/lists.mdx | 3 +- api_docs/management.json | 90 +- api_docs/management.mdx | 8 +- api_docs/maps.json | 398 +- api_docs/maps.mdx | 3 +- api_docs/maps_ems.json | 12 +- api_docs/maps_ems.mdx | 1 - api_docs/metrics_entities.mdx | 1 - api_docs/ml.json | 60 +- api_docs/ml.mdx | 7 +- api_docs/monitoring.mdx | 1 - api_docs/navigation.json | 2 +- api_docs/navigation.mdx | 1 - api_docs/newsfeed.json | 30 +- api_docs/newsfeed.mdx | 1 - api_docs/observability.json | 573 +- api_docs/observability.mdx | 8 +- api_docs/osquery.json | 8 +- api_docs/osquery.mdx | 1 - api_docs/presentation_util.json | 250 +- api_docs/presentation_util.mdx | 3 +- api_docs/remote_clusters.mdx | 1 - api_docs/reporting.json | 24 +- api_docs/reporting.mdx | 3 +- api_docs/rollup.mdx | 1 - api_docs/rule_registry.json | 34 +- api_docs/rule_registry.mdx | 3 +- api_docs/runtime_fields.mdx | 1 - api_docs/saved_objects.json | 153 +- api_docs/saved_objects.mdx | 3 +- api_docs/saved_objects_management.json | 2 +- api_docs/saved_objects_management.mdx | 1 - api_docs/saved_objects_tagging.mdx | 1 - api_docs/saved_objects_tagging_oss.mdx | 1 - api_docs/screenshot_mode.json | 6 +- api_docs/screenshot_mode.mdx | 3 +- api_docs/security.json | 48 +- api_docs/security.mdx | 7 +- api_docs/security_oss.mdx | 5 +- api_docs/security_solution.json | 29795 +++++++++++++++++++- api_docs/security_solution.mdx | 23 +- api_docs/share.json | 1852 +- api_docs/share.mdx | 17 +- api_docs/snapshot_restore.mdx | 1 - api_docs/spaces.json | 223 +- api_docs/spaces.mdx | 7 +- api_docs/spaces_oss.json | 72 +- api_docs/spaces_oss.mdx | 7 +- api_docs/stack_alerts.mdx | 1 - api_docs/task_manager.json | 4 +- api_docs/task_manager.mdx | 1 - api_docs/telemetry.mdx | 1 - api_docs/telemetry_collection_manager.mdx | 1 - api_docs/telemetry_collection_xpack.mdx | 1 - api_docs/telemetry_management_section.mdx | 1 - api_docs/timelines.json | 23105 ++++++++++++++- api_docs/timelines.mdx | 34 +- api_docs/triggers_actions_ui.mdx | 1 - api_docs/ui_actions.json | 8 +- api_docs/ui_actions.mdx | 1 - api_docs/ui_actions_enhanced.mdx | 1 - api_docs/uptime.json | 151 - api_docs/uptime.mdx | 31 - api_docs/url_forwarding.mdx | 1 - api_docs/usage_collection.mdx | 1 - api_docs/vis_type_timeseries.mdx | 5 +- api_docs/visualizations.json | 84 +- api_docs/visualizations.mdx | 7 +- 163 files changed, 67539 insertions(+), 8886 deletions(-) delete mode 100644 api_docs/index_pattern_management.json delete mode 100644 api_docs/index_pattern_management.mdx delete mode 100644 api_docs/ingest_pipelines.json delete mode 100644 api_docs/ingest_pipelines.mdx delete mode 100644 api_docs/uptime.json delete mode 100644 api_docs/uptime.mdx diff --git a/api_docs/actions.json b/api_docs/actions.json index d7c5e63434c078..8ee6cfbc7d4f95 100644 --- a/api_docs/actions.json +++ b/api_docs/actions.json @@ -969,9 +969,9 @@ "section": "def-server.ActionResult", "text": "ActionResult" }, - "<Record<string, unknown>>>; execute: ({ actionId, params, source, }: Pick<", + "<Record<string, unknown>>>; execute: ({ actionId, params, source, relatedSavedObjects, }: Pick<", "ExecuteOptions", - "<unknown>, \"source\" | \"params\" | \"actionId\">) => Promise<", + "<unknown>, \"source\" | \"params\" | \"actionId\" | \"taskInfo\" | \"relatedSavedObjects\">) => Promise<", { "pluginId": "actions", "scope": "common", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 0131bca3e6c507..854541bbdf85df 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import actionsObj from './actions.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 241b6b82598c3f..5be4696f40b3ec 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import advancedSettingsObj from './advanced_settings.json'; diff --git a/api_docs/alerting.json b/api_docs/alerting.json index 979f444659c208..ec784dc8fc991c 100644 --- a/api_docs/alerting.json +++ b/api_docs/alerting.json @@ -25,13 +25,7 @@ "text": "Alert" }, "<never>, \"enabled\" | \"id\" | \"name\" | \"params\" | \"actions\" | \"tags\" | \"alertTypeId\" | \"consumer\" | \"schedule\" | \"scheduledTaskId\" | \"createdBy\" | \"updatedBy\" | \"createdAt\" | \"updatedAt\" | \"apiKeyOwner\" | \"throttle\" | \"notifyWhen\" | \"muteAll\" | \"mutedInstanceIds\" | \"executionStatus\">) => string | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "x-pack/plugins/alerting/public/alert_navigation_registry/types.ts", @@ -64,7 +58,7 @@ ], "label": "registerNavigation", "description": [ - "\nRegister a customized view of the particular rule type. Stack Management provides a generic overview, but a developer can register a\ncustom navigation to provide the user an extra link to a more curated view. The alerting plugin doesn't actually do\nanything with this information, but it can be used by other plugins via the `getNavigation` functionality. Currently\nthe trigger_actions_ui plugin uses it to expose the link from the generic rule view in Stack Management.\n" + "\nRegister a customized view of the particular rule type. Stack Management provides a generic overview, but a developer can register a\ncustom navigation to provide the user an extra link to a more curated view. The alerting plugin doesn't actually do\nanything with this information, but it can be used by other plugins via the `getNavigation` functionality. Currently\nthe trigger_actions_ui plugin uses it to expose the link from the generic rule details view in Stack Management.\n" ], "signature": [ "(applicationId: string, ruleType: string, handler: ", @@ -133,13 +127,7 @@ "text": "Alert" }, "<never>, \"enabled\" | \"id\" | \"name\" | \"params\" | \"actions\" | \"tags\" | \"alertTypeId\" | \"consumer\" | \"schedule\" | \"scheduledTaskId\" | \"createdBy\" | \"updatedBy\" | \"createdAt\" | \"updatedAt\" | \"apiKeyOwner\" | \"throttle\" | \"notifyWhen\" | \"muteAll\" | \"mutedInstanceIds\" | \"executionStatus\">) => string | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "x-pack/plugins/alerting/public/plugin.ts", @@ -156,7 +144,7 @@ "tags": [], "label": "registerDefaultNavigation", "description": [ - "\nRegister a customized view for all rule types. Stack Management provides a generic overview, but a developer can register a\ncustom navigation to provide the user an extra link to a more curated view. The alerting plugin doesn't actually do\nanything with this information, but it can be used by other plugins via the `getNavigation` functionality. Currently\nthe trigger_actions_ui plugin uses it to expose the link from the generic rule view in Stack Management.\n" + "\nRegister a customized view for all rule types with this application id. Stack Management provides a generic overview, but a developer can register a\ncustom navigation to provide the user an extra link to a more curated view. The alerting plugin doesn't actually do\nanything with this information, but it can be used by other plugins via the `getNavigation` functionality. Currently\nthe trigger_actions_ui plugin uses it to expose the link from the generic rule details view in Stack Management.\n" ], "signature": [ "(applicationId: string, handler: ", @@ -210,13 +198,7 @@ "text": "Alert" }, "<never>, \"enabled\" | \"id\" | \"name\" | \"params\" | \"actions\" | \"tags\" | \"alertTypeId\" | \"consumer\" | \"schedule\" | \"scheduledTaskId\" | \"createdBy\" | \"updatedBy\" | \"createdAt\" | \"updatedAt\" | \"apiKeyOwner\" | \"throttle\" | \"notifyWhen\" | \"muteAll\" | \"mutedInstanceIds\" | \"executionStatus\">) => string | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "x-pack/plugins/alerting/public/plugin.ts", @@ -396,7 +378,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false, "children": [ @@ -412,7 +394,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false }, @@ -425,7 +407,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false } @@ -786,7 +768,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 221 + "lineNumber": 222 }, "deprecated": false, "children": [ @@ -808,7 +790,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 222 + "lineNumber": 223 }, "deprecated": false }, @@ -830,7 +812,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 223 + "lineNumber": 224 }, "deprecated": false } @@ -1153,6 +1135,19 @@ "lineNumber": 148 }, "deprecated": false + }, + { + "parentPluginId": "alerting", + "id": "def-server.AlertType.isExportable", + "type": "boolean", + "tags": [], + "label": "isExportable", + "description": [], + "source": { + "path": "x-pack/plugins/alerting/server/types.ts", + "lineNumber": 149 + }, + "deprecated": false } ], "initialIsOpen": false @@ -1255,7 +1250,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 85 + "lineNumber": 87 }, "deprecated": false, "children": [ @@ -1279,7 +1274,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 86 + "lineNumber": 88 }, "deprecated": false, "children": [ @@ -1302,7 +1297,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 94 + "lineNumber": 96 }, "deprecated": false, "isRequired": true @@ -1322,7 +1317,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 105 + "lineNumber": 107 }, "deprecated": false, "children": [ @@ -1340,7 +1335,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 106 + "lineNumber": 108 }, "deprecated": false, "returnComment": [], @@ -1374,7 +1369,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 107 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -1397,7 +1392,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 107 + "lineNumber": 109 }, "deprecated": false, "isRequired": true @@ -1427,7 +1422,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 108 + "lineNumber": 110 }, "deprecated": false, "children": [ @@ -1450,7 +1445,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 109 + "lineNumber": 111 }, "deprecated": false, "isRequired": true @@ -1478,7 +1473,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 111 + "lineNumber": 113 }, "deprecated": false, "returnComment": [], @@ -1518,7 +1513,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 30 + "lineNumber": 31 }, "deprecated": false, "initialIsOpen": false @@ -1711,7 +1706,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 181 + "lineNumber": 182 }, "deprecated": false, "initialIsOpen": false @@ -2073,7 +2068,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false, "children": [ @@ -2089,7 +2084,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false }, @@ -2102,7 +2097,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false } @@ -3199,7 +3194,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/common/alert_navigation.ts", - "lineNumber": 13 + "lineNumber": 12 }, "deprecated": false, "children": [ @@ -3211,17 +3206,11 @@ "label": "state", "description": [], "signature": [ - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "x-pack/plugins/alerting/common/alert_navigation.ts", - "lineNumber": 14 + "lineNumber": 13 }, "deprecated": false } @@ -3383,6 +3372,19 @@ "lineNumber": 22 }, "deprecated": false + }, + { + "parentPluginId": "alerting", + "id": "def-common.AlertType.isExportable", + "type": "boolean", + "tags": [], + "label": "isExportable", + "description": [], + "source": { + "path": "x-pack/plugins/alerting/common/alert_type.ts", + "lineNumber": 23 + }, + "deprecated": false } ], "initialIsOpen": false @@ -3396,7 +3398,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/common/alert_navigation.ts", - "lineNumber": 10 + "lineNumber": 9 }, "deprecated": false, "children": [ @@ -3409,7 +3411,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/common/alert_navigation.ts", - "lineNumber": 11 + "lineNumber": 10 }, "deprecated": false } @@ -3516,7 +3518,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_type.ts", - "lineNumber": 30 + "lineNumber": 31 }, "deprecated": false, "initialIsOpen": false @@ -3670,7 +3672,7 @@ ], "source": { "path": "x-pack/plugins/alerting/common/alert_navigation.ts", - "lineNumber": 16 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index c3c844148106f0..ae36d22d013b84 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import alertingObj from './alerting.json'; @@ -19,7 +18,7 @@ import alertingObj from './alerting.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 213 | 0 | 213 | 15 | +| 216 | 0 | 208 | 14 | ## Client diff --git a/api_docs/apm.json b/api_docs/apm.json index 84f5a87f404ae9..1d0776a8d19531 100644 --- a/api_docs/apm.json +++ b/api_docs/apm.json @@ -144,7 +144,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false, "children": [ @@ -160,7 +160,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 64 + "lineNumber": 65 }, "deprecated": false, "children": [ @@ -183,7 +183,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 64 + "lineNumber": 65 }, "deprecated": false, "isRequired": true @@ -211,7 +211,7 @@ "APMPluginStartDependencies", ", unknown>, plugins: Pick<", "APMPluginSetupDependencies", - ", \"data\" | \"security\" | \"home\" | \"features\" | \"ml\" | \"actions\" | \"usageCollection\" | \"apmOss\" | \"licensing\" | \"observability\" | \"ruleRegistry\" | \"spaces\" | \"cloud\" | \"taskManager\" | \"alerting\">) => { config$: ", + ", \"data\" | \"security\" | \"home\" | \"features\" | \"fleet\" | \"ml\" | \"actions\" | \"usageCollection\" | \"apmOss\" | \"licensing\" | \"observability\" | \"ruleRegistry\" | \"spaces\" | \"cloud\" | \"taskManager\" | \"alerting\">) => { config$: ", "Observable", "<{ 'apm_oss.transactionIndices': string; 'apm_oss.spanIndices': string; 'apm_oss.errorIndices': string; 'apm_oss.metricsIndices': string; 'apm_oss.sourcemapIndices': string; 'apm_oss.onboardingIndices': string; 'apm_oss.indexPattern': string; 'xpack.apm.serviceMapEnabled': boolean; 'xpack.apm.serviceMapFingerprintBucketSize': number; 'xpack.apm.serviceMapTraceIdBucketSize': number; 'xpack.apm.serviceMapFingerprintGlobalBucketSize': number; 'xpack.apm.serviceMapTraceIdGlobalBucketSize': number; 'xpack.apm.serviceMapMaxTracesPerRequest': number; 'xpack.apm.ui.enabled': boolean; 'xpack.apm.maxServiceEnvironments': number; 'xpack.apm.maxServiceSelection': number; 'xpack.apm.ui.maxTraceItems': number; 'xpack.apm.ui.transactionGroupBucketSize': number; 'xpack.apm.autocreateApmIndexPattern': boolean; 'xpack.apm.telemetryCollectionEnabled': boolean; 'xpack.apm.searchAggregatedTransactions': ", "SearchAggregatedTransactionSetting", @@ -229,7 +229,7 @@ "ApmPluginRequestHandlerContext", "; }) => Promise<{ search<TParams extends ", "APMEventESSearchRequest", - ">(params: TParams, { includeLegacyData }?: { includeLegacyData?: boolean | undefined; }): Promise<", + ">(operationName: string, params: TParams): Promise<", "InferSearchResponseOf", "<TypeOfProcessorEvent<", "ValuesType", @@ -237,7 +237,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 68 + "lineNumber": 69 }, "deprecated": false, "children": [ @@ -262,7 +262,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 69 + "lineNumber": 70 }, "deprecated": false, "isRequired": true @@ -277,11 +277,11 @@ "signature": [ "Pick<", "APMPluginSetupDependencies", - ", \"data\" | \"security\" | \"home\" | \"features\" | \"ml\" | \"actions\" | \"usageCollection\" | \"apmOss\" | \"licensing\" | \"observability\" | \"ruleRegistry\" | \"spaces\" | \"cloud\" | \"taskManager\" | \"alerting\">" + ", \"data\" | \"security\" | \"home\" | \"features\" | \"fleet\" | \"ml\" | \"actions\" | \"usageCollection\" | \"apmOss\" | \"licensing\" | \"observability\" | \"ruleRegistry\" | \"spaces\" | \"cloud\" | \"taskManager\" | \"alerting\">" ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 70 + "lineNumber": 71 }, "deprecated": false, "isRequired": true @@ -309,7 +309,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 260 + "lineNumber": 270 }, "deprecated": false, "children": [ @@ -331,7 +331,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 260 + "lineNumber": 270 }, "deprecated": false, "isRequired": true @@ -351,7 +351,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/plugin.ts", - "lineNumber": 279 + "lineNumber": 289 }, "deprecated": false, "children": [], @@ -433,7 +433,7 @@ "description": [], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 45 + "lineNumber": 46 }, "deprecated": false, "children": [ @@ -456,7 +456,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 46 + "lineNumber": 47 }, "deprecated": false }, @@ -472,7 +472,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 47 + "lineNumber": 48 }, "deprecated": false }, @@ -488,7 +488,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 48 + "lineNumber": 49 }, "deprecated": false }, @@ -506,7 +506,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 53 + "lineNumber": 54 }, "deprecated": false }, @@ -522,7 +522,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false }, @@ -554,7 +554,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 55 + "lineNumber": 56 }, "deprecated": false }, @@ -692,6 +692,14 @@ "section": "def-server.HomeServerPluginStart", "text": "HomeServerPluginStart" }, + ">; } | undefined; fleet?: { setup: void; start: () => Promise<", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.FleetStartContract", + "text": "FleetStartContract" + }, ">; } | undefined; ml?: { setup: ", "SharedServices", "; start: () => Promise<void>; } | undefined; actions?: { setup: ", @@ -778,7 +786,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 59 + "lineNumber": 60 }, "deprecated": false }, @@ -800,7 +808,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/routes/typings.ts", - "lineNumber": 65 + "lineNumber": 66 }, "deprecated": false } @@ -1135,7 +1143,9 @@ "section": "def-server.APMRouteHandlerResources", "text": "APMRouteHandlerResources" }, - ", { hasData: boolean; }, ", + ", { hasData: boolean; indices: ", + "ApmIndicesConfig", + "; }, ", "APMRouteCreateOptions", ">; } & { \"GET /api/apm/rum/client-metrics\": ", "ServerRoute", @@ -1503,40 +1513,6 @@ }, ", { indices: string; hasData: boolean; serviceName: any; }, ", "APMRouteCreateOptions", - ">; } & { \"GET /api/apm/rum/local_filters\": ", - "ServerRoute", - "<\"GET /api/apm/rum/local_filters\", ", - "TypeC", - "<{ query: ", - "IntersectionC", - "<[", - "IntersectionC", - "<[", - "TypeC", - "<{ filterNames: ", - "Type", - "<(\"host\" | \"location\" | \"browser\" | \"serviceName\" | \"agentName\" | \"containerId\" | \"podName\" | \"transactionResult\" | \"serviceVersion\" | \"transactionUrl\" | \"device\" | \"os\")[], string, unknown>; }>, ", - "TypeC", - "<{ uiFilters: ", - "StringC", - "; }>, ", - "TypeC", - "<{ start: ", - "Type", - "<number, string, unknown>; end: ", - "Type", - "<number, string, unknown>; }>]>, ", - "TypeC", - "<{}>]>; }>, ", - { - "pluginId": "apm", - "scope": "server", - "docId": "kibApmPluginApi", - "section": "def-server.APMRouteHandlerResources", - "text": "APMRouteHandlerResources" - }, - ", { localUiFilters: { options: any[]; name: \"host\" | \"location\" | \"browser\" | \"serviceName\" | \"agentName\" | \"containerId\" | \"podName\" | \"transactionResult\" | \"serviceVersion\" | \"transactionUrl\" | \"device\" | \"os\"; title: string; fieldName: string; }[]; }, ", - "APMRouteCreateOptions", ">; } & { \"GET /api/apm/service-map\": ", "ServerRoute", "<\"GET /api/apm/service-map\", ", @@ -2429,6 +2405,26 @@ "ProcessorEvent", ">; }, ", "APMRouteCreateOptions", + ">; } & { \"GET /api/apm/transactions/{transactionId}\": ", + "ServerRoute", + "<\"GET /api/apm/transactions/{transactionId}\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ transactionId: ", + "StringC", + "; }>; }>, ", + { + "pluginId": "apm", + "scope": "server", + "docId": "kibApmPluginApi", + "section": "def-server.APMRouteHandlerResources", + "text": "APMRouteHandlerResources" + }, + ", { transaction: TypeOfProcessorEvent<", + "ProcessorEvent", + ">; }, ", + "APMRouteCreateOptions", ">; } & { \"GET /api/apm/services/{serviceName}/transactions/groups\": ", "ServerRoute", "<\"GET /api/apm/services/{serviceName}/transactions/groups\", ", @@ -3569,11 +3565,99 @@ }, ", { result: string; }, ", "APMRouteCreateOptions", + ">; } & { \"GET /api/apm/sourcemaps\": ", + "ServerRoute", + "<\"GET /api/apm/sourcemaps\", undefined, ", + { + "pluginId": "apm", + "scope": "server", + "docId": "kibApmPluginApi", + "section": "def-server.APMRouteHandlerResources", + "text": "APMRouteHandlerResources" + }, + ", { artifacts: ", + "ArtifactSourceMap", + "[]; } | undefined, ", + "APMRouteCreateOptions", + ">; } & { \"POST /api/apm/sourcemaps\": ", + "ServerRoute", + "<\"POST /api/apm/sourcemaps\", ", + "TypeC", + "<{ body: ", + "TypeC", + "<{ service_name: ", + "StringC", + "; service_version: ", + "StringC", + "; bundle_filepath: ", + "StringC", + "; sourcemap: ", + "Type", + "<{ version: number; sources: string[]; mappings: string; } & { names?: string[] | undefined; file?: string | undefined; sourceRoot?: string | undefined; sourcesContent?: string[] | undefined; }, string, unknown>; }>; }>, ", + { + "pluginId": "apm", + "scope": "server", + "docId": "kibApmPluginApi", + "section": "def-server.APMRouteHandlerResources", + "text": "APMRouteHandlerResources" + }, + ", ", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.Artifact", + "text": "Artifact" + }, + " | undefined, ", + "APMRouteCreateOptions", + ">; } & { \"DELETE /api/apm/sourcemaps/{id}\": ", + "ServerRoute", + "<\"DELETE /api/apm/sourcemaps/{id}\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ id: ", + "StringC", + "; }>; }>, ", + { + "pluginId": "apm", + "scope": "server", + "docId": "kibApmPluginApi", + "section": "def-server.APMRouteHandlerResources", + "text": "APMRouteHandlerResources" + }, + ", void, ", + "APMRouteCreateOptions", + ">; } & { \"GET /api/apm/fleet/has_data\": ", + "ServerRoute", + "<\"GET /api/apm/fleet/has_data\", undefined, ", + { + "pluginId": "apm", + "scope": "server", + "docId": "kibApmPluginApi", + "section": "def-server.APMRouteHandlerResources", + "text": "APMRouteHandlerResources" + }, + ", { hasData: boolean; }, ", + "APMRouteCreateOptions", + ">; } & { \"GET /api/apm/fleet/agents\": ", + "ServerRoute", + "<\"GET /api/apm/fleet/agents\", undefined, ", + { + "pluginId": "apm", + "scope": "server", + "docId": "kibApmPluginApi", + "section": "def-server.APMRouteHandlerResources", + "text": "APMRouteHandlerResources" + }, + ", { cloudStandaloneSetup: { apmServerUrl: string | undefined; secretToken: string | undefined; } | undefined; fleetAgents: { id: string; name: string; apmServerUrl: any; secretToken: any; }[]; }, ", + "APMRouteCreateOptions", ">; }>" ], "source": { "path": "x-pack/plugins/apm/server/routes/get_global_apm_server_route_repository.ts", - "lineNumber": 60 + "lineNumber": 64 }, "deprecated": false, "initialIsOpen": false @@ -3625,7 +3709,7 @@ "description": [], "source": { "path": "x-pack/plugins/apm/server/types.ts", - "lineNumber": 51 + "lineNumber": 55 }, "deprecated": false, "children": [ @@ -3644,7 +3728,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/types.ts", - "lineNumber": 52 + "lineNumber": 56 }, "deprecated": false }, @@ -3662,7 +3746,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/types.ts", - "lineNumber": 53 + "lineNumber": 57 }, "deprecated": false, "returnComment": [], @@ -3688,7 +3772,7 @@ "ApmPluginRequestHandlerContext", "; }) => Promise<{ search<TParams extends ", "APMEventESSearchRequest", - ">(params: TParams, { includeLegacyData }?: { includeLegacyData?: boolean | undefined; }): Promise<", + ">(operationName: string, params: TParams): Promise<", "InferSearchResponseOf", "<TypeOfProcessorEvent<", "ValuesType", @@ -3696,7 +3780,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/types.ts", - "lineNumber": 54 + "lineNumber": 58 }, "deprecated": false, "returnComment": [], @@ -3723,7 +3807,7 @@ ], "source": { "path": "x-pack/plugins/apm/server/types.ts", - "lineNumber": 54 + "lineNumber": 58 }, "deprecated": false } diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index e2a4ee9e7ea7ab..39a83ca232d386 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import apmObj from './apm.json'; diff --git a/api_docs/apm_oss.mdx b/api_docs/apm_oss.mdx index 2a03249734f9c9..21ea33f8e0a808 100644 --- a/api_docs/apm_oss.mdx +++ b/api_docs/apm_oss.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmOss'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import apmOssObj from './apm_oss.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index d9727cb817e26a..648419f56a6a90 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import bannersObj from './banners.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 217e190831313b..113cf589fde004 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import bfetchObj from './bfetch.json'; Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 9d8707ab778e6b..8b4ef2437d278f 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import canvasObj from './canvas.json'; diff --git a/api_docs/cases.json b/api_docs/cases.json index cccf5de2710e28..ed244cfe1f9852 100644 --- a/api_docs/cases.json +++ b/api_docs/cases.json @@ -246,7 +246,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/plugin.ts", - "lineNumber": 92 + "lineNumber": 80 }, "deprecated": false, "children": [], @@ -310,7 +310,7 @@ "description": [], "signature": [ "CasesNavigation", - "<MouseEvent | React.MouseEvent<Element, MouseEvent>, null>" + "<MouseEvent | React.MouseEvent<Element, MouseEvent> | null, null>" ], "source": { "path": "x-pack/plugins/cases/public/components/all_cases/index.tsx", @@ -327,7 +327,7 @@ "description": [], "signature": [ "CasesNavigation", - "<MouseEvent | React.MouseEvent<Element, MouseEvent>, null>" + "<MouseEvent | React.MouseEvent<Element, MouseEvent> | null, null>" ], "source": { "path": "x-pack/plugins/cases/public/components/all_cases/index.tsx", @@ -335,6 +335,38 @@ }, "deprecated": false }, + { + "parentPluginId": "cases", + "id": "def-public.AllCasesProps.disableAlerts", + "type": "CompoundType", + "tags": [], + "label": "disableAlerts", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/cases/public/components/all_cases/index.tsx", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "cases", + "id": "def-public.AllCasesProps.showTitle", + "type": "CompoundType", + "tags": [], + "label": "showTitle", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/cases/public/components/all_cases/index.tsx", + "lineNumber": 18 + }, + "deprecated": false + }, { "parentPluginId": "cases", "id": "def-public.AllCasesProps.userCanCrud", @@ -344,7 +376,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/public/components/all_cases/index.tsx", - "lineNumber": 17 + "lineNumber": 19 }, "deprecated": false } @@ -416,7 +448,7 @@ "description": [], "signature": [ "CasesNavigation", - "<MouseEvent | React.MouseEvent<Element, MouseEvent>, null>" + "<MouseEvent | React.MouseEvent<Element, MouseEvent> | null, null>" ], "source": { "path": "x-pack/plugins/cases/public/components/all_cases/selector_modal/index.tsx", @@ -573,7 +605,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/case_view/index.tsx", - "lineNumber": 63 + "lineNumber": 65 }, "deprecated": false, "children": [ @@ -597,7 +629,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/case_view/index.tsx", - "lineNumber": 64 + "lineNumber": 66 }, "deprecated": false }, @@ -614,7 +646,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/case_view/index.tsx", - "lineNumber": 65 + "lineNumber": 67 }, "deprecated": false } @@ -641,7 +673,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/configure_cases/index.tsx", - "lineNumber": 55 + "lineNumber": 51 }, "deprecated": false, "children": [ @@ -654,7 +686,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/public/components/configure_cases/index.tsx", - "lineNumber": 56 + "lineNumber": 52 }, "deprecated": false } @@ -732,6 +764,22 @@ }, "deprecated": false }, + { + "parentPluginId": "cases", + "id": "def-public.CreateCaseProps.disableAlerts", + "type": "CompoundType", + "tags": [], + "label": "disableAlerts", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/cases/public/components/create/index.tsx", + "lineNumber": 37 + }, + "deprecated": false + }, { "parentPluginId": "cases", "id": "def-public.CreateCaseProps.hideConnectorServiceNowSir", @@ -744,7 +792,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/create/index.tsx", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false }, @@ -760,7 +808,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/create/index.tsx", - "lineNumber": 38 + "lineNumber": 39 }, "deprecated": false, "returnComment": [], @@ -786,7 +834,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/create/index.tsx", - "lineNumber": 39 + "lineNumber": 40 }, "deprecated": false, "returnComment": [], @@ -809,7 +857,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/create/index.tsx", - "lineNumber": 39 + "lineNumber": 40 }, "deprecated": false } @@ -828,7 +876,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/create/index.tsx", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false }, @@ -844,7 +892,7 @@ ], "source": { "path": "x-pack/plugins/cases/public/components/create/index.tsx", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false } @@ -884,7 +932,7 @@ "description": [], "signature": [ "CasesNavigation", - "<MouseEvent | React.MouseEvent<Element, MouseEvent>, null>" + "<MouseEvent | React.MouseEvent<Element, MouseEvent> | null, null>" ], "source": { "path": "x-pack/plugins/cases/public/components/recent_cases/index.tsx", @@ -920,7 +968,7 @@ "description": [], "signature": [ "CasesNavigation", - "<MouseEvent | React.MouseEvent<Element, MouseEvent>, null>" + "<MouseEvent | React.MouseEvent<Element, MouseEvent> | null, null>" ], "source": { "path": "x-pack/plugins/cases/public/components/recent_cases/index.tsx", @@ -928,6 +976,19 @@ }, "deprecated": false }, + { + "parentPluginId": "cases", + "id": "def-public.RecentCasesProps.hasWritePermissions", + "type": "boolean", + "tags": [], + "label": "hasWritePermissions", + "description": [], + "source": { + "path": "x-pack/plugins/cases/public/components/recent_cases/index.tsx", + "lineNumber": 24 + }, + "deprecated": false + }, { "parentPluginId": "cases", "id": "def-public.RecentCasesProps.maxCasesToShow", @@ -937,7 +998,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/public/components/recent_cases/index.tsx", - "lineNumber": 24 + "lineNumber": 25 }, "deprecated": false } @@ -2305,7 +2366,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 145 + "lineNumber": 162 }, "deprecated": false, "children": [ @@ -2318,7 +2379,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 146 + "lineNumber": 163 }, "deprecated": false }, @@ -2331,7 +2392,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 147 + "lineNumber": 164 }, "deprecated": false }, @@ -2344,7 +2405,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 148 + "lineNumber": 165 }, "deprecated": false }, @@ -2357,7 +2418,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 149 + "lineNumber": 166 }, "deprecated": false }, @@ -2370,7 +2431,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 150 + "lineNumber": 167 }, "deprecated": false } @@ -2403,7 +2464,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 113 + "lineNumber": 130 }, "deprecated": false, "children": [ @@ -2426,7 +2487,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 114 + "lineNumber": 131 }, "deprecated": false }, @@ -2439,7 +2500,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 115 + "lineNumber": 132 }, "deprecated": false }, @@ -2452,7 +2513,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 116 + "lineNumber": 133 }, "deprecated": false }, @@ -2465,7 +2526,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 117 + "lineNumber": 134 }, "deprecated": false } @@ -2481,7 +2542,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 136 + "lineNumber": 153 }, "deprecated": false, "children": [ @@ -2497,7 +2558,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 137 + "lineNumber": 154 }, "deprecated": false } @@ -2513,7 +2574,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 140 + "lineNumber": 157 }, "deprecated": false, "children": [ @@ -2526,7 +2587,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 141 + "lineNumber": 158 }, "deprecated": false }, @@ -2539,7 +2600,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 142 + "lineNumber": 159 }, "deprecated": false }, @@ -2552,7 +2613,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 143 + "lineNumber": 160 }, "deprecated": false } @@ -2578,7 +2639,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 81 + "lineNumber": 98 }, "deprecated": false, "children": [ @@ -2606,6 +2667,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -2630,11 +2699,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; })" + ".swimlane; fields: { caseId: string | null; } | null; })" ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 82 + "lineNumber": 99 }, "deprecated": false }, @@ -2647,7 +2716,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 83 + "lineNumber": 100 }, "deprecated": false }, @@ -2670,7 +2739,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 84 + "lineNumber": 101 }, "deprecated": false }, @@ -2693,7 +2762,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 85 + "lineNumber": 102 }, "deprecated": false }, @@ -2709,7 +2778,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 86 + "lineNumber": 103 }, "deprecated": false }, @@ -2725,7 +2794,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 87 + "lineNumber": 104 }, "deprecated": false }, @@ -2741,7 +2810,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 88 + "lineNumber": 105 }, "deprecated": false }, @@ -2763,7 +2832,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 89 + "lineNumber": 106 }, "deprecated": false } @@ -2779,7 +2848,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 49 + "lineNumber": 66 }, "deprecated": false, "children": [ @@ -2792,7 +2861,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 50 + "lineNumber": 67 }, "deprecated": false }, @@ -2814,7 +2883,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 51 + "lineNumber": 68 }, "deprecated": false }, @@ -2827,7 +2896,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 52 + "lineNumber": 69 }, "deprecated": false }, @@ -2840,7 +2909,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 53 + "lineNumber": 70 }, "deprecated": false }, @@ -2853,7 +2922,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 54 + "lineNumber": 71 }, "deprecated": false }, @@ -2866,7 +2935,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 55 + "lineNumber": 72 }, "deprecated": false }, @@ -2879,7 +2948,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 56 + "lineNumber": 73 }, "deprecated": false } @@ -2895,7 +2964,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 107 + "lineNumber": 124 }, "deprecated": false, "children": [ @@ -2911,7 +2980,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 108 + "lineNumber": 125 }, "deprecated": false }, @@ -2927,7 +2996,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 109 + "lineNumber": 126 }, "deprecated": false }, @@ -2943,7 +3012,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 110 + "lineNumber": 127 }, "deprecated": false } @@ -2959,7 +3028,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 37 + "lineNumber": 54 }, "deprecated": false, "children": [ @@ -2972,7 +3041,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 38 + "lineNumber": 55 }, "deprecated": false }, @@ -2988,7 +3057,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 39 + "lineNumber": 56 }, "deprecated": false }, @@ -3004,7 +3073,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 40 + "lineNumber": 57 }, "deprecated": false }, @@ -3017,7 +3086,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 41 + "lineNumber": 58 }, "deprecated": false }, @@ -3039,7 +3108,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 42 + "lineNumber": 59 }, "deprecated": false }, @@ -3052,7 +3121,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 43 + "lineNumber": 60 }, "deprecated": false }, @@ -3068,7 +3137,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 44 + "lineNumber": 61 }, "deprecated": false }, @@ -3084,7 +3153,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 45 + "lineNumber": 62 }, "deprecated": false }, @@ -3100,7 +3169,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 46 + "lineNumber": 63 }, "deprecated": false } @@ -3116,7 +3185,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 153 + "lineNumber": 170 }, "deprecated": false, "children": [ @@ -3129,7 +3198,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 154 + "lineNumber": 171 }, "deprecated": false }, @@ -3152,7 +3221,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 155 + "lineNumber": 172 }, "deprecated": false }, @@ -3163,12 +3232,9 @@ "tags": [], "label": "title", "description": [], - "signature": [ - "string | undefined" - ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 156 + "lineNumber": 173 }, "deprecated": false } @@ -3184,7 +3250,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 226 + "lineNumber": 243 }, "deprecated": false, "children": [ @@ -3197,7 +3263,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 227 + "lineNumber": 244 }, "deprecated": false }, @@ -3213,7 +3279,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 228 + "lineNumber": 245 }, "deprecated": false }, @@ -3236,7 +3302,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 229 + "lineNumber": 246 }, "deprecated": false } @@ -3252,7 +3318,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 125 + "lineNumber": 142 }, "deprecated": false, "children": [ @@ -3268,7 +3334,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 126 + "lineNumber": 143 }, "deprecated": false }, @@ -3284,7 +3350,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 127 + "lineNumber": 144 }, "deprecated": false }, @@ -3300,7 +3366,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 128 + "lineNumber": 145 }, "deprecated": false } @@ -3316,7 +3382,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 100 + "lineNumber": 112 }, "deprecated": false, "children": [ @@ -3329,7 +3395,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 101 + "lineNumber": 113 }, "deprecated": false }, @@ -3342,7 +3408,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 102 + "lineNumber": 114 }, "deprecated": false }, @@ -3364,7 +3430,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 103 + "lineNumber": 115 }, "deprecated": false }, @@ -3387,7 +3453,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 104 + "lineNumber": 116 }, "deprecated": false } @@ -3420,7 +3486,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 131 + "lineNumber": 148 }, "deprecated": false, "children": [ @@ -3443,7 +3509,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 132 + "lineNumber": 149 }, "deprecated": false }, @@ -3467,7 +3533,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 133 + "lineNumber": 150 }, "deprecated": false } @@ -3483,7 +3549,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 159 + "lineNumber": 176 }, "deprecated": false, "children": [ @@ -3496,7 +3562,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 160 + "lineNumber": 177 }, "deprecated": false }, @@ -3512,7 +3578,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 161 + "lineNumber": 178 }, "deprecated": false } @@ -3528,7 +3594,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 99 + "lineNumber": 116 }, "deprecated": false, "children": [ @@ -3541,7 +3607,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 100 + "lineNumber": 117 }, "deprecated": false }, @@ -3564,7 +3630,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 101 + "lineNumber": 118 }, "deprecated": false }, @@ -3580,7 +3646,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 102 + "lineNumber": 119 }, "deprecated": false }, @@ -3596,7 +3662,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 103 + "lineNumber": 120 }, "deprecated": false }, @@ -3612,7 +3678,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 104 + "lineNumber": 121 }, "deprecated": false } @@ -3628,7 +3694,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 92 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -3641,7 +3707,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 93 + "lineNumber": 110 }, "deprecated": false }, @@ -3654,7 +3720,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 94 + "lineNumber": 111 }, "deprecated": false }, @@ -3676,7 +3742,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 95 + "lineNumber": 112 }, "deprecated": false }, @@ -3692,7 +3758,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 96 + "lineNumber": 113 }, "deprecated": false } @@ -3708,7 +3774,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 179 + "lineNumber": 196 }, "deprecated": false, "children": [ @@ -3724,7 +3790,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 180 + "lineNumber": 197 }, "deprecated": false }, @@ -3740,7 +3806,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 181 + "lineNumber": 198 }, "deprecated": false }, @@ -3756,7 +3822,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 182 + "lineNumber": 199 }, "deprecated": false }, @@ -3772,7 +3838,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 183 + "lineNumber": 200 }, "deprecated": false }, @@ -3788,7 +3854,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 184 + "lineNumber": 201 }, "deprecated": false }, @@ -3804,7 +3870,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 185 + "lineNumber": 202 }, "deprecated": false }, @@ -3820,7 +3886,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 186 + "lineNumber": 203 }, "deprecated": false }, @@ -3836,7 +3902,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 187 + "lineNumber": 204 }, "deprecated": false }, @@ -3852,7 +3918,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 188 + "lineNumber": 205 }, "deprecated": false }, @@ -3868,7 +3934,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 189 + "lineNumber": 206 }, "deprecated": false }, @@ -3884,7 +3950,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 190 + "lineNumber": 207 }, "deprecated": false }, @@ -3900,7 +3966,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 191 + "lineNumber": 208 }, "deprecated": false }, @@ -3916,7 +3982,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 192 + "lineNumber": 209 }, "deprecated": false }, @@ -3932,7 +3998,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 193 + "lineNumber": 210 }, "deprecated": false }, @@ -3948,7 +4014,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 194 + "lineNumber": 211 }, "deprecated": false }, @@ -3964,7 +4030,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 195 + "lineNumber": 212 }, "deprecated": false }, @@ -3980,7 +4046,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 196 + "lineNumber": 213 }, "deprecated": false }, @@ -3996,7 +4062,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 197 + "lineNumber": 214 }, "deprecated": false }, @@ -4012,7 +4078,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 198 + "lineNumber": 215 }, "deprecated": false }, @@ -4028,7 +4094,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 199 + "lineNumber": 216 }, "deprecated": false }, @@ -4044,7 +4110,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 200 + "lineNumber": 217 }, "deprecated": false }, @@ -4060,7 +4126,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 201 + "lineNumber": 218 }, "deprecated": false }, @@ -4076,7 +4142,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 202 + "lineNumber": 219 }, "deprecated": false }, @@ -4092,7 +4158,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 203 + "lineNumber": 220 }, "deprecated": false }, @@ -4108,7 +4174,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 204 + "lineNumber": 221 }, "deprecated": false }, @@ -4124,7 +4190,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 205 + "lineNumber": 222 }, "deprecated": false }, @@ -4140,7 +4206,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 206 + "lineNumber": 223 }, "deprecated": false }, @@ -4156,7 +4222,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 207 + "lineNumber": 224 }, "deprecated": false }, @@ -4172,7 +4238,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 208 + "lineNumber": 225 }, "deprecated": false }, @@ -4188,7 +4254,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 209 + "lineNumber": 226 }, "deprecated": false }, @@ -4204,7 +4270,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 210 + "lineNumber": 227 }, "deprecated": false }, @@ -4220,7 +4286,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 211 + "lineNumber": 228 }, "deprecated": false }, @@ -4236,7 +4302,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 212 + "lineNumber": 229 }, "deprecated": false }, @@ -4252,7 +4318,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 213 + "lineNumber": 230 }, "deprecated": false } @@ -4268,7 +4334,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 216 + "lineNumber": 233 }, "deprecated": false, "children": [ @@ -4291,7 +4357,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 217 + "lineNumber": 234 }, "deprecated": false }, @@ -4307,7 +4373,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 218 + "lineNumber": 235 }, "deprecated": false }, @@ -4323,7 +4389,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 219 + "lineNumber": 236 }, "deprecated": false }, @@ -4339,7 +4405,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 220 + "lineNumber": 237 }, "deprecated": false }, @@ -4355,7 +4421,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 223 + "lineNumber": 240 }, "deprecated": false } @@ -4381,7 +4447,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 76 + "lineNumber": 93 }, "deprecated": false, "children": [ @@ -4403,7 +4469,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 77 + "lineNumber": 94 }, "deprecated": false }, @@ -4416,7 +4482,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 78 + "lineNumber": 95 }, "deprecated": false } @@ -4432,7 +4498,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 169 + "lineNumber": 186 }, "deprecated": false, "children": [ @@ -4448,7 +4514,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 170 + "lineNumber": 187 }, "deprecated": false }, @@ -4476,6 +4542,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -4500,11 +4574,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }) | { syncAlerts: boolean; } | undefined" + ".swimlane; fields: { caseId: string | null; } | null; }) | { syncAlerts: boolean; } | undefined" ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 171 + "lineNumber": 188 }, "deprecated": false }, @@ -4520,7 +4594,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 172 + "lineNumber": 189 }, "deprecated": false }, @@ -4544,7 +4618,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 173 + "lineNumber": 190 }, "deprecated": false }, @@ -4566,7 +4640,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 174 + "lineNumber": 191 }, "deprecated": false }, @@ -4582,7 +4656,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 175 + "lineNumber": 192 }, "deprecated": false }, @@ -4598,7 +4672,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 176 + "lineNumber": 193 }, "deprecated": false } @@ -4618,7 +4692,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 34 + "lineNumber": 19 }, "deprecated": false, "initialIsOpen": false @@ -4646,7 +4720,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 17 + "lineNumber": 39 }, "deprecated": false, "initialIsOpen": false @@ -4660,7 +4734,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 53 + "lineNumber": 38 }, "deprecated": false, "initialIsOpen": false @@ -4674,7 +4748,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 33 + "lineNumber": 35 }, "deprecated": false, "initialIsOpen": false @@ -4688,26 +4762,40 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 120 + "lineNumber": 137 }, "deprecated": false, "initialIsOpen": false - } - ], - "misc": [ + }, { "parentPluginId": "cases", - "id": "def-common.ACTION_TYPES_URL", - "type": "string", + "id": "def-common.SwimlaneConnectorType", + "type": "Enum", "tags": [], - "label": "ACTION_TYPES_URL", + "label": "SwimlaneConnectorType", "description": [], - "signature": [ - "\"/api/actions/list_action_types\"" + "source": { + "path": "x-pack/plugins/cases/common/api/connectors/swimlane.ts", + "lineNumber": 15 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "cases", + "id": "def-common.ACTION_TYPES_URL", + "type": "string", + "tags": [], + "label": "ACTION_TYPES_URL", + "description": [], + "signature": [ + "\"/api/actions/list_action_types\"" ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 60 + "lineNumber": 63 }, "deprecated": false, "initialIsOpen": false @@ -4726,7 +4814,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 59 + "lineNumber": 62 }, "deprecated": false, "initialIsOpen": false @@ -4749,7 +4837,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 22 + "lineNumber": 24 }, "deprecated": false, "initialIsOpen": false @@ -4789,7 +4877,24 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 23 + "lineNumber": 25 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.AlertResponse", + "type": "Type", + "tags": [], + "label": "AlertResponse", + "description": [], + "signature": [ + "{ id: string; index: string; attached_at: string; }[]" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/cases/alerts.ts", + "lineNumber": 18 }, "deprecated": false, "initialIsOpen": false @@ -4846,7 +4951,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 149 + "lineNumber": 134 }, "deprecated": false, "initialIsOpen": false @@ -4863,7 +4968,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 313 + "lineNumber": 335 }, "deprecated": false, "initialIsOpen": false @@ -4880,7 +4985,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 312 + "lineNumber": 334 }, "deprecated": false, "initialIsOpen": false @@ -4897,7 +5002,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 10 + "lineNumber": 12 }, "deprecated": false, "initialIsOpen": false @@ -4938,7 +5043,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 143 + "lineNumber": 128 }, "deprecated": false, "initialIsOpen": false @@ -4971,7 +5076,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 144 + "lineNumber": 129 }, "deprecated": false, "initialIsOpen": false @@ -4985,7 +5090,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 53 + "lineNumber": 55 }, "deprecated": false, "initialIsOpen": false @@ -4999,7 +5104,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 46 + "lineNumber": 48 }, "deprecated": false, "initialIsOpen": false @@ -5016,7 +5121,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 16 + "lineNumber": 18 }, "deprecated": false, "initialIsOpen": false @@ -5030,7 +5135,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 45 + "lineNumber": 47 }, "deprecated": false, "initialIsOpen": false @@ -5044,7 +5149,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 38 + "lineNumber": 40 }, "deprecated": false, "initialIsOpen": false @@ -5058,7 +5163,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 37 + "lineNumber": 39 }, "deprecated": false, "initialIsOpen": false @@ -5075,7 +5180,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 17 + "lineNumber": 19 }, "deprecated": false, "initialIsOpen": false @@ -5089,7 +5194,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 36 + "lineNumber": 38 }, "deprecated": false, "initialIsOpen": false @@ -5106,7 +5211,21 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 13 + "lineNumber": 15 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CASE_DETAILS_ALERTS_URL", + "type": "string", + "tags": [], + "label": "CASE_DETAILS_ALERTS_URL", + "description": [], + "source": { + "path": "x-pack/plugins/cases/common/constants.ts", + "lineNumber": 56 }, "deprecated": false, "initialIsOpen": false @@ -5120,7 +5239,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 35 + "lineNumber": 37 }, "deprecated": false, "initialIsOpen": false @@ -5134,7 +5253,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 47 + "lineNumber": 49 }, "deprecated": false, "initialIsOpen": false @@ -5148,7 +5267,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 48 + "lineNumber": 50 }, "deprecated": false, "initialIsOpen": false @@ -5165,7 +5284,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 12 + "lineNumber": 14 }, "deprecated": false, "initialIsOpen": false @@ -5179,7 +5298,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 49 + "lineNumber": 51 }, "deprecated": false, "initialIsOpen": false @@ -5193,7 +5312,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 50 + "lineNumber": 52 }, "deprecated": false, "initialIsOpen": false @@ -5210,7 +5329,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 15 + "lineNumber": 17 }, "deprecated": false, "initialIsOpen": false @@ -5224,7 +5343,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 51 + "lineNumber": 53 }, "deprecated": false, "initialIsOpen": false @@ -5269,6 +5388,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5293,11 +5420,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }" + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 288 + "lineNumber": 310 }, "deprecated": false, "initialIsOpen": false @@ -5326,6 +5453,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5350,11 +5485,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; })" + ".swimlane; fields: { caseId: string | null; } | null; })" ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 82 + "lineNumber": 93 }, "deprecated": false, "initialIsOpen": false @@ -5388,7 +5523,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 303 + "lineNumber": 325 }, "deprecated": false, "initialIsOpen": false @@ -5433,6 +5568,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5457,11 +5600,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }) | undefined; settings?: { syncAlerts: boolean; } | undefined; owner?: string | undefined; } & { id: string; version: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }) | undefined; settings?: { syncAlerts: boolean; } | undefined; owner?: string | undefined; } & { id: string; version: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 301 + "lineNumber": 323 }, "deprecated": false, "initialIsOpen": false @@ -5498,6 +5641,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5522,11 +5673,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 295 + "lineNumber": 317 }, "deprecated": false, "initialIsOpen": false @@ -5571,6 +5722,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5595,7 +5754,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { subCaseIds?: string[] | undefined; subCases?: ({ status: ", + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { subCaseIds?: string[] | undefined; subCases?: ({ status: ", { "pluginId": "cases", "scope": "common", @@ -5687,7 +5846,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 296 + "lineNumber": 318 }, "deprecated": false, "initialIsOpen": false @@ -5706,7 +5865,24 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 34 + "lineNumber": 36 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesByAlertId", + "type": "Type", + "tags": [], + "label": "CasesByAlertId", + "description": [], + "signature": [ + "{ id: string; title: string; }[]" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/cases/case.ts", + "lineNumber": 338 }, "deprecated": false, "initialIsOpen": false @@ -5723,7 +5899,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 299 + "lineNumber": 321 }, "deprecated": false, "initialIsOpen": false @@ -5762,6 +5938,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5786,11 +5970,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 294 + "lineNumber": 316 }, "deprecated": false, "initialIsOpen": false @@ -5819,6 +6003,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5843,7 +6035,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { mappings: { action_type: \"append\" | \"overwrite\" | \"nothing\"; source: \"description\" | \"title\" | \"comments\"; target: string; }[]; owner: string; } & { id: string; version: string; error: string | null; owner: string; })[]" + ".swimlane; fields: { caseId: string | null; } | null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { mappings: { action_type: \"append\" | \"overwrite\" | \"nothing\"; source: \"description\" | \"title\" | \"comments\"; target: string; }[]; owner: string; } & { id: string; version: string; error: string | null; owner: string; })[]" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/configure.ts", @@ -5876,6 +6068,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5900,7 +6100,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/configure.ts", @@ -5933,6 +6133,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -5957,7 +6165,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }" + ".swimlane; fields: { caseId: string | null; } | null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/configure.ts", @@ -5990,6 +6198,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -6014,7 +6230,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }) | undefined; closure_type?: \"close-by-user\" | \"close-by-pushing\" | undefined; } & { version: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }) | undefined; closure_type?: \"close-by-user\" | \"close-by-pushing\" | undefined; } & { version: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/configure.ts", @@ -6047,6 +6263,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -6071,7 +6295,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/configure.ts", @@ -6104,6 +6328,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -6128,7 +6360,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { mappings: { action_type: \"append\" | \"overwrite\" | \"nothing\"; source: \"description\" | \"title\" | \"comments\"; target: string; }[]; owner: string; } & { id: string; version: string; error: string | null; owner: string; }" + ".swimlane; fields: { caseId: string | null; } | null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { mappings: { action_type: \"append\" | \"overwrite\" | \"nothing\"; source: \"description\" | \"title\" | \"comments\"; target: string; }[]; owner: string; } & { id: string; version: string; error: string | null; owner: string; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/configure.ts", @@ -6149,7 +6381,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 304 + "lineNumber": 326 }, "deprecated": false, "initialIsOpen": false @@ -6182,7 +6414,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 298 + "lineNumber": 320 }, "deprecated": false, "initialIsOpen": false @@ -6227,6 +6459,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -6251,7 +6491,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { subCaseIds?: string[] | undefined; subCases?: ({ status: ", + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { subCaseIds?: string[] | undefined; subCases?: ({ status: ", { "pluginId": "cases", "scope": "common", @@ -6343,7 +6583,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 300 + "lineNumber": 322 }, "deprecated": false, "initialIsOpen": false @@ -6388,6 +6628,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -6412,11 +6660,11 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }) | undefined; settings?: { syncAlerts: boolean; } | undefined; owner?: string | undefined; } & { id: string; version: string; })[]; }" + ".swimlane; fields: { caseId: string | null; } | null; }) | undefined; settings?: { syncAlerts: boolean; } | undefined; owner?: string | undefined; } & { id: string; version: string; })[]; }" ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 302 + "lineNumber": 324 }, "deprecated": false, "initialIsOpen": false @@ -6461,6 +6709,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -6485,7 +6741,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { subCaseIds?: string[] | undefined; subCases?: ({ status: ", + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { subCaseIds?: string[] | undefined; subCases?: ({ status: ", { "pluginId": "cases", "scope": "common", @@ -6577,7 +6833,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 297 + "lineNumber": 319 }, "deprecated": false, "initialIsOpen": false @@ -6678,7 +6934,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 25 + "lineNumber": 47 }, "deprecated": false, "initialIsOpen": false @@ -6734,6 +6990,25 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "cases", + "id": "def-common.CaseViewRefreshPropInterface", + "type": "Type", + "tags": [], + "label": "CaseViewRefreshPropInterface", + "description": [ + "\nThe type for the `refreshRef` prop (a `React.Ref`) defined by the `CaseViewComponentProps`.\n" + ], + "signature": [ + "{ refreshUserActionsAndComments: () => Promise<void>; refreshCase: () => Promise<void>; } | null" + ], + "source": { + "path": "x-pack/plugins/cases/common/ui/types.ts", + "lineNumber": 33 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "cases", "id": "def-common.ClosureType", @@ -6835,7 +7110,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 26 + "lineNumber": 43 }, "deprecated": false, "initialIsOpen": false @@ -6892,7 +7167,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 145 + "lineNumber": 130 }, "deprecated": false, "initialIsOpen": false @@ -6941,7 +7216,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 152 + "lineNumber": 137 }, "deprecated": false, "initialIsOpen": false @@ -6982,7 +7257,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 151 + "lineNumber": 136 }, "deprecated": false, "initialIsOpen": false @@ -7023,7 +7298,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 146 + "lineNumber": 131 }, "deprecated": false, "initialIsOpen": false @@ -7056,7 +7331,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 154 + "lineNumber": 139 }, "deprecated": false, "initialIsOpen": false @@ -7081,7 +7356,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 153 + "lineNumber": 138 }, "deprecated": false, "initialIsOpen": false @@ -7138,7 +7413,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 147 + "lineNumber": 132 }, "deprecated": false, "initialIsOpen": false @@ -7179,7 +7454,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 148 + "lineNumber": 133 }, "deprecated": false, "initialIsOpen": false @@ -7236,7 +7511,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 150 + "lineNumber": 135 }, "deprecated": false, "initialIsOpen": false @@ -7270,7 +7545,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 92 + "lineNumber": 104 }, "deprecated": false, "initialIsOpen": false @@ -7295,7 +7570,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 84 + "lineNumber": 95 }, "deprecated": false, "initialIsOpen": false @@ -7354,7 +7629,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 85 + "lineNumber": 96 }, "deprecated": false, "initialIsOpen": false @@ -7379,7 +7654,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 86 + "lineNumber": 98 }, "deprecated": false, "initialIsOpen": false @@ -7404,7 +7679,32 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 89 + "lineNumber": 101 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.ConnectorSwimlaneTypeFields", + "type": "Type", + "tags": [], + "label": "ConnectorSwimlaneTypeFields", + "description": [], + "signature": [ + "{ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".swimlane; fields: { caseId: string | null; } | null; }" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/connectors/index.ts", + "lineNumber": 97 }, "deprecated": false, "initialIsOpen": false @@ -7433,6 +7733,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; } | { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; } | { type: ", { "pluginId": "cases", @@ -7457,11 +7765,35 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }" + ".swimlane; fields: { caseId: string | null; } | null; }" ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 83 + "lineNumber": 94 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.connectorTypes", + "type": "Array", + "tags": [], + "label": "connectorTypes", + "description": [], + "signature": [ + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/connectors/index.ts", + "lineNumber": 44 }, "deprecated": false, "initialIsOpen": false @@ -7478,7 +7810,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 7 + "lineNumber": 9 }, "deprecated": false, "initialIsOpen": false @@ -7495,7 +7827,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 8 + "lineNumber": 10 }, "deprecated": false, "initialIsOpen": false @@ -7514,7 +7846,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 90 + "lineNumber": 89 }, "deprecated": false, "initialIsOpen": false @@ -7559,6 +7891,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -7583,7 +7923,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }, \"type\" | \"status\" | \"description\" | \"title\" | \"updated_at\" | \"tags\" | \"settings\" | \"owner\" | \"created_at\" | \"created_by\" | \"updated_by\" | \"closed_at\" | \"closed_by\" | \"external_service\"> & { connector: ", + ".swimlane; fields: { caseId: string | null; } | null; }); settings: { syncAlerts: boolean; }; owner: string; } & { closed_at: string | null; closed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; external_service: ({ connector_id: string; connector_name: string; external_id: string; external_title: string; external_url: string; } & { pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; }) | null; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }, \"type\" | \"status\" | \"description\" | \"title\" | \"updated_at\" | \"tags\" | \"settings\" | \"owner\" | \"created_at\" | \"created_by\" | \"updated_by\" | \"closed_at\" | \"closed_by\" | \"external_service\"> & { connector: ", { "pluginId": "cases", "scope": "common", @@ -7595,7 +7935,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 307 + "lineNumber": 329 }, "deprecated": false, "initialIsOpen": false @@ -7618,7 +7958,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 99 + "lineNumber": 111 }, "deprecated": false, "initialIsOpen": false @@ -7663,6 +8003,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -7687,7 +8035,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }) | undefined; settings?: { syncAlerts: boolean; } | undefined; owner?: string | undefined; } & { id: string; version: string; }, \"type\" | \"status\" | \"description\" | \"title\" | \"id\" | \"version\" | \"tags\" | \"settings\" | \"owner\"> & { connector?: ", + ".swimlane; fields: { caseId: string | null; } | null; }) | undefined; settings?: { syncAlerts: boolean; } | undefined; owner?: string | undefined; } & { id: string; version: string; }, \"type\" | \"status\" | \"description\" | \"title\" | \"id\" | \"version\" | \"tags\" | \"settings\" | \"owner\"> & { connector?: ", { "pluginId": "cases", "scope": "common", @@ -7699,7 +8047,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 308 + "lineNumber": 330 }, "deprecated": false, "initialIsOpen": false @@ -7728,6 +8076,14 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none; fields: null; }) | ({ id: string; name: string; } & { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; }) | ({ id: string; name: string; } & { type: ", { "pluginId": "cases", @@ -7752,7 +8108,7 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none; fields: null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }, \"updated_at\" | \"owner\" | \"created_at\" | \"created_by\" | \"updated_by\" | \"closure_type\"> & { connector: ", + ".swimlane; fields: { caseId: string | null; } | null; }); closure_type: \"close-by-user\" | \"close-by-pushing\"; } & { owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; }; updated_at: string | null; updated_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } | null; }, \"updated_at\" | \"owner\" | \"created_at\" | \"created_by\" | \"updated_by\" | \"closure_type\"> & { connector: ", { "pluginId": "cases", "scope": "common", @@ -7781,7 +8137,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 94 + "lineNumber": 106 }, "deprecated": false, "initialIsOpen": false @@ -7798,7 +8154,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 305 + "lineNumber": 327 }, "deprecated": false, "initialIsOpen": false @@ -7815,7 +8171,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 142 + "lineNumber": 127 }, "deprecated": false, "initialIsOpen": false @@ -7831,8 +8187,8 @@ "{ references: { doc_count: number; caseIds: { buckets: { key: string; }[]; }; }; }" ], "source": { - "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 155 + "path": "x-pack/plugins/cases/common/api/cases/case.ts", + "lineNumber": 337 }, "deprecated": false, "initialIsOpen": false @@ -7856,34 +8212,17 @@ }, { "parentPluginId": "cases", - "id": "def-common.GetFieldsResponse", + "id": "def-common.GetDefaultMappingsResponse", "type": "Type", "tags": [], - "label": "GetFieldsResponse", + "label": "GetDefaultMappingsResponse", "description": [], "signature": [ - "{ defaultMappings: { action_type: \"append\" | \"overwrite\" | \"nothing\"; source: \"description\" | \"title\" | \"comments\"; target: string; }[]; fields: { id: string; name: string; required: boolean; type: \"text\" | \"textarea\"; }[]; }" + "{ action_type: \"append\" | \"overwrite\" | \"nothing\"; source: \"description\" | \"title\" | \"comments\"; target: string; }[]" ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/mappings.ts", - "lineNumber": 56 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "cases", - "id": "def-common.JIRA_ACTION_TYPE_ID", - "type": "string", - "tags": [], - "label": "JIRA_ACTION_TYPE_ID", - "description": [], - "signature": [ - "\".jira\"" - ], - "source": { - "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 63 + "lineNumber": 53 }, "deprecated": false, "initialIsOpen": false @@ -7919,7 +8258,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": false, "initialIsOpen": false @@ -7936,7 +8275,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 97 + "lineNumber": 96 }, "deprecated": false, "initialIsOpen": false @@ -7953,7 +8292,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 96 + "lineNumber": 95 }, "deprecated": false, "initialIsOpen": false @@ -7970,7 +8309,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 77 + "lineNumber": 76 }, "deprecated": false, "initialIsOpen": false @@ -7994,23 +8333,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "cases", - "id": "def-common.RESILIENT_ACTION_TYPE_ID", - "type": "string", - "tags": [], - "label": "RESILIENT_ACTION_TYPE_ID", - "description": [], - "signature": [ - "\".resilient\"" - ], - "source": { - "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 64 - }, - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "cases", "id": "def-common.ResilientFieldsType", @@ -8042,7 +8364,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 22 + "lineNumber": 24 }, "deprecated": false, "initialIsOpen": false @@ -8059,60 +8381,26 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/saved_object.ts", - "lineNumber": 72 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "cases", - "id": "def-common.SECURITY_SOLUTION_OWNER", - "type": "string", - "tags": [], - "label": "SECURITY_SOLUTION_OWNER", - "description": [ - "\nThis must be the same value that the security solution plugin uses to define the case kind when it registers the\nfeature for the 7.13 migration only.\n\nThis variable is being also used by test files and mocks." - ], - "signature": [ - "\"securitySolution\"" - ], - "source": { - "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 85 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "cases", - "id": "def-common.SERVICENOW_ITSM_ACTION_TYPE_ID", - "type": "string", - "tags": [], - "label": "SERVICENOW_ITSM_ACTION_TYPE_ID", - "description": [], - "signature": [ - "\".servicenow\"" - ], - "source": { - "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 61 + "lineNumber": 72 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "cases", - "id": "def-common.SERVICENOW_SIR_ACTION_TYPE_ID", + "id": "def-common.SECURITY_SOLUTION_OWNER", "type": "string", "tags": [], - "label": "SERVICENOW_SIR_ACTION_TYPE_ID", - "description": [], + "label": "SECURITY_SOLUTION_OWNER", + "description": [ + "\nThis must be the same value that the security solution plugin uses to define the case kind when it registers the\nfeature for the 7.13 migration only.\n\nThis variable is being also used by test files and mocks." + ], "signature": [ - "\".servicenow-sir\"" + "\"securitySolution\"" ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 62 + "lineNumber": 84 }, "deprecated": false, "initialIsOpen": false @@ -8194,7 +8482,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 42 + "lineNumber": 44 }, "deprecated": false, "initialIsOpen": false @@ -8211,7 +8499,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 14 + "lineNumber": 16 }, "deprecated": false, "initialIsOpen": false @@ -8225,7 +8513,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 43 + "lineNumber": 45 }, "deprecated": false, "initialIsOpen": false @@ -8239,7 +8527,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 40 + "lineNumber": 42 }, "deprecated": false, "initialIsOpen": false @@ -8253,7 +8541,7 @@ "description": [], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 41 + "lineNumber": 43 }, "deprecated": false, "initialIsOpen": false @@ -8278,7 +8566,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 107 + "lineNumber": 106 }, "deprecated": false, "initialIsOpen": false @@ -8303,7 +8591,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 111 + "lineNumber": 110 }, "deprecated": false, "initialIsOpen": false @@ -8368,7 +8656,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "initialIsOpen": false @@ -8393,7 +8681,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 113 + "lineNumber": 112 }, "deprecated": false, "initialIsOpen": false @@ -8458,7 +8746,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 110 + "lineNumber": 109 }, "deprecated": false, "initialIsOpen": false @@ -8483,7 +8771,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 112 + "lineNumber": 111 }, "deprecated": false, "initialIsOpen": false @@ -8548,7 +8836,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 109 + "lineNumber": 108 }, "deprecated": false, "initialIsOpen": false @@ -8565,7 +8853,24 @@ ], "source": { "path": "x-pack/plugins/cases/common/constants.ts", - "lineNumber": 66 + "lineNumber": 64 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.SwimlaneFieldsType", + "type": "Type", + "tags": [], + "label": "SwimlaneFieldsType", + "description": [], + "signature": [ + "{ caseId: string | null; }" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/connectors/swimlane.ts", + "lineNumber": 21 }, "deprecated": false, "initialIsOpen": false @@ -8599,7 +8904,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/ui/types.ts", - "lineNumber": 164 + "lineNumber": 181 }, "deprecated": false, "initialIsOpen": false @@ -8743,7 +9048,33 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 70 + "lineNumber": 55 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.AlertResponseRt", + "type": "Object", + "tags": [], + "label": "AlertResponseRt", + "description": [], + "signature": [ + "ArrayC", + "<", + "TypeC", + "<{ id: ", + "StringC", + "; index: ", + "StringC", + "; attached_at: ", + "StringC", + "; }>>" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/cases/alerts.ts", + "lineNumber": 16 }, "deprecated": false, "initialIsOpen": false @@ -9099,7 +9430,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 132 + "lineNumber": 117 }, "deprecated": false, "initialIsOpen": false @@ -9455,7 +9786,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 103 + "lineNumber": 88 }, "deprecated": false, "initialIsOpen": false @@ -9481,7 +9812,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 286 + "lineNumber": 308 }, "deprecated": false, "initialIsOpen": false @@ -9507,7 +9838,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 278 + "lineNumber": 300 }, "deprecated": false, "initialIsOpen": false @@ -9643,6 +9974,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -9783,9 +10128,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -9945,7 +10300,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 87 + "lineNumber": 109 }, "deprecated": false, "initialIsOpen": false @@ -10025,6 +10380,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -10165,9 +10534,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", "NullC", - "; }>]>]>; closure_type: ", + "]>; }>, ", + "NullC", + "]>; }>]>]>; closure_type: ", "UnionC", "<[", "LiteralC", @@ -10367,6 +10746,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -10507,9 +10900,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", "NullC", - "; }>]>]>; closure_type: ", + "]>; }>, ", + "NullC", + "]>; }>]>]>; closure_type: ", "UnionC", "<[", "LiteralC", @@ -10687,6 +11090,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -10827,9 +11244,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", "NullC", - "; }>]>]>; closure_type: ", + "]>; }>, ", + "NullC", + "]>; }>]>]>; closure_type: ", "UnionC", "<[", "LiteralC", @@ -11023,6 +11450,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -11163,13 +11604,23 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", "NullC", - "; }>]>]>" + "]>; }>, ", + "NullC", + "]>; }>]>]>" ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 74 + "lineNumber": 85 }, "deprecated": false, "initialIsOpen": false @@ -11305,6 +11756,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -11445,9 +11910,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -11463,7 +11938,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 242 + "lineNumber": 264 }, "deprecated": false, "initialIsOpen": false @@ -11571,6 +12046,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -11711,9 +12200,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -11723,7 +12222,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 142 + "lineNumber": 164 }, "deprecated": false, "initialIsOpen": false @@ -11745,7 +12244,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 253 + "lineNumber": 275 }, "deprecated": false, "initialIsOpen": false @@ -11871,7 +12370,21 @@ "NullC", "]>; }>, ", "NullC", - "]>; }>, ", + "]>; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".none>; fields: ", + "NullC", + "; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -12023,9 +12536,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -13041,7 +13564,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 217 + "lineNumber": 239 }, "deprecated": false, "initialIsOpen": false @@ -13067,7 +13590,31 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 209 + "lineNumber": 231 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CasesByAlertIdRt", + "type": "Object", + "tags": [], + "label": "CasesByAlertIdRt", + "description": [], + "signature": [ + "ArrayC", + "<", + "TypeC", + "<{ id: ", + "StringC", + "; title: ", + "StringC", + "; }>>" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/cases/case.ts", + "lineNumber": 32 }, "deprecated": false, "initialIsOpen": false @@ -13171,6 +13718,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -13311,9 +13872,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -13323,7 +13894,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 131 + "lineNumber": 153 }, "deprecated": false, "initialIsOpen": false @@ -13397,6 +13968,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -13537,9 +14122,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; closure_type: ", + "]>; }>]>]>; closure_type: ", "UnionC", "<[", "LiteralC", @@ -13627,6 +14222,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -13767,9 +14376,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; closure_type: ", + "]>; }>]>]>; closure_type: ", "UnionC", "<[", "LiteralC", @@ -13911,7 +14530,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 150 + "lineNumber": 172 }, "deprecated": false, "initialIsOpen": false @@ -14055,6 +14674,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -14195,9 +14828,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -15227,7 +15870,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 232 + "lineNumber": 254 }, "deprecated": false, "initialIsOpen": false @@ -15367,6 +16010,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -15507,9 +16164,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -15525,7 +16192,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 250 + "lineNumber": 272 }, "deprecated": false, "initialIsOpen": false @@ -15665,6 +16332,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -15805,9 +16486,19 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", "NullC", - "; }>]>]>; settings: ", + "]>; }>]>]>; settings: ", "TypeC", "<{ syncAlerts: ", "BooleanC", @@ -16823,7 +17514,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 251 + "lineNumber": 273 }, "deprecated": false, "initialIsOpen": false @@ -17275,7 +17966,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 39 + "lineNumber": 24 }, "deprecated": false, "initialIsOpen": false @@ -17605,7 +18296,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 120 + "lineNumber": 105 }, "deprecated": false, "initialIsOpen": false @@ -17703,7 +18394,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 105 + "lineNumber": 90 }, "deprecated": false, "initialIsOpen": false @@ -17793,7 +18484,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 85 + "lineNumber": 70 }, "deprecated": false, "initialIsOpen": false @@ -18147,7 +18838,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 87 + "lineNumber": 72 }, "deprecated": false, "initialIsOpen": false @@ -18355,7 +19046,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 95 + "lineNumber": 80 }, "deprecated": false, "initialIsOpen": false @@ -18719,7 +19410,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 125 + "lineNumber": 110 }, "deprecated": false, "initialIsOpen": false @@ -18851,7 +19542,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 25 + "lineNumber": 27 }, "deprecated": false, "initialIsOpen": false @@ -18999,6 +19690,20 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, + ".none>; fields: ", + "NullC", + "; }>, ", + "TypeC", + "<{ type: ", + "LiteralC", + "<", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, ".resilient>; fields: ", "UnionC", "<[", @@ -19139,13 +19844,23 @@ "section": "def-common.ConnectorTypes", "text": "ConnectorTypes" }, - ".none>; fields: ", + ".swimlane>; fields: ", + "UnionC", + "<[", + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", "NullC", - "; }>]>" + "]>; }>, ", + "NullC", + "]>; }>]>" ], "source": { "path": "x-pack/plugins/cases/common/api/connectors/index.ts", - "lineNumber": 66 + "lineNumber": 76 }, "deprecated": false, "initialIsOpen": false @@ -19177,7 +19892,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 59 + "lineNumber": 44 }, "deprecated": false, "initialIsOpen": false @@ -19221,7 +19936,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/case.ts", - "lineNumber": 258 + "lineNumber": 280 }, "deprecated": false, "initialIsOpen": false @@ -19293,7 +20008,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 134 + "lineNumber": 119 }, "deprecated": false, "initialIsOpen": false @@ -19322,8 +20037,8 @@ "; }>>; }>; }>; }>" ], "source": { - "path": "x-pack/plugins/cases/common/api/cases/comment.ts", - "lineNumber": 19 + "path": "x-pack/plugins/cases/common/api/cases/case.ts", + "lineNumber": 23 }, "deprecated": false, "initialIsOpen": false @@ -19773,7 +20488,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 23 + "lineNumber": 22 }, "deprecated": false, "initialIsOpen": false @@ -19831,7 +20546,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 99 + "lineNumber": 98 }, "deprecated": false, "initialIsOpen": false @@ -20345,7 +21060,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": false, "initialIsOpen": false @@ -20425,7 +21140,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 36 + "lineNumber": 35 }, "deprecated": false, "initialIsOpen": false @@ -20959,7 +21674,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 89 + "lineNumber": 88 }, "deprecated": false, "initialIsOpen": false @@ -21021,7 +21736,7 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "initialIsOpen": false @@ -21537,7 +22252,31 @@ ], "source": { "path": "x-pack/plugins/cases/common/api/cases/sub_case.ts", - "lineNumber": 105 + "lineNumber": 104 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.SwimlaneFieldsRT", + "type": "Object", + "tags": [], + "label": "SwimlaneFieldsRT", + "description": [], + "signature": [ + "TypeC", + "<{ caseId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/cases/common/api/connectors/swimlane.ts", + "lineNumber": 11 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 00714b3217fca8..d52ead0690ff16 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import casesObj from './cases.json'; +The Case management system in Kibana - - +Contact [Security Solution Threat Hunting](https://github.com/orgs/elastic/teams/security-threat-hunting) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 406 | 0 | 381 | 13 | +| 441 | 0 | 404 | 14 | ## Client diff --git a/api_docs/charts.json b/api_docs/charts.json index f42832e5d1e95f..0f6623cbc19a86 100644 --- a/api_docs/charts.json +++ b/api_docs/charts.json @@ -1602,7 +1602,13 @@ ], "signature": [ "(state?: T | undefined) => ", - "Ast" + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionAstExpression", + "text": "ExpressionAstExpression" + } ], "source": { "path": "src/plugins/charts/public/services/palettes/types.ts", diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 95d0bd527e631b..16f129214ca95c 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import chartsObj from './charts.json'; diff --git a/api_docs/cloud.json b/api_docs/cloud.json index 2b590695b94376..6aa22f4f4ecf4a 100644 --- a/api_docs/cloud.json +++ b/api_docs/cloud.json @@ -13,7 +13,7 @@ "description": [], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 17 + "lineNumber": 28 }, "deprecated": false, "children": [ @@ -29,7 +29,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 18 + "lineNumber": 29 }, "deprecated": false }, @@ -45,7 +45,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 19 + "lineNumber": 30 }, "deprecated": false }, @@ -61,7 +61,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 20 + "lineNumber": 31 }, "deprecated": false }, @@ -77,7 +77,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 21 + "lineNumber": 32 }, "deprecated": false }, @@ -93,7 +93,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 22 + "lineNumber": 33 }, "deprecated": false }, @@ -109,7 +109,23 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 23 + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "cloud", + "id": "def-public.CloudConfigType.full_story", + "type": "Object", + "tags": [], + "label": "full_story", + "description": [], + "signature": [ + "{ enabled: boolean; org_id?: string | undefined; }" + ], + "source": { + "path": "x-pack/plugins/cloud/public/plugin.ts", + "lineNumber": 35 }, "deprecated": false } @@ -129,7 +145,7 @@ "description": [], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 35 + "lineNumber": 50 }, "deprecated": false, "children": [ @@ -145,7 +161,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 36 + "lineNumber": 51 }, "deprecated": false }, @@ -161,7 +177,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 37 + "lineNumber": 52 }, "deprecated": false }, @@ -177,7 +193,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 38 + "lineNumber": 53 }, "deprecated": false }, @@ -193,7 +209,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 39 + "lineNumber": 54 }, "deprecated": false }, @@ -209,7 +225,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 40 + "lineNumber": 55 }, "deprecated": false }, @@ -225,7 +241,7 @@ ], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 41 + "lineNumber": 56 }, "deprecated": false }, @@ -238,7 +254,7 @@ "description": [], "source": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 42 + "lineNumber": 57 }, "deprecated": false } @@ -263,7 +279,7 @@ "description": [], "source": { "path": "x-pack/plugins/cloud/server/plugin.ts", - "lineNumber": 19 + "lineNumber": 20 }, "deprecated": false, "children": [ @@ -279,7 +295,7 @@ ], "source": { "path": "x-pack/plugins/cloud/server/plugin.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false }, @@ -295,7 +311,7 @@ ], "source": { "path": "x-pack/plugins/cloud/server/plugin.ts", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false }, @@ -308,7 +324,7 @@ "description": [], "source": { "path": "x-pack/plugins/cloud/server/plugin.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false }, @@ -324,7 +340,7 @@ ], "source": { "path": "x-pack/plugins/cloud/server/plugin.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false } diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index f9d44f9c8d08ba..5cd9d0e7236894 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import cloudObj from './cloud.json'; @@ -19,7 +18,7 @@ import cloudObj from './cloud.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 20 | 0 | 20 | 0 | +| 21 | 0 | 21 | 0 | ## Client diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 74a7fadf7a5c37..1f12ef44d7c828 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import consoleObj from './console.json'; diff --git a/api_docs/core.json b/api_docs/core.json index a5466960dbd36f..711dfd57cdf0dc 100644 --- a/api_docs/core.json +++ b/api_docs/core.json @@ -1112,7 +1112,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 204 + "lineNumber": 206 }, "deprecated": false, "children": [ @@ -1136,7 +1136,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 206 + "lineNumber": 208 }, "deprecated": false }, @@ -1160,7 +1160,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 208 + "lineNumber": 210 }, "deprecated": false }, @@ -1184,7 +1184,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 210 + "lineNumber": 212 }, "deprecated": false }, @@ -1208,7 +1208,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 212 + "lineNumber": 214 }, "deprecated": false }, @@ -1232,7 +1232,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 214 + "lineNumber": 216 }, "deprecated": false }, @@ -1252,7 +1252,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 221 + "lineNumber": 223 }, "deprecated": true, "references": [] @@ -1279,7 +1279,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 225 + "lineNumber": 227 }, "deprecated": false, "returnComment": [], @@ -1299,7 +1299,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 249 + "lineNumber": 251 }, "deprecated": false, "children": [ @@ -1323,7 +1323,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 251 + "lineNumber": 253 }, "deprecated": false }, @@ -1347,7 +1347,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 253 + "lineNumber": 255 }, "deprecated": false }, @@ -1371,7 +1371,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 255 + "lineNumber": 257 }, "deprecated": false }, @@ -1395,7 +1395,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 257 + "lineNumber": 259 }, "deprecated": false }, @@ -1419,7 +1419,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 259 + "lineNumber": 261 }, "deprecated": false }, @@ -1443,7 +1443,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 261 + "lineNumber": 263 }, "deprecated": false }, @@ -1467,7 +1467,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 263 + "lineNumber": 265 }, "deprecated": false }, @@ -1491,7 +1491,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 265 + "lineNumber": 267 }, "deprecated": false }, @@ -1515,7 +1515,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 267 + "lineNumber": 269 }, "deprecated": false }, @@ -1539,7 +1539,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 269 + "lineNumber": 271 }, "deprecated": false }, @@ -1563,7 +1563,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 271 + "lineNumber": 273 }, "deprecated": false }, @@ -1583,7 +1583,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 278 + "lineNumber": 280 }, "deprecated": true, "references": [ @@ -1770,7 +1770,7 @@ "description": [], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 409 + "lineNumber": 426 }, "deprecated": false, "children": [ @@ -1783,7 +1783,7 @@ "description": [], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 410 + "lineNumber": 427 }, "deprecated": false }, @@ -1796,7 +1796,7 @@ "description": [], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 411 + "lineNumber": 428 }, "deprecated": false }, @@ -1808,11 +1808,11 @@ "label": "links", "description": [], "signature": [ - "{ readonly canvas: { readonly guide: string; }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; readonly drilldownsTriggerPicker: string; readonly urlDrilldownTemplateSyntax: string; readonly urlDrilldownVariables: string; }; readonly discover: Record<string, string>; readonly filebeat: { readonly base: string; readonly installation: string; readonly configuration: string; readonly elasticsearchOutput: string; readonly elasticsearchModule: string; readonly startup: string; readonly exportedFields: string; }; readonly auditbeat: { readonly base: string; }; readonly metricbeat: { readonly base: string; readonly configure: string; readonly httpEndpoint: string; readonly install: string; readonly start: string; }; readonly enterpriseSearch: { readonly base: string; readonly appSearchBase: string; readonly workplaceSearchBase: string; }; readonly heartbeat: { readonly base: string; }; readonly logstash: { readonly base: string; }; readonly functionbeat: { readonly base: string; }; readonly winlogbeat: { readonly base: string; }; readonly aggs: { readonly composite: string; readonly composite_missing_bucket: string; readonly date_histogram: string; readonly date_range: string; readonly date_format_pattern: string; readonly filter: string; readonly filters: string; readonly geohash_grid: string; readonly histogram: string; readonly ip_range: string; readonly range: string; readonly significant_terms: string; readonly terms: string; readonly avg: string; readonly avg_bucket: string; readonly max_bucket: string; readonly min_bucket: string; readonly sum_bucket: string; readonly cardinality: string; readonly count: string; readonly cumulative_sum: string; readonly derivative: string; readonly geo_bounds: string; readonly geo_centroid: string; readonly max: string; readonly median: string; readonly min: string; readonly moving_avg: string; readonly percentile_ranks: string; readonly serial_diff: string; readonly std_dev: string; readonly sum: string; readonly top_hits: string; }; readonly runtimeFields: { readonly overview: string; readonly mapping: string; }; readonly scriptedFields: { readonly scriptFields: string; readonly scriptAggs: string; readonly painless: string; readonly painlessApi: string; readonly painlessLangSpec: string; readonly painlessSyntax: string; readonly painlessWalkthrough: string; readonly luceneExpressions: string; }; readonly search: { readonly sessions: string; }; readonly indexPatterns: { readonly introduction: string; readonly fieldFormattersNumber: string; readonly fieldFormattersString: string; readonly runtimeFields: string; }; readonly addData: string; readonly kibana: string; readonly upgradeAssistant: string; readonly elasticsearch: Record<string, string>; readonly siem: { readonly guide: string; readonly gettingStarted: string; }; readonly query: { readonly eql: string; readonly kueryQuerySyntax: string; readonly luceneQuerySyntax: string; readonly percolate: string; readonly queryDsl: string; }; readonly date: { readonly dateMath: string; readonly dateMathIndexNames: string; }; readonly management: Record<string, string>; readonly ml: Record<string, string>; readonly transforms: Record<string, string>; readonly visualize: Record<string, string>; readonly apis: Readonly<{ bulkIndexAlias: string; byteSizeUnits: string; createAutoFollowPattern: string; createFollower: string; createIndex: string; createSnapshotLifecyclePolicy: string; createRoleMapping: string; createRoleMappingTemplates: string; createRollupJobsRequest: string; createApiKey: string; createPipeline: string; createTransformRequest: string; cronExpressions: string; executeWatchActionModes: string; indexExists: string; openIndex: string; putComponentTemplate: string; painlessExecute: string; painlessExecuteAPIContexts: string; putComponentTemplateMetadata: string; putSnapshotLifecyclePolicy: string; putIndexTemplateV1: string; putWatch: string; simulatePipeline: string; timeUnits: string; updateTransform: string; }>; readonly observability: Record<string, string>; readonly alerting: Record<string, string>; readonly maps: Record<string, string>; readonly monitoring: Record<string, string>; readonly security: Readonly<{ apiKeyServiceSettings: string; clusterPrivileges: string; elasticsearchSettings: string; elasticsearchEnableSecurity: string; indicesPrivileges: string; kibanaTLS: string; kibanaPrivileges: string; mappingRoles: string; mappingRolesFieldRules: string; runAsPrivilege: string; }>; readonly watcher: Record<string, string>; readonly ccs: Record<string, string>; readonly plugins: Record<string, string>; readonly snapshotRestore: Record<string, string>; readonly ingest: Record<string, string>; }" + "{ readonly settings: string; readonly canvas: { readonly guide: string; }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; readonly drilldownsTriggerPicker: string; readonly urlDrilldownTemplateSyntax: string; readonly urlDrilldownVariables: string; }; readonly discover: Record<string, string>; readonly filebeat: { readonly base: string; readonly installation: string; readonly configuration: string; readonly elasticsearchOutput: string; readonly elasticsearchModule: string; readonly startup: string; readonly exportedFields: string; }; readonly auditbeat: { readonly base: string; }; readonly metricbeat: { readonly base: string; readonly configure: string; readonly httpEndpoint: string; readonly install: string; readonly start: string; }; readonly enterpriseSearch: { readonly base: string; readonly appSearchBase: string; readonly workplaceSearchBase: string; }; readonly heartbeat: { readonly base: string; }; readonly logstash: { readonly base: string; }; readonly functionbeat: { readonly base: string; }; readonly winlogbeat: { readonly base: string; }; readonly aggs: { readonly composite: string; readonly composite_missing_bucket: string; readonly date_histogram: string; readonly date_range: string; readonly date_format_pattern: string; readonly filter: string; readonly filters: string; readonly geohash_grid: string; readonly histogram: string; readonly ip_range: string; readonly range: string; readonly significant_terms: string; readonly terms: string; readonly avg: string; readonly avg_bucket: string; readonly max_bucket: string; readonly min_bucket: string; readonly sum_bucket: string; readonly cardinality: string; readonly count: string; readonly cumulative_sum: string; readonly derivative: string; readonly geo_bounds: string; readonly geo_centroid: string; readonly max: string; readonly median: string; readonly min: string; readonly moving_avg: string; readonly percentile_ranks: string; readonly serial_diff: string; readonly std_dev: string; readonly sum: string; readonly top_hits: string; }; readonly runtimeFields: { readonly overview: string; readonly mapping: string; }; readonly scriptedFields: { readonly scriptFields: string; readonly scriptAggs: string; readonly painless: string; readonly painlessApi: string; readonly painlessLangSpec: string; readonly painlessSyntax: string; readonly painlessWalkthrough: string; readonly luceneExpressions: string; }; readonly search: { readonly sessions: string; readonly sessionLimits: string; }; readonly indexPatterns: { readonly introduction: string; readonly fieldFormattersNumber: string; readonly fieldFormattersString: string; readonly runtimeFields: string; }; readonly addData: string; readonly kibana: string; readonly upgradeAssistant: string; readonly rollupJobs: string; readonly elasticsearch: Record<string, string>; readonly siem: { readonly guide: string; readonly gettingStarted: string; }; readonly query: { readonly eql: string; readonly kueryQuerySyntax: string; readonly luceneQuerySyntax: string; readonly percolate: string; readonly queryDsl: string; }; readonly date: { readonly dateMath: string; readonly dateMathIndexNames: string; }; readonly management: Record<string, string>; readonly ml: Record<string, string>; readonly transforms: Record<string, string>; readonly visualize: Record<string, string>; readonly apis: Readonly<{ bulkIndexAlias: string; byteSizeUnits: string; createAutoFollowPattern: string; createFollower: string; createIndex: string; createSnapshotLifecyclePolicy: string; createRoleMapping: string; createRoleMappingTemplates: string; createRollupJobsRequest: string; createApiKey: string; createPipeline: string; createTransformRequest: string; cronExpressions: string; executeWatchActionModes: string; indexExists: string; openIndex: string; putComponentTemplate: string; painlessExecute: string; painlessExecuteAPIContexts: string; putComponentTemplateMetadata: string; putSnapshotLifecyclePolicy: string; putIndexTemplateV1: string; putWatch: string; simulatePipeline: string; timeUnits: string; updateTransform: string; }>; readonly observability: Record<string, string>; readonly alerting: Record<string, string>; readonly maps: Record<string, string>; readonly monitoring: Record<string, string>; readonly security: Readonly<{ apiKeyServiceSettings: string; clusterPrivileges: string; elasticsearchSettings: string; elasticsearchEnableSecurity: string; indicesPrivileges: string; kibanaTLS: string; kibanaPrivileges: string; mappingRoles: string; mappingRolesFieldRules: string; runAsPrivilege: string; }>; readonly watcher: Record<string, string>; readonly ccs: Record<string, string>; readonly plugins: Record<string, string>; readonly snapshotRestore: Record<string, string>; readonly ingest: Record<string, string>; readonly fleet: Readonly<{ guide: string; fleetServer: string; fleetServerAddFleetServer: string; settings: string; settingsFleetServerHostSettings: string; troubleshooting: string; elasticAgent: string; datastreams: string; datastreamsNamingScheme: string; upgradeElasticAgent: string; upgradeElasticAgent712lower: string; }>; }" ], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 412 + "lineNumber": 429 }, "deprecated": false } @@ -3632,7 +3632,7 @@ "label": "buttonColor", "description": [], "signature": [ - "\"warning\" | \"text\" | \"primary\" | \"danger\" | \"secondary\" | \"ghost\" | undefined" + "\"warning\" | \"text\" | \"primary\" | \"success\" | \"danger\" | \"accent\" | \"secondary\" | \"ghost\" | undefined" ], "source": { "path": "src/core/public/overlays/modal/modal_service.tsx", @@ -4827,14 +4827,14 @@ "tags": [], "label": "namespaces", "description": [ - "Namespace(s) that this saved object exists in. This attribute is only used for multi-namespace saved object types." + "\nSpace(s) that this saved object exists in. This attribute is not used for \"global\" saved object types which are registered with\n`namespaceType: 'agnostic'`." ], "signature": [ "string[] | undefined" ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 88 + "lineNumber": 91 }, "deprecated": false }, @@ -4852,7 +4852,7 @@ ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 95 + "lineNumber": 98 }, "deprecated": false } @@ -4902,7 +4902,7 @@ "description": [], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 98 + "lineNumber": 101 }, "deprecated": false, "children": [ @@ -4915,7 +4915,7 @@ "description": [], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 99 + "lineNumber": 102 }, "deprecated": false }, @@ -4928,7 +4928,7 @@ "description": [], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 100 + "lineNumber": 103 }, "deprecated": false }, @@ -4941,7 +4941,7 @@ "description": [], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 101 + "lineNumber": 104 }, "deprecated": false }, @@ -4957,7 +4957,7 @@ ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 102 + "lineNumber": 105 }, "deprecated": false } @@ -6562,6 +6562,89 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsResolveResponse", + "type": "Interface", + "tags": [], + "label": "SavedObjectsResolveResponse", + "description": [ + "\n" + ], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsResolveResponse", + "text": "SavedObjectsResolveResponse" + }, + "<T>" + ], + "source": { + "path": "src/core/server/saved_objects/service/saved_objects_client.ts", + "lineNumber": 313 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsResolveResponse.saved_object", + "type": "Object", + "tags": [], + "label": "saved_object", + "description": [ + "\nThe saved object that was found." + ], + "signature": [ + "SavedObject", + "<T>" + ], + "source": { + "path": "src/core/server/saved_objects/service/saved_objects_client.ts", + "lineNumber": 317 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsResolveResponse.outcome", + "type": "CompoundType", + "tags": [], + "label": "outcome", + "description": [ + "\nThe outcome for a successful `resolve` call is one of the following values:\n\n * `'exactMatch'` -- One document exactly matched the given ID.\n * `'aliasMatch'` -- One document with a legacy URL alias matched the given ID; in this case the `saved_object.id` field is different\n than the given ID.\n * `'conflict'` -- Two documents matched the given ID, one was an exact match and another with a legacy URL alias; in this case the\n `saved_object` object is the exact match, and the `saved_object.id` field is the same as the given ID." + ], + "signature": [ + "\"conflict\" | \"exactMatch\" | \"aliasMatch\"" + ], + "source": { + "path": "src/core/server/saved_objects/service/saved_objects_client.ts", + "lineNumber": 327 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsResolveResponse.aliasTargetId", + "type": "string", + "tags": [], + "label": "aliasTargetId", + "description": [ + "\nThe ID of the object that the legacy URL alias points to. This is only defined when the outcome is `'aliasMatch'` or `'conflict'`." + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/core/server/saved_objects/service/saved_objects_client.ts", + "lineNumber": 331 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "core", "id": "def-public.ToastOptions", @@ -6789,7 +6872,7 @@ "defines a type of UI element {@link UiSettingsType}" ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"select\" | \"array\" | \"markdown\" | undefined" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"markdown\" | \"select\" | \"array\" | undefined" ], "source": { "path": "src/core/types/ui_settings.ts", @@ -7279,7 +7362,7 @@ "\nA sub-set of {@link UiSettingsParams} exposed to the client-side." ], "signature": [ - "{ type?: \"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"select\" | \"array\" | \"markdown\" | undefined; options?: string[] | undefined; description?: string | undefined; name?: string | undefined; order?: number | undefined; value?: unknown; category?: string[] | undefined; metric?: { type: ", + "{ type?: \"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"markdown\" | \"select\" | \"array\" | undefined; options?: string[] | undefined; description?: string | undefined; name?: string | undefined; order?: number | undefined; value?: unknown; category?: string[] | undefined; metric?: { type: ", "UiCounterMetricType", "; name: string; } | undefined; optionLabels?: Record<string, string> | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; sensitive?: boolean | undefined; deprecation?: ", "DeprecationSettings", @@ -7427,7 +7510,7 @@ ], "source": { "path": "src/core/public/index.ts", - "lineNumber": 235 + "lineNumber": 237 }, "deprecated": false, "initialIsOpen": false @@ -7870,7 +7953,7 @@ "\nUI element type to represent the settings." ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"select\" | \"array\" | \"markdown\"" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"markdown\" | \"select\" | \"array\"" ], "source": { "path": "src/core/types/ui_settings.ts", @@ -7950,7 +8033,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 52 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -7972,7 +8055,23 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 53 + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.CspConfig.directives", + "type": "Object", + "tags": [], + "label": "#directives", + "description": [], + "signature": [ + "CspDirectives" + ], + "source": { + "path": "src/core/server/csp/csp_config.ts", + "lineNumber": 56 }, "deprecated": false }, @@ -7988,7 +8087,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 55 + "lineNumber": 57 }, "deprecated": false }, @@ -8001,7 +8100,7 @@ "description": [], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 56 + "lineNumber": 58 }, "deprecated": false }, @@ -8014,7 +8113,7 @@ "description": [], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 57 + "lineNumber": 59 }, "deprecated": false }, @@ -8027,7 +8126,7 @@ "description": [], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 58 + "lineNumber": 60 }, "deprecated": false }, @@ -8040,7 +8139,7 @@ "description": [], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 59 + "lineNumber": 61 }, "deprecated": false } @@ -8527,21 +8626,21 @@ "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 106 + "lineNumber": 107 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 110 + "lineNumber": 111 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 182 + "lineNumber": 185 } }, { @@ -9236,21 +9335,21 @@ "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 102 + "lineNumber": 103 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 103 + "lineNumber": 104 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 120 + "lineNumber": 121 } } ], @@ -9355,28 +9454,28 @@ "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 113 + "lineNumber": 114 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 114 + "lineNumber": 115 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 115 + "lineNumber": 116 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 118 + "lineNumber": 119 } }, { @@ -9386,20 +9485,6 @@ "lineNumber": 65 } }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/es_fields/es_fields.ts", - "lineNumber": 31 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/functions/functions.ts", - "lineNumber": 64 - } - }, { "plugin": "indexManagement", "link": { @@ -9495,7 +9580,7 @@ "plugin": "indexManagement", "link": { "path": "x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts", - "lineNumber": 62 + "lineNumber": 74 } }, { @@ -9659,34 +9744,6 @@ "lineNumber": 41 } }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts", - "lineNumber": 70 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts", - "lineNumber": 98 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts", - "lineNumber": 126 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts", - "lineNumber": 146 - } - }, { "plugin": "monitoring", "link": { @@ -10113,7 +10170,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 301 + "lineNumber": 322 }, "deprecated": true, "references": [ @@ -10167,7 +10224,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 307 + "lineNumber": 328 }, "deprecated": false, "children": [ @@ -10190,7 +10247,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 307 + "lineNumber": 328 }, "deprecated": false, "isRequired": true @@ -10207,7 +10264,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 307 + "lineNumber": 328 }, "deprecated": false, "isRequired": true @@ -10235,7 +10292,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 309 + "lineNumber": 330 }, "deprecated": false, "children": [ @@ -10257,7 +10314,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 309 + "lineNumber": 330 }, "deprecated": false, "isRequired": true @@ -10274,7 +10331,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 309 + "lineNumber": 330 }, "deprecated": false, "isRequired": true @@ -10294,7 +10351,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 311 + "lineNumber": 332 }, "deprecated": false, "children": [], @@ -10981,7 +11038,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 470 + "lineNumber": 471 }, "deprecated": false, "children": [ @@ -11005,7 +11062,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 472 + "lineNumber": 473 }, "deprecated": false }, @@ -11029,7 +11086,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 474 + "lineNumber": 475 }, "deprecated": false }, @@ -11053,7 +11110,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 476 + "lineNumber": 477 }, "deprecated": false }, @@ -11086,7 +11143,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 478 + "lineNumber": 479 }, "deprecated": false }, @@ -11110,7 +11167,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 483 + "lineNumber": 484 }, "deprecated": false }, @@ -11134,7 +11191,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 485 + "lineNumber": 486 }, "deprecated": false }, @@ -11158,7 +11215,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 487 + "lineNumber": 488 }, "deprecated": false }, @@ -11182,7 +11239,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 489 + "lineNumber": 490 }, "deprecated": false }, @@ -11206,7 +11263,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 491 + "lineNumber": 492 }, "deprecated": false }, @@ -11230,7 +11287,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 493 + "lineNumber": 494 }, "deprecated": false }, @@ -11254,7 +11311,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 495 + "lineNumber": 496 }, "deprecated": false }, @@ -11280,7 +11337,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 497 + "lineNumber": 498 }, "deprecated": false, "returnComment": [], @@ -11300,7 +11357,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 518 + "lineNumber": 519 }, "deprecated": false, "children": [ @@ -11324,7 +11381,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 520 + "lineNumber": 521 }, "deprecated": false }, @@ -11348,7 +11405,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 522 + "lineNumber": 523 }, "deprecated": false }, @@ -11372,7 +11429,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 524 + "lineNumber": 525 }, "deprecated": false }, @@ -11396,7 +11453,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 526 + "lineNumber": 527 }, "deprecated": false }, @@ -11420,7 +11477,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 528 + "lineNumber": 529 }, "deprecated": false }, @@ -11444,7 +11501,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 530 + "lineNumber": 531 }, "deprecated": false } @@ -12175,7 +12232,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 218 + "lineNumber": 239 }, "deprecated": false, "children": [ @@ -12190,7 +12247,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 222 + "lineNumber": 243 }, "deprecated": false }, @@ -12208,7 +12265,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 227 + "lineNumber": 248 }, "deprecated": false }, @@ -12226,7 +12283,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 233 + "lineNumber": 254 }, "deprecated": false }, @@ -12244,7 +12301,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 240 + "lineNumber": 261 }, "deprecated": false }, @@ -12262,7 +12319,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 252 + "lineNumber": 273 }, "deprecated": false } @@ -12334,13 +12391,6 @@ }, "deprecated": true, "references": [ - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/functions/functions.ts", - "lineNumber": 64 - } - }, { "plugin": "console", "link": { @@ -12537,14 +12587,14 @@ "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 105 + "lineNumber": 106 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 117 + "lineNumber": 118 } }, { @@ -15007,7 +15057,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 17 + "lineNumber": 18 }, "deprecated": false, "children": [ @@ -15025,7 +15075,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false }, @@ -15040,7 +15090,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false }, @@ -15055,7 +15105,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 33 + "lineNumber": 34 }, "deprecated": false }, @@ -15070,7 +15120,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 39 + "lineNumber": 40 }, "deprecated": false }, @@ -15085,7 +15135,7 @@ ], "source": { "path": "src/core/server/csp/csp_config.ts", - "lineNumber": 45 + "lineNumber": 46 }, "deprecated": false } @@ -15304,7 +15354,7 @@ "description": [], "source": { "path": "src/core/server/rendering/types.ts", - "lineNumber": 68 + "lineNumber": 69 }, "deprecated": false, "children": [ @@ -15322,7 +15372,7 @@ ], "source": { "path": "src/core/server/rendering/types.ts", - "lineNumber": 73 + "lineNumber": 74 }, "deprecated": false } @@ -15761,34 +15811,6 @@ "deprecated": true, "removeBy": "7.16", "references": [ - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/lib/query_es_sql.ts", - "lineNumber": 12 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/lib/query_es_sql.ts", - "lineNumber": 37 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/functions/functions.ts", - "lineNumber": 8 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/server/routes/functions/functions.ts", - "lineNumber": 40 - } - }, { "plugin": "crossClusterReplication", "link": { @@ -16059,14 +16081,14 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/server/lib/telemetry/sender.ts", - "lineNumber": 457 + "lineNumber": 462 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/server/lib/telemetry/sender.ts", - "lineNumber": 476 + "lineNumber": 481 } }, { @@ -19790,7 +19812,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 282 + "lineNumber": 303 }, "deprecated": false, "children": [ @@ -19814,7 +19836,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 288 + "lineNumber": 309 }, "deprecated": false, "children": [ @@ -19837,7 +19859,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 288 + "lineNumber": 309 }, "deprecated": false, "isRequired": true @@ -19854,7 +19876,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 288 + "lineNumber": 309 }, "deprecated": false, "isRequired": true @@ -19882,7 +19904,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 290 + "lineNumber": 311 }, "deprecated": false, "children": [ @@ -19904,7 +19926,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 290 + "lineNumber": 311 }, "deprecated": false, "isRequired": true @@ -19921,7 +19943,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 290 + "lineNumber": 311 }, "deprecated": false, "isRequired": true @@ -19941,7 +19963,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 292 + "lineNumber": 313 }, "deprecated": false, "children": [], @@ -20080,7 +20102,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 337 + "lineNumber": 358 }, "deprecated": false, "children": [ @@ -20096,7 +20118,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 338 + "lineNumber": 359 }, "deprecated": false }, @@ -20116,7 +20138,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 339 + "lineNumber": 360 }, "deprecated": false }, @@ -20134,7 +20156,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 362 + "lineNumber": 383 }, "deprecated": false }, @@ -20168,7 +20190,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 366 + "lineNumber": 387 }, "deprecated": false } @@ -20375,6 +20397,42 @@ "lineNumber": 210 }, "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.PluginManifest.owner", + "type": "Object", + "tags": [], + "label": "owner", + "description": [ + "\nTODO: make required once all internal plugins have this specified." + ], + "signature": [ + "{ readonly name: string; readonly githubTeam?: string | undefined; } | undefined" + ], + "source": { + "path": "src/core/server/plugins/types.ts", + "lineNumber": 215 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.PluginManifest.description", + "type": "string", + "tags": [], + "label": "description", + "description": [ + "\nTODO: make required once all plugins specify this.\nA brief description of what this plugin does and any capabilities it provides." + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/core/server/plugins/types.ts", + "lineNumber": 231 + }, + "deprecated": false } ], "initialIsOpen": false @@ -20463,7 +20521,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 437 + "lineNumber": 438 }, "deprecated": false, "children": [ @@ -20567,7 +20625,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 438 + "lineNumber": 439 }, "deprecated": false } @@ -20788,14 +20846,14 @@ "tags": [], "label": "namespaces", "description": [ - "Namespace(s) that this saved object exists in. This attribute is only used for multi-namespace saved object types." + "\nSpace(s) that this saved object exists in. This attribute is not used for \"global\" saved object types which are registered with\n`namespaceType: 'agnostic'`." ], "signature": [ "string[] | undefined" ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 88 + "lineNumber": 91 }, "deprecated": false }, @@ -20813,7 +20871,7 @@ ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 95 + "lineNumber": 98 }, "deprecated": false } @@ -21431,7 +21489,7 @@ ], "source": { "path": "src/core/server/status/types.ts", - "lineNumber": 202 + "lineNumber": 205 }, "deprecated": false, "children": [ @@ -21456,7 +21514,7 @@ ], "source": { "path": "src/core/server/status/types.ts", - "lineNumber": 202 + "lineNumber": 205 }, "deprecated": false, "isRequired": true @@ -21487,7 +21545,7 @@ ], "source": { "path": "src/core/server/status/types.ts", - "lineNumber": 208 + "lineNumber": 211 }, "deprecated": false }, @@ -21514,7 +21572,7 @@ ], "source": { "path": "src/core/server/status/types.ts", - "lineNumber": 220 + "lineNumber": 223 }, "deprecated": false }, @@ -21532,7 +21590,7 @@ ], "source": { "path": "src/core/server/status/types.ts", - "lineNumber": 226 + "lineNumber": 229 }, "deprecated": false, "returnComment": [], @@ -21732,7 +21790,7 @@ "defines a type of UI element {@link UiSettingsType}" ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"select\" | \"array\" | \"markdown\" | undefined" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"markdown\" | \"select\" | \"array\" | undefined" ], "source": { "path": "src/core/types/ui_settings.ts", @@ -22271,7 +22329,7 @@ "label": "EcsEventCategory", "description": [], "signature": [ - "\"host\" | \"database\" | \"package\" | \"session\" | \"registry\" | \"network\" | \"web\" | \"file\" | \"process\" | \"authentication\" | \"configuration\" | \"driver\" | \"iam\" | \"intrusion_detection\" | \"malware\"" + "\"host\" | \"database\" | \"package\" | \"session\" | \"file\" | \"registry\" | \"network\" | \"web\" | \"process\" | \"authentication\" | \"configuration\" | \"driver\" | \"iam\" | \"intrusion_detection\" | \"malware\"" ], "source": { "path": "node_modules/@kbn/logging/target/ecs/event.d.ts", @@ -22288,7 +22346,7 @@ "label": "EcsEventKind", "description": [], "signature": [ - "\"alert\" | \"event\" | \"state\" | \"metric\" | \"signal\" | \"pipeline_error\"" + "\"alert\" | \"metric\" | \"event\" | \"state\" | \"signal\" | \"pipeline_error\"" ], "source": { "path": "node_modules/@kbn/logging/target/ecs/event.d.ts", @@ -22998,21 +23056,21 @@ "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 109 + "lineNumber": 110 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 151 + "lineNumber": 154 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 180 + "lineNumber": 183 } }, { @@ -23452,35 +23510,35 @@ "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 102 + "lineNumber": 103 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 103 + "lineNumber": 104 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 111 + "lineNumber": 112 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 114 + "lineNumber": 115 } }, { "plugin": "licensing", "link": { "path": "x-pack/plugins/licensing/server/plugin.ts", - "lineNumber": 115 + "lineNumber": 116 } }, { @@ -23843,7 +23901,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 444 + "lineNumber": 465 }, "deprecated": false, "initialIsOpen": false @@ -23894,7 +23952,7 @@ "\nA sub-set of {@link UiSettingsParams} exposed to the client-side." ], "signature": [ - "{ type?: \"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"select\" | \"array\" | \"markdown\" | undefined; options?: string[] | undefined; description?: string | undefined; name?: string | undefined; order?: number | undefined; value?: unknown; category?: string[] | undefined; metric?: { type: ", + "{ type?: \"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"markdown\" | \"select\" | \"array\" | undefined; options?: string[] | undefined; description?: string | undefined; name?: string | undefined; order?: number | undefined; value?: unknown; category?: string[] | undefined; metric?: { type: ", "UiCounterMetricType", "; name: string; } | undefined; optionLabels?: Record<string, string> | undefined; requiresPageReload?: boolean | undefined; readonly?: boolean | undefined; sensitive?: boolean | undefined; deprecation?: ", "DeprecationSettings", @@ -24029,7 +24087,7 @@ ], "source": { "path": "src/core/server/plugins/types.ts", - "lineNumber": 325 + "lineNumber": 346 }, "deprecated": false, "initialIsOpen": false @@ -24056,7 +24114,7 @@ ], "source": { "path": "src/core/server/index.ts", - "lineNumber": 508 + "lineNumber": 509 }, "deprecated": false, "initialIsOpen": false @@ -24071,7 +24129,7 @@ "\nUI element type to represent the settings." ], "signature": [ - "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"select\" | \"array\" | \"markdown\"" + "\"string\" | \"number\" | \"boolean\" | \"undefined\" | \"color\" | \"json\" | \"image\" | \"markdown\" | \"select\" | \"array\"" ], "source": { "path": "src/core/types/ui_settings.ts", diff --git a/api_docs/core.mdx b/api_docs/core.mdx index 31889ec1042b84..40cd04f3746d28 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import coreObj from './core.json'; @@ -19,7 +18,7 @@ import coreObj from './core.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2273 | 148 | 1052 | 26 | +| 2296 | 148 | 1056 | 30 | ## Client diff --git a/api_docs/core_application.json b/api_docs/core_application.json index ab5fbe560172be..dcae7ae11c3c38 100644 --- a/api_docs/core_application.json +++ b/api_docs/core_application.json @@ -1372,7 +1372,7 @@ "\nReturns the absolute path (or URL) to a given app, including the global base path.\n\nBy default, it returns the absolute path of the application (e.g `/basePath/app/my-app`).\nUse the `absolute` option to generate an absolute url instead (e.g `http://host:port/basePath/app/my-app`)\n\nNote that when generating absolute urls, the origin (protocol, host and port) are determined from the browser's current location.\n" ], "signature": [ - "(appId: string, options?: { path?: string | undefined; absolute?: boolean | undefined; } | undefined) => string" + "(appId: string, options?: { path?: string | undefined; absolute?: boolean | undefined; deepLinkId?: string | undefined; } | undefined) => string" ], "source": { "path": "src/core/public/application/types.ts", @@ -1392,7 +1392,7 @@ ], "source": { "path": "src/core/public/application/types.ts", - "lineNumber": 783 + "lineNumber": 784 }, "deprecated": false, "isRequired": true @@ -1406,7 +1406,7 @@ "description": [], "source": { "path": "src/core/public/application/types.ts", - "lineNumber": 783 + "lineNumber": 785 }, "deprecated": false, "children": [ @@ -1422,7 +1422,7 @@ ], "source": { "path": "src/core/public/application/types.ts", - "lineNumber": 783 + "lineNumber": 785 }, "deprecated": false }, @@ -1438,7 +1438,23 @@ ], "source": { "path": "src/core/public/application/types.ts", - "lineNumber": 783 + "lineNumber": 785 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-public.ApplicationStart.getUrlForApp.$2.options.deepLinkId", + "type": "string", + "tags": [], + "label": "deepLinkId", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/core/public/application/types.ts", + "lineNumber": 785 }, "deprecated": false } @@ -1462,7 +1478,7 @@ ], "source": { "path": "src/core/public/application/types.ts", - "lineNumber": 788 + "lineNumber": 791 }, "deprecated": false } @@ -1570,7 +1586,7 @@ "plugin": "fleet", "link": { "path": "x-pack/plugins/fleet/public/applications/fleet/index.tsx", - "lineNumber": 67 + "lineNumber": 69 } }, { @@ -1677,7 +1693,7 @@ "plugin": "dashboard", "link": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 299 + "lineNumber": 315 } }, { @@ -1705,35 +1721,35 @@ "plugin": "lens", "link": { "path": "x-pack/plugins/lens/public/app_plugin/types.ts", - "lineNumber": 44 + "lineNumber": 47 } }, { "plugin": "lens", "link": { "path": "x-pack/plugins/lens/public/app_plugin/types.ts", - "lineNumber": 72 + "lineNumber": 74 } }, { "plugin": "lens", "link": { "path": "x-pack/plugins/lens/public/app_plugin/mounter.tsx", - "lineNumber": 219 + "lineNumber": 209 } }, { "plugin": "ml", "link": { "path": "x-pack/plugins/ml/public/application/app.tsx", - "lineNumber": 131 + "lineNumber": 135 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/app/index.tsx", - "lineNumber": 17 + "lineNumber": 20 } }, { @@ -2267,28 +2283,56 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx", - "lineNumber": 14 + "lineNumber": 13 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx", - "lineNumber": 30 + "lineNumber": 23 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx", + "lineNumber": 13 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx", + "lineNumber": 25 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx", + "lineNumber": 12 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx", + "lineNumber": 66 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/app/home/index.tsx", - "lineNumber": 27 + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/app/home/index.tsx", - "lineNumber": 44 + "lineNumber": 26 } }, { @@ -2316,14 +2360,14 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/app/app.tsx", - "lineNumber": 33 + "lineNumber": 32 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/app/app.tsx", - "lineNumber": 73 + "lineNumber": 81 } } ], diff --git a/api_docs/core_application.mdx b/api_docs/core_application.mdx index ce165343346322..6f6a99ceba26d9 100644 --- a/api_docs/core_application.mdx +++ b/api_docs/core_application.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.application'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import coreApplicationObj from './core_application.json'; @@ -19,7 +18,7 @@ import coreApplicationObj from './core_application.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2273 | 148 | 1052 | 26 | +| 2296 | 148 | 1056 | 30 | ## Client diff --git a/api_docs/core_chrome.mdx b/api_docs/core_chrome.mdx index 3fbc87ad30fffc..6edaaa80542502 100644 --- a/api_docs/core_chrome.mdx +++ b/api_docs/core_chrome.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.chrome'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import coreChromeObj from './core_chrome.json'; @@ -19,7 +18,7 @@ import coreChromeObj from './core_chrome.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2273 | 148 | 1052 | 26 | +| 2296 | 148 | 1056 | 30 | ## Client diff --git a/api_docs/core_http.json b/api_docs/core_http.json index 7bedeac3baf793..9e58ad14528f6a 100644 --- a/api_docs/core_http.json +++ b/api_docs/core_http.json @@ -8615,7 +8615,7 @@ "plugin": "security", "link": { "path": "x-pack/plugins/security/server/saved_objects/index.ts", - "lineNumber": 34 + "lineNumber": 47 } } ], @@ -12239,7 +12239,7 @@ "\nThe set of supported parseable Content-Types" ], "signature": [ - "\"application/json\" | \"application/*+json\" | \"application/octet-stream\" | \"application/x-www-form-urlencoded\" | \"multipart/form-data\" | \"text/*\"" + "\"application/json\" | \"multipart/form-data\" | \"application/*+json\" | \"application/octet-stream\" | \"application/x-www-form-urlencoded\" | \"text/*\"" ], "source": { "path": "src/core/server/http/router/route.ts", diff --git a/api_docs/core_http.mdx b/api_docs/core_http.mdx index 4f15e1a1ce90c5..448c05a91a2926 100644 --- a/api_docs/core_http.mdx +++ b/api_docs/core_http.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.http'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import coreHttpObj from './core_http.json'; @@ -19,7 +18,7 @@ import coreHttpObj from './core_http.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2273 | 148 | 1052 | 26 | +| 2296 | 148 | 1056 | 30 | ## Client diff --git a/api_docs/core_saved_objects.json b/api_docs/core_saved_objects.json index bd7a9cb1ccb08b..81680e54f1148d 100644 --- a/api_docs/core_saved_objects.json +++ b/api_docs/core_saved_objects.json @@ -13,7 +13,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 166 + "lineNumber": 170 }, "deprecated": false, "children": [ @@ -47,7 +47,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 221 + "lineNumber": 225 }, "deprecated": false, "children": [ @@ -63,7 +63,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 222 + "lineNumber": 226 }, "deprecated": false, "isRequired": true @@ -80,7 +80,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 223 + "lineNumber": 227 }, "deprecated": false, "isRequired": true @@ -103,7 +103,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 224 + "lineNumber": 228 }, "deprecated": false, "isRequired": true @@ -151,7 +151,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 256 + "lineNumber": 260 }, "deprecated": false, "children": [ @@ -176,7 +176,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 257 + "lineNumber": 261 }, "deprecated": false, "isRequired": true @@ -199,7 +199,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 258 + "lineNumber": 262 }, "deprecated": false, "isRequired": true @@ -225,7 +225,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 284 + "lineNumber": 288 }, "deprecated": false, "children": [ @@ -241,7 +241,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 285 + "lineNumber": 289 }, "deprecated": false, "isRequired": true @@ -258,7 +258,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 286 + "lineNumber": 290 }, "deprecated": false, "isRequired": true @@ -276,7 +276,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 287 + "lineNumber": 291 }, "deprecated": false, "isRequired": false @@ -322,7 +322,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 314 + "lineNumber": 318 }, "deprecated": false, "children": [ @@ -346,7 +346,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 315 + "lineNumber": 319 }, "deprecated": false, "isRequired": true @@ -378,7 +378,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 381 + "lineNumber": 385 }, "deprecated": false, "children": [ @@ -394,7 +394,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 381 + "lineNumber": 385 }, "deprecated": false, "isRequired": true @@ -411,7 +411,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 381 + "lineNumber": 385 }, "deprecated": false, "isRequired": true @@ -443,7 +443,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 404 + "lineNumber": 408 }, "deprecated": false, "children": [ @@ -461,7 +461,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 404 + "lineNumber": 408 }, "deprecated": false, "isRequired": true @@ -471,6 +471,71 @@ "The saved objects with the given type and ids requested" ] }, + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsClient.resolve", + "type": "Function", + "tags": [], + "label": "resolve", + "description": [ + "\nResolves a single object\n" + ], + "signature": [ + "<T = unknown>(type: string, id: string) => Promise<", + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.ResolvedSimpleSavedObject", + "text": "ResolvedSimpleSavedObject" + }, + "<T>>" + ], + "source": { + "path": "src/core/public/saved_objects/saved_objects_client.ts", + "lineNumber": 435 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsClient.resolve.$1", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/core/public/saved_objects/saved_objects_client.ts", + "lineNumber": 436 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "core", + "id": "def-public.SavedObjectsClient.resolve.$2", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/core/public/saved_objects/saved_objects_client.ts", + "lineNumber": 437 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [ + "The resolve result for the saved object for the given type and id." + ] + }, { "parentPluginId": "core", "id": "def-public.SavedObjectsClient.update", @@ -504,7 +569,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 435 + "lineNumber": 462 }, "deprecated": false, "children": [ @@ -520,7 +585,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 436 + "lineNumber": 463 }, "deprecated": false, "isRequired": true @@ -537,7 +602,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 437 + "lineNumber": 464 }, "deprecated": false, "isRequired": true @@ -554,7 +619,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 438 + "lineNumber": 465 }, "deprecated": false, "isRequired": true @@ -578,7 +643,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 439 + "lineNumber": 466 }, "deprecated": false, "isRequired": true @@ -616,7 +681,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 467 + "lineNumber": 494 }, "deprecated": false, "children": [ @@ -641,7 +706,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 467 + "lineNumber": 494 }, "deprecated": false, "isRequired": true @@ -804,6 +869,24 @@ }, "deprecated": false }, + { + "parentPluginId": "core", + "id": "def-public.SimpleSavedObject.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [ + "\nSpace(s) that this saved object exists in. This attribute is not used for \"global\" saved object types which are registered with\n`namespaceType: 'agnostic'`." + ], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "src/core/public/saved_objects/simple_saved_object.ts", + "lineNumber": 37 + }, + "deprecated": false + }, { "parentPluginId": "core", "id": "def-public.SimpleSavedObject.Unnamed", @@ -816,7 +899,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 34 + "lineNumber": 39 }, "deprecated": false, "children": [ @@ -836,11 +919,11 @@ "section": "def-public.SavedObjectsClient", "text": "SavedObjectsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"update\" | \"bulkUpdate\">" + ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"resolve\" | \"update\" | \"bulkUpdate\">" ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 35 + "lineNumber": 40 }, "deprecated": false, "isRequired": true @@ -850,7 +933,7 @@ "id": "def-public.SimpleSavedObject.Unnamed.$2", "type": "Object", "tags": [], - "label": "{\n id,\n type,\n version,\n attributes,\n error,\n references,\n migrationVersion,\n coreMigrationVersion,\n }", + "label": "{\n id,\n type,\n version,\n attributes,\n error,\n references,\n migrationVersion,\n coreMigrationVersion,\n namespaces,\n }", "description": [], "signature": [ "SavedObject", @@ -858,7 +941,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 36 + "lineNumber": 41 }, "deprecated": false, "isRequired": true @@ -878,7 +961,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 59 + "lineNumber": 66 }, "deprecated": false, "children": [ @@ -894,7 +977,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 59 + "lineNumber": 66 }, "deprecated": false, "isRequired": true @@ -914,7 +997,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 63 + "lineNumber": 70 }, "deprecated": false, "children": [ @@ -930,7 +1013,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 63 + "lineNumber": 70 }, "deprecated": false, "isRequired": true @@ -947,7 +1030,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 63 + "lineNumber": 70 }, "deprecated": false, "isRequired": true @@ -967,7 +1050,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 67 + "lineNumber": 74 }, "deprecated": false, "children": [ @@ -983,7 +1066,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 67 + "lineNumber": 74 }, "deprecated": false, "isRequired": true @@ -1011,7 +1094,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 71 + "lineNumber": 78 }, "deprecated": false, "children": [], @@ -1029,7 +1112,7 @@ ], "source": { "path": "src/core/public/saved_objects/simple_saved_object.ts", - "lineNumber": 85 + "lineNumber": 92 }, "deprecated": false, "children": [], @@ -1041,6 +1124,95 @@ ], "functions": [], "interfaces": [ + { + "parentPluginId": "core", + "id": "def-public.ResolvedSimpleSavedObject", + "type": "Interface", + "tags": [], + "label": "ResolvedSimpleSavedObject", + "description": [ + "\nThis interface is a very simple wrapper for SavedObjects resolved from the server\nwith the {@link SavedObjectsClient}.\n" + ], + "signature": [ + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.ResolvedSimpleSavedObject", + "text": "ResolvedSimpleSavedObject" + }, + "<T>" + ], + "source": { + "path": "src/core/public/saved_objects/types.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-public.ResolvedSimpleSavedObject.savedObject", + "type": "Object", + "tags": [], + "label": "savedObject", + "description": [ + "\nThe saved object that was found." + ], + "signature": [ + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.SimpleSavedObject", + "text": "SimpleSavedObject" + }, + "<T>" + ], + "source": { + "path": "src/core/public/saved_objects/types.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-public.ResolvedSimpleSavedObject.outcome", + "type": "CompoundType", + "tags": [], + "label": "outcome", + "description": [ + "\nThe outcome for a successful `resolve` call is one of the following values:\n\n * `'exactMatch'` -- One document exactly matched the given ID.\n * `'aliasMatch'` -- One document with a legacy URL alias matched the given ID; in this case the `saved_object.id` field is different\n than the given ID.\n * `'conflict'` -- Two documents matched the given ID, one was an exact match and another with a legacy URL alias; in this case the\n `saved_object` object is the exact match, and the `saved_object.id` field is the same as the given ID." + ], + "signature": [ + "\"conflict\" | \"exactMatch\" | \"aliasMatch\"" + ], + "source": { + "path": "src/core/public/saved_objects/types.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-public.ResolvedSimpleSavedObject.aliasTargetId", + "type": "string", + "tags": [], + "label": "aliasTargetId", + "description": [ + "\nThe ID of the object that the legacy URL alias points to. This is only defined when the outcome is `'aliasMatch'` or `'conflict'`." + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/core/public/saved_objects/types.ts", + "lineNumber": 36 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "core", "id": "def-public.SavedObjectsBatchResponse", @@ -1060,7 +1232,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 87 + "lineNumber": 91 }, "deprecated": false, "children": [ @@ -1083,7 +1255,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 88 + "lineNumber": 92 }, "deprecated": false } @@ -1116,7 +1288,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 54 + "lineNumber": 58 }, "deprecated": false, "children": [ @@ -1129,7 +1301,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 55 + "lineNumber": 59 }, "deprecated": false }, @@ -1145,7 +1317,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 56 + "lineNumber": 60 }, "deprecated": false } @@ -1161,7 +1333,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 60 + "lineNumber": 64 }, "deprecated": false, "children": [ @@ -1179,7 +1351,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 62 + "lineNumber": 66 }, "deprecated": false } @@ -1205,7 +1377,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 66 + "lineNumber": 70 }, "deprecated": false, "children": [ @@ -1218,7 +1390,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 67 + "lineNumber": 71 }, "deprecated": false }, @@ -1231,7 +1403,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 68 + "lineNumber": 72 }, "deprecated": false }, @@ -1247,7 +1419,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 69 + "lineNumber": 73 }, "deprecated": false }, @@ -1263,7 +1435,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 70 + "lineNumber": 74 }, "deprecated": false }, @@ -1280,7 +1452,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 71 + "lineNumber": 75 }, "deprecated": false } @@ -1296,7 +1468,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 75 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -1312,7 +1484,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 76 + "lineNumber": 80 }, "deprecated": false } @@ -1328,7 +1500,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 34 + "lineNumber": 38 }, "deprecated": false, "children": [ @@ -1346,7 +1518,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 38 + "lineNumber": 42 }, "deprecated": false }, @@ -1364,7 +1536,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 40 + "lineNumber": 44 }, "deprecated": false }, @@ -1383,7 +1555,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 42 + "lineNumber": 46 }, "deprecated": false }, @@ -1401,7 +1573,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 44 + "lineNumber": 48 }, "deprecated": false }, @@ -1418,7 +1590,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 45 + "lineNumber": 49 }, "deprecated": false } @@ -1454,7 +1626,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 105 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -1470,7 +1642,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 107 + "lineNumber": 111 }, "deprecated": false }, @@ -1483,7 +1655,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 108 + "lineNumber": 112 }, "deprecated": false }, @@ -1496,7 +1668,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 109 + "lineNumber": 113 }, "deprecated": false }, @@ -1509,7 +1681,7 @@ "description": [], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 110 + "lineNumber": 114 }, "deprecated": false } @@ -1613,7 +1785,15 @@ "section": "def-public.SavedObjectsBatchResponse", "text": "SavedObjectsBatchResponse" }, - "<unknown>>; update: <T = unknown>(type: string, id: string, attributes: T, { version, references, upsert }?: ", + "<unknown>>; resolve: <T = unknown>(type: string, id: string) => Promise<", + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.ResolvedSimpleSavedObject", + "text": "ResolvedSimpleSavedObject" + }, + "<T>>; update: <T = unknown>(type: string, id: string, attributes: T, { version, references, upsert }?: ", { "pluginId": "core", "scope": "public", @@ -1675,7 +1855,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 80 + "lineNumber": 84 }, "deprecated": false, "children": [ @@ -1691,7 +1871,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 81 + "lineNumber": 85 }, "deprecated": false }, @@ -1707,7 +1887,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 82 + "lineNumber": 86 }, "deprecated": false }, @@ -1724,7 +1904,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 83 + "lineNumber": 87 }, "deprecated": false } @@ -1818,7 +1998,15 @@ "section": "def-public.SavedObjectsBatchResponse", "text": "SavedObjectsBatchResponse" }, - "<unknown>>; update: <T = unknown>(type: string, id: string, attributes: T, { version, references, upsert }?: ", + "<unknown>>; resolve: <T = unknown>(type: string, id: string) => Promise<", + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.ResolvedSimpleSavedObject", + "text": "ResolvedSimpleSavedObject" + }, + "<T>>; update: <T = unknown>(type: string, id: string, attributes: T, { version, references, upsert }?: ", { "pluginId": "core", "scope": "public", @@ -1854,7 +2042,7 @@ ], "source": { "path": "src/core/public/saved_objects/saved_objects_client.ts", - "lineNumber": 139 + "lineNumber": 143 }, "deprecated": false, "initialIsOpen": false @@ -1875,7 +2063,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 371 + "lineNumber": 382 }, "deprecated": false, "children": [ @@ -1898,7 +2086,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 372 + "lineNumber": 383 }, "deprecated": false }, @@ -1921,7 +2109,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 373 + "lineNumber": 384 }, "deprecated": false }, @@ -1949,7 +2137,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 389 + "lineNumber": 400 }, "deprecated": false, "children": [ @@ -1965,7 +2153,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 389 + "lineNumber": 400 }, "deprecated": false, "isRequired": true @@ -1982,7 +2170,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 389 + "lineNumber": 400 }, "deprecated": false, "isRequired": true @@ -2006,7 +2194,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 389 + "lineNumber": 400 }, "deprecated": false, "isRequired": false @@ -2052,7 +2240,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 399 + "lineNumber": 410 }, "deprecated": false, "children": [ @@ -2075,7 +2263,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 400 + "lineNumber": 411 }, "deprecated": false, "isRequired": true @@ -2099,7 +2287,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 401 + "lineNumber": 412 }, "deprecated": false, "isRequired": false @@ -2145,7 +2333,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 413 + "lineNumber": 424 }, "deprecated": false, "children": [ @@ -2168,7 +2356,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 414 + "lineNumber": 425 }, "deprecated": false, "isRequired": true @@ -2191,7 +2379,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 415 + "lineNumber": 426 }, "deprecated": false, "isRequired": true @@ -2221,7 +2409,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 427 + "lineNumber": 438 }, "deprecated": false, "children": [ @@ -2237,7 +2425,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 427 + "lineNumber": 438 }, "deprecated": false, "isRequired": true @@ -2254,7 +2442,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 427 + "lineNumber": 438 }, "deprecated": false, "isRequired": true @@ -2277,7 +2465,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 427 + "lineNumber": 438 }, "deprecated": false, "isRequired": true @@ -2315,7 +2503,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 436 + "lineNumber": 447 }, "deprecated": false, "children": [ @@ -2337,7 +2525,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 437 + "lineNumber": 448 }, "deprecated": false, "isRequired": true @@ -2383,7 +2571,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 453 + "lineNumber": 464 }, "deprecated": false, "children": [ @@ -2408,7 +2596,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 454 + "lineNumber": 465 }, "deprecated": false, "isRequired": true @@ -2431,7 +2619,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 455 + "lineNumber": 466 }, "deprecated": false, "isRequired": true @@ -2463,7 +2651,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 467 + "lineNumber": 478 }, "deprecated": false, "children": [ @@ -2481,7 +2669,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 468 + "lineNumber": 479 }, "deprecated": false, "isRequired": true @@ -2500,7 +2688,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 469 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -2523,7 +2711,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 470 + "lineNumber": 481 }, "deprecated": false, "isRequired": true @@ -2561,7 +2749,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 482 + "lineNumber": 493 }, "deprecated": false, "children": [ @@ -2579,7 +2767,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 483 + "lineNumber": 494 }, "deprecated": false, "isRequired": true @@ -2598,7 +2786,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 484 + "lineNumber": 495 }, "deprecated": false, "isRequired": true @@ -2621,7 +2809,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 485 + "lineNumber": 496 }, "deprecated": false, "isRequired": true @@ -2659,7 +2847,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 497 + "lineNumber": 508 }, "deprecated": false, "children": [ @@ -2675,7 +2863,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 498 + "lineNumber": 509 }, "deprecated": false, "isRequired": true @@ -2692,7 +2880,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 499 + "lineNumber": 510 }, "deprecated": false, "isRequired": true @@ -2709,7 +2897,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 500 + "lineNumber": 511 }, "deprecated": false, "isRequired": true @@ -2733,7 +2921,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 501 + "lineNumber": 512 }, "deprecated": false, "isRequired": true @@ -2779,7 +2967,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 511 + "lineNumber": 522 }, "deprecated": false, "children": [ @@ -2802,7 +2990,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 512 + "lineNumber": 523 }, "deprecated": false, "isRequired": true @@ -2826,7 +3014,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 513 + "lineNumber": 524 }, "deprecated": false, "isRequired": false @@ -2864,7 +3052,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 521 + "lineNumber": 532 }, "deprecated": false, "children": [ @@ -2880,7 +3068,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 522 + "lineNumber": 533 }, "deprecated": false, "isRequired": true @@ -2897,7 +3085,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 523 + "lineNumber": 534 }, "deprecated": false, "isRequired": true @@ -2921,7 +3109,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 524 + "lineNumber": 535 }, "deprecated": false, "isRequired": false @@ -2959,7 +3147,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 537 + "lineNumber": 548 }, "deprecated": false, "children": [ @@ -2975,7 +3163,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 538 + "lineNumber": 549 }, "deprecated": false, "isRequired": true @@ -2998,7 +3186,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 539 + "lineNumber": 550 }, "deprecated": false, "isRequired": true @@ -3036,7 +3224,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 552 + "lineNumber": 563 }, "deprecated": false, "children": [ @@ -3052,7 +3240,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 552 + "lineNumber": 563 }, "deprecated": false, "isRequired": true @@ -3076,7 +3264,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 552 + "lineNumber": 563 }, "deprecated": false, "isRequired": false @@ -3122,7 +3310,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 601 + "lineNumber": 612 }, "deprecated": false, "children": [ @@ -3146,7 +3334,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 602 + "lineNumber": 613 }, "deprecated": false, "isRequired": true @@ -3170,7 +3358,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 603 + "lineNumber": 614 }, "deprecated": false, "isRequired": false @@ -3216,7 +3404,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 618 + "lineNumber": 629 }, "deprecated": false, "children": [ @@ -3239,7 +3427,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 619 + "lineNumber": 630 }, "deprecated": false, "isRequired": true @@ -3263,7 +3451,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 620 + "lineNumber": 631 }, "deprecated": false, "isRequired": false @@ -3309,7 +3497,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 633 + "lineNumber": 644 }, "deprecated": false, "children": [ @@ -3332,7 +3520,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 634 + "lineNumber": 645 }, "deprecated": false, "isRequired": true @@ -3349,7 +3537,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 635 + "lineNumber": 646 }, "deprecated": false, "isRequired": true @@ -3366,7 +3554,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 636 + "lineNumber": 647 }, "deprecated": false, "isRequired": true @@ -3390,7 +3578,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 637 + "lineNumber": 648 }, "deprecated": false, "isRequired": false @@ -4759,7 +4947,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 35 + "lineNumber": 34 }, "deprecated": false, "children": [ @@ -5073,6 +5261,19 @@ }, "; }" ], + "source": { + "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExporter.exportSizeLimit", + "type": "number", + "tags": [], + "label": "#exportSizeLimit", + "description": [], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", "lineNumber": 36 @@ -5081,21 +5282,45 @@ }, { "parentPluginId": "core", - "id": "def-server.SavedObjectsExporter.exportTransforms", + "id": "def-server.SavedObjectsExporter.typeRegistry", "type": "Object", "tags": [], - "label": "#exportTransforms", + "label": "#typeRegistry", "description": [], "signature": [ - "{ [x: string]: ", + "{ getType: (type: string) => ", { "pluginId": "core", "scope": "server", "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectsExportTransform", - "text": "SavedObjectsExportTransform" + "section": "def-server.SavedObjectsType", + "text": "SavedObjectsType" }, - "; }" + "<any> | undefined; getVisibleTypes: () => ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsType", + "text": "SavedObjectsType" + }, + "<any>[]; getAllTypes: () => ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsType", + "text": "SavedObjectsType" + }, + "<any>[]; getImportableAndExportableTypes: () => ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsType", + "text": "SavedObjectsType" + }, + "<any>[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", @@ -5103,19 +5328,6 @@ }, "deprecated": false }, - { - "parentPluginId": "core", - "id": "def-server.SavedObjectsExporter.exportSizeLimit", - "type": "number", - "tags": [], - "label": "#exportSizeLimit", - "description": [], - "source": { - "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 38 - }, - "deprecated": false - }, { "parentPluginId": "core", "id": "def-server.SavedObjectsExporter.log", @@ -5128,7 +5340,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 39 + "lineNumber": 38 }, "deprecated": false }, @@ -5144,7 +5356,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 41 + "lineNumber": 40 }, "deprecated": false, "children": [ @@ -5157,7 +5369,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "children": [ @@ -5473,7 +5685,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 47 + "lineNumber": 46 }, "deprecated": false }, @@ -5493,7 +5705,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - " | undefined; getVisibleTypes: () => ", + "<any> | undefined; getVisibleTypes: () => ", { "pluginId": "core", "scope": "server", @@ -5501,7 +5713,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getAllTypes: () => ", + "<any>[]; getAllTypes: () => ", { "pluginId": "core", "scope": "server", @@ -5509,7 +5721,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getImportableAndExportableTypes: () => ", + "<any>[]; getImportableAndExportableTypes: () => ", { "pluginId": "core", "scope": "server", @@ -5517,11 +5729,11 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" + "<any>[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 48 + "lineNumber": 47 }, "deprecated": false }, @@ -5534,7 +5746,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 49 + "lineNumber": 48 }, "deprecated": false }, @@ -5550,7 +5762,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 50 + "lineNumber": 49 }, "deprecated": false } @@ -5585,7 +5797,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 73 + "lineNumber": 64 }, "deprecated": false, "children": [ @@ -5607,7 +5819,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 73 + "lineNumber": 64 }, "deprecated": false, "isRequired": true @@ -5641,7 +5853,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 92 + "lineNumber": 83 }, "deprecated": false, "children": [ @@ -5663,7 +5875,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 92 + "lineNumber": 83 }, "deprecated": false, "isRequired": true @@ -6314,7 +6526,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - " | undefined; getVisibleTypes: () => ", + "<any> | undefined; getVisibleTypes: () => ", { "pluginId": "core", "scope": "server", @@ -6322,7 +6534,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getAllTypes: () => ", + "<any>[]; getAllTypes: () => ", { "pluginId": "core", "scope": "server", @@ -6330,7 +6542,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getImportableAndExportableTypes: () => ", + "<any>[]; getImportableAndExportableTypes: () => ", { "pluginId": "core", "scope": "server", @@ -6338,7 +6550,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" + "<any>[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" ], "source": { "path": "src/core/server/saved_objects/import/saved_objects_importer.ts", @@ -6744,7 +6956,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - " | undefined; getVisibleTypes: () => ", + "<any> | undefined; getVisibleTypes: () => ", { "pluginId": "core", "scope": "server", @@ -6752,7 +6964,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getAllTypes: () => ", + "<any>[]; getAllTypes: () => ", { "pluginId": "core", "scope": "server", @@ -6760,7 +6972,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getImportableAndExportableTypes: () => ", + "<any>[]; getImportableAndExportableTypes: () => ", { "pluginId": "core", "scope": "server", @@ -6768,7 +6980,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" + "<any>[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" ], "source": { "path": "src/core/server/saved_objects/import/saved_objects_importer.ts", @@ -7174,7 +7386,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 171 + "lineNumber": 176 }, "deprecated": false, "children": [ @@ -7208,7 +7420,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 269 + "lineNumber": 274 }, "deprecated": false, "children": [ @@ -7224,7 +7436,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 270 + "lineNumber": 275 }, "deprecated": false, "isRequired": true @@ -7241,7 +7453,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 271 + "lineNumber": 276 }, "deprecated": false, "isRequired": true @@ -7264,7 +7476,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 272 + "lineNumber": 277 }, "deprecated": false, "isRequired": true @@ -7315,7 +7527,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 362 + "lineNumber": 357 }, "deprecated": false, "children": [ @@ -7340,7 +7552,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 363 + "lineNumber": 358 }, "deprecated": false, "isRequired": true @@ -7363,7 +7575,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 364 + "lineNumber": 359 }, "deprecated": false, "isRequired": true @@ -7411,7 +7623,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 548 + "lineNumber": 540 }, "deprecated": false, "children": [ @@ -7434,7 +7646,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 549 + "lineNumber": 541 }, "deprecated": false, "isRequired": true @@ -7457,7 +7669,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 550 + "lineNumber": 542 }, "deprecated": false, "isRequired": true @@ -7489,7 +7701,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 635 + "lineNumber": 627 }, "deprecated": false, "children": [ @@ -7505,7 +7717,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 635 + "lineNumber": 627 }, "deprecated": false, "isRequired": true @@ -7522,7 +7734,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 635 + "lineNumber": 627 }, "deprecated": false, "isRequired": true @@ -7545,7 +7757,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 635 + "lineNumber": 627 }, "deprecated": false, "isRequired": true @@ -7575,7 +7787,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 696 + "lineNumber": 688 }, "deprecated": false, "children": [ @@ -7591,7 +7803,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 697 + "lineNumber": 689 }, "deprecated": false, "isRequired": true @@ -7614,7 +7826,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 698 + "lineNumber": 690 }, "deprecated": false, "isRequired": true @@ -7667,7 +7879,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 758 + "lineNumber": 750 }, "deprecated": false, "children": [ @@ -7689,7 +7901,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 759 + "lineNumber": 751 }, "deprecated": false, "isRequired": true @@ -7739,7 +7951,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 925 + "lineNumber": 917 }, "deprecated": false, "children": [ @@ -7764,7 +7976,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 926 + "lineNumber": 918 }, "deprecated": false, "isRequired": true @@ -7787,7 +7999,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 927 + "lineNumber": 919 }, "deprecated": false, "isRequired": true @@ -7823,7 +8035,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1012 + "lineNumber": 1004 }, "deprecated": false, "children": [ @@ -7839,7 +8051,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1013 + "lineNumber": 1005 }, "deprecated": false, "isRequired": true @@ -7856,7 +8068,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1014 + "lineNumber": 1006 }, "deprecated": false, "isRequired": true @@ -7879,7 +8091,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1015 + "lineNumber": 1007 }, "deprecated": false, "isRequired": true @@ -7921,7 +8133,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1054 + "lineNumber": 1046 }, "deprecated": false, "children": [ @@ -7937,7 +8149,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1055 + "lineNumber": 1047 }, "deprecated": false, "isRequired": true @@ -7954,7 +8166,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1056 + "lineNumber": 1048 }, "deprecated": false, "isRequired": true @@ -7977,7 +8189,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1057 + "lineNumber": 1049 }, "deprecated": false, "isRequired": true @@ -8021,7 +8233,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1184 + "lineNumber": 1187 }, "deprecated": false, "children": [ @@ -8037,7 +8249,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1185 + "lineNumber": 1188 }, "deprecated": false, "isRequired": true @@ -8054,7 +8266,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1186 + "lineNumber": 1189 }, "deprecated": false, "isRequired": true @@ -8071,7 +8283,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1187 + "lineNumber": 1190 }, "deprecated": false, "isRequired": true @@ -8095,7 +8307,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1188 + "lineNumber": 1191 }, "deprecated": false, "isRequired": true @@ -8141,7 +8353,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1282 + "lineNumber": 1285 }, "deprecated": false, "children": [ @@ -8166,7 +8378,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1283 + "lineNumber": 1286 }, "deprecated": false, "isRequired": true @@ -8190,7 +8402,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1284 + "lineNumber": 1287 }, "deprecated": false, "isRequired": false @@ -8236,7 +8448,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1306 + "lineNumber": 1309 }, "deprecated": false, "children": [ @@ -8259,7 +8471,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1307 + "lineNumber": 1310 }, "deprecated": false, "isRequired": true @@ -8276,7 +8488,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1308 + "lineNumber": 1311 }, "deprecated": false, "isRequired": true @@ -8293,7 +8505,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1309 + "lineNumber": 1312 }, "deprecated": false, "isRequired": true @@ -8317,7 +8529,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1310 + "lineNumber": 1313 }, "deprecated": false, "isRequired": false @@ -8366,7 +8578,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1333 + "lineNumber": 1336 }, "deprecated": false, "children": [ @@ -8391,7 +8603,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1334 + "lineNumber": 1337 }, "deprecated": false, "isRequired": true @@ -8414,7 +8626,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1335 + "lineNumber": 1338 }, "deprecated": false, "isRequired": true @@ -8454,7 +8666,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1550 + "lineNumber": 1553 }, "deprecated": false, "children": [ @@ -8470,7 +8682,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1551 + "lineNumber": 1554 }, "deprecated": false, "isRequired": true @@ -8487,7 +8699,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1552 + "lineNumber": 1555 }, "deprecated": false, "isRequired": true @@ -8510,7 +8722,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1553 + "lineNumber": 1556 }, "deprecated": false, "isRequired": true @@ -8544,13 +8756,13 @@ "section": "def-server.SavedObjectsIncrementCounterOptions", "text": "SavedObjectsIncrementCounterOptions" }, - "<T>) => Promise<", + "<T> | undefined) => Promise<", "SavedObject", "<T>>" ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1661 + "lineNumber": 1664 }, "deprecated": false, "children": [ @@ -8568,7 +8780,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1662 + "lineNumber": 1665 }, "deprecated": false, "isRequired": true @@ -8587,7 +8799,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1663 + "lineNumber": 1666 }, "deprecated": false, "isRequired": true @@ -8614,7 +8826,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1664 + "lineNumber": 1667 }, "deprecated": false, "isRequired": true @@ -8636,14 +8848,14 @@ "section": "def-server.SavedObjectsIncrementCounterOptions", "text": "SavedObjectsIncrementCounterOptions" }, - "<T>" + "<T> | undefined" ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1665 + "lineNumber": 1668 }, "deprecated": false, - "isRequired": true + "isRequired": false } ], "returnComment": [ @@ -8683,7 +8895,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1821 + "lineNumber": 1834 }, "deprecated": false, "children": [ @@ -8699,7 +8911,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1822 + "lineNumber": 1835 }, "deprecated": false, "isRequired": true @@ -8722,7 +8934,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1823 + "lineNumber": 1836 }, "deprecated": false, "isRequired": true @@ -8762,7 +8974,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1890 + "lineNumber": 1903 }, "deprecated": false, "children": [ @@ -8778,7 +8990,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1891 + "lineNumber": 1904 }, "deprecated": false, "isRequired": true @@ -8804,7 +9016,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1892 + "lineNumber": 1905 }, "deprecated": false, "isRequired": false @@ -8852,7 +9064,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1946 + "lineNumber": 1959 }, "deprecated": false, "children": [ @@ -8876,7 +9088,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1947 + "lineNumber": 1960 }, "deprecated": false, "isRequired": true @@ -8900,7 +9112,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 1948 + "lineNumber": 1961 }, "deprecated": false, "isRequired": false @@ -9580,7 +9792,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - ") => void" + "<any>) => void" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -9602,7 +9814,8 @@ "docId": "kibCoreSavedObjectsPluginApi", "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" - } + }, + "<any>" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -9632,7 +9845,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - " | undefined" + "<any> | undefined" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -9678,7 +9891,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]" + "<any>[]" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -9706,7 +9919,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]" + "<any>[]" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -9734,7 +9947,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]" + "<any>[]" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -10489,7 +10702,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 75 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -10505,7 +10718,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 76 + "lineNumber": 80 }, "deprecated": false }, @@ -10518,7 +10731,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 77 + "lineNumber": 81 }, "deprecated": false }, @@ -10534,7 +10747,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 78 + "lineNumber": 82 }, "deprecated": false }, @@ -10550,7 +10763,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 79 + "lineNumber": 83 }, "deprecated": false }, @@ -10567,7 +10780,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 80 + "lineNumber": 84 }, "deprecated": false }, @@ -10586,7 +10799,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 82 + "lineNumber": 86 }, "deprecated": false }, @@ -10604,7 +10817,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 92 + "lineNumber": 96 }, "deprecated": false }, @@ -10622,7 +10835,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 94 + "lineNumber": 98 }, "deprecated": false }, @@ -10633,14 +10846,14 @@ "tags": [], "label": "initialNamespaces", "description": [ - "\nOptional initial namespaces for the object to be created in. If this is defined, it will supersede the namespace ID that is in\n{@link SavedObjectsCreateOptions}.\n\nNote: this can only be used for multi-namespace object types." + "\nOptional initial namespaces for the object to be created in. If this is defined, it will supersede the namespace ID that is in\n{@link SavedObjectsCreateOptions}.\n\n* For shareable object types (registered with `namespaceType: 'multiple'`): this option can be used to specify one or more spaces,\n including the \"All spaces\" identifier (`'*'`).\n* For isolated object types (registered with `namespaceType: 'single'` or `namespaceType: 'multiple-isolated'`): this option can only\n be used to specify a single space, and the \"All spaces\" identifier (`'*'`) is not allowed.\n* For global object types (registered with `namespaceType: 'agnostic'`): this option cannot be used." ], "signature": [ "string[] | undefined" ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 101 + "lineNumber": 109 }, "deprecated": false } @@ -10658,7 +10871,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 268 + "lineNumber": 276 }, "deprecated": false, "children": [ @@ -10671,7 +10884,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 269 + "lineNumber": 277 }, "deprecated": false }, @@ -10684,7 +10897,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 270 + "lineNumber": 278 }, "deprecated": false }, @@ -10702,7 +10915,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 272 + "lineNumber": 280 }, "deprecated": false } @@ -10730,7 +10943,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 129 + "lineNumber": 137 }, "deprecated": false, "children": [ @@ -10747,7 +10960,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 130 + "lineNumber": 138 }, "deprecated": false } @@ -10775,7 +10988,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 279 + "lineNumber": 287 }, "deprecated": false, "children": [ @@ -10792,7 +11005,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 280 + "lineNumber": 288 }, "deprecated": false } @@ -10828,7 +11041,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 108 + "lineNumber": 116 }, "deprecated": false, "children": [ @@ -10843,7 +11056,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 111 + "lineNumber": 119 }, "deprecated": false }, @@ -10858,7 +11071,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 113 + "lineNumber": 121 }, "deprecated": false }, @@ -10876,7 +11089,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 115 + "lineNumber": 123 }, "deprecated": false }, @@ -10894,7 +11107,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 122 + "lineNumber": 130 }, "deprecated": false } @@ -10929,7 +11142,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 248 + "lineNumber": 256 }, "deprecated": false, "children": [ @@ -10947,7 +11160,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 250 + "lineNumber": 258 }, "deprecated": false } @@ -10975,7 +11188,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 287 + "lineNumber": 295 }, "deprecated": false, "children": [ @@ -10998,7 +11211,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 288 + "lineNumber": 296 }, "deprecated": false } @@ -11016,7 +11229,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 194 + "lineNumber": 202 }, "deprecated": false, "children": [ @@ -11029,7 +11242,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 195 + "lineNumber": 203 }, "deprecated": false }, @@ -11042,7 +11255,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 196 + "lineNumber": 204 }, "deprecated": false } @@ -11060,7 +11273,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 203 + "lineNumber": 211 }, "deprecated": false, "children": [ @@ -11078,7 +11291,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 204 + "lineNumber": 212 }, "deprecated": false } @@ -11482,7 +11695,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - " | undefined; getVisibleTypes: () => ", + "<any> | undefined; getVisibleTypes: () => ", { "pluginId": "core", "scope": "server", @@ -11490,7 +11703,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getAllTypes: () => ", + "<any>[]; getAllTypes: () => ", { "pluginId": "core", "scope": "server", @@ -11498,7 +11711,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getImportableAndExportableTypes: () => ", + "<any>[]; getImportableAndExportableTypes: () => ", { "pluginId": "core", "scope": "server", @@ -11506,7 +11719,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" + "<any>[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" ], "source": { "path": "src/core/server/saved_objects/service/lib/scoped_client_provider.ts", @@ -11549,7 +11762,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 355 + "lineNumber": 366 }, "deprecated": false, "children": [ @@ -11564,7 +11777,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 360 + "lineNumber": 371 }, "deprecated": false }, @@ -11579,7 +11792,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 364 + "lineNumber": 375 }, "deprecated": false } @@ -11907,14 +12120,14 @@ "tags": [], "label": "initialNamespaces", "description": [ - "\nOptional initial namespaces for the object to be created in. If this is defined, it will supersede the namespace ID that is in\n{@link SavedObjectsCreateOptions}.\n\nNote: this can only be used for multi-namespace object types." + "\nOptional initial namespaces for the object to be created in. If this is defined, it will supersede the namespace ID that is in\n{@link SavedObjectsCreateOptions}.\n\n* For shareable object types (registered with `namespaceType: 'multiple'`): this option can be used to specify one or more spaces,\n including the \"All spaces\" identifier (`'*'`).\n* For isolated object types (registered with `namespaceType: 'single'` or `namespaceType: 'multiple-isolated'`): this option can only\n be used to specify a single space, and the \"All spaces\" identifier (`'*'`) is not allowed.\n* For global object types (registered with `namespaceType: 'agnostic'`): this option cannot be used." ], "signature": [ "string[] | undefined" ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 68 + "lineNumber": 72 }, "deprecated": false } @@ -12029,7 +12242,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 144 + "lineNumber": 149 }, "deprecated": false, "children": [ @@ -12047,7 +12260,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 146 + "lineNumber": 151 }, "deprecated": false } @@ -12082,7 +12295,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 257 + "lineNumber": 265 }, "deprecated": false, "children": [ @@ -12100,7 +12313,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 259 + "lineNumber": 267 }, "deprecated": false }, @@ -12118,7 +12331,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 261 + "lineNumber": 269 }, "deprecated": false } @@ -12274,6 +12487,70 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExportExcludedObject", + "type": "Interface", + "tags": [], + "label": "SavedObjectsExportExcludedObject", + "description": [], + "source": { + "path": "src/core/server/saved_objects/export/types.ts", + "lineNumber": 82 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExportExcludedObject.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "id of the excluded object" + ], + "source": { + "path": "src/core/server/saved_objects/export/types.ts", + "lineNumber": 84 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExportExcludedObject.type", + "type": "string", + "tags": [], + "label": "type", + "description": [ + "type of the excluded object" + ], + "source": { + "path": "src/core/server/saved_objects/export/types.ts", + "lineNumber": 86 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExportExcludedObject.reason", + "type": "string", + "tags": [], + "label": "reason", + "description": [ + "optional cause of the exclusion" + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/core/server/saved_objects/export/types.ts", + "lineNumber": 88 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "core", "id": "def-server.SavedObjectsExportResultDetails", @@ -12336,6 +12613,46 @@ "lineNumber": 69 }, "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExportResultDetails.excludedObjectsCount", + "type": "number", + "tags": [], + "label": "excludedObjectsCount", + "description": [ + "number of objects that were excluded from the export" + ], + "source": { + "path": "src/core/server/saved_objects/export/types.ts", + "lineNumber": 76 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsExportResultDetails.excludedObjects", + "type": "Array", + "tags": [], + "label": "excludedObjects", + "description": [ + "excluded objects details" + ], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsExportExcludedObject", + "text": "SavedObjectsExportExcludedObject" + }, + "[]" + ], + "source": { + "path": "src/core/server/saved_objects/export/types.ts", + "lineNumber": 78 + }, + "deprecated": false } ], "initialIsOpen": false @@ -12351,7 +12668,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/types.ts", - "lineNumber": 82 + "lineNumber": 96 }, "deprecated": false, "children": [ @@ -12376,7 +12693,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/types.ts", - "lineNumber": 87 + "lineNumber": 101 }, "deprecated": false } @@ -12818,7 +13135,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 181 + "lineNumber": 189 }, "deprecated": false, "children": [ @@ -12834,7 +13151,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 182 + "lineNumber": 190 }, "deprecated": false }, @@ -12857,7 +13174,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 183 + "lineNumber": 191 }, "deprecated": false }, @@ -12870,7 +13187,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 184 + "lineNumber": 192 }, "deprecated": false }, @@ -12883,7 +13200,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 185 + "lineNumber": 193 }, "deprecated": false }, @@ -12896,7 +13213,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 186 + "lineNumber": 194 }, "deprecated": false }, @@ -12912,7 +13229,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 187 + "lineNumber": 195 }, "deprecated": false } @@ -12942,7 +13259,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 137 + "lineNumber": 145 }, "deprecated": false, "children": [ @@ -12957,7 +13274,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 141 + "lineNumber": 149 }, "deprecated": false }, @@ -12975,7 +13292,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 170 + "lineNumber": 178 }, "deprecated": false } @@ -14014,7 +14331,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 161 + "lineNumber": 166 }, "deprecated": false, "children": [ @@ -14029,7 +14346,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 163 + "lineNumber": 168 }, "deprecated": false }, @@ -14047,7 +14364,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 165 + "lineNumber": 170 }, "deprecated": false } @@ -14080,7 +14397,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 120 + "lineNumber": 125 }, "deprecated": false, "children": [ @@ -14098,7 +14415,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 126 + "lineNumber": 131 }, "deprecated": false }, @@ -14117,7 +14434,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 128 + "lineNumber": 133 }, "deprecated": false }, @@ -14135,7 +14452,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 133 + "lineNumber": 138 }, "deprecated": false }, @@ -14153,7 +14470,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 137 + "lineNumber": 142 }, "deprecated": false } @@ -14307,14 +14624,14 @@ "plugin": "lens", "link": { "path": "x-pack/plugins/lens/server/migrations/saved_object_migrations.ts", - "lineNumber": 167 + "lineNumber": 170 } }, { "plugin": "lens", "link": { "path": "x-pack/plugins/lens/server/migrations/saved_object_migrations.ts", - "lineNumber": 234 + "lineNumber": 237 } } ], @@ -14448,7 +14765,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 326 + "lineNumber": 337 }, "deprecated": false, "children": [ @@ -14466,7 +14783,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 330 + "lineNumber": 341 }, "deprecated": false }, @@ -14484,7 +14801,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 334 + "lineNumber": 345 }, "deprecated": false } @@ -14500,7 +14817,7 @@ "description": [], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 340 + "lineNumber": 351 }, "deprecated": false, "children": [ @@ -14515,7 +14832,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 344 + "lineNumber": 355 }, "deprecated": false } @@ -14710,7 +15027,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 230 + "lineNumber": 238 }, "deprecated": false, "children": [ @@ -14728,7 +15045,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 232 + "lineNumber": 240 }, "deprecated": false } @@ -14763,7 +15080,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 239 + "lineNumber": 247 }, "deprecated": false, "children": [ @@ -14778,7 +15095,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 241 + "lineNumber": 249 }, "deprecated": false } @@ -15043,7 +15360,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 305 + "lineNumber": 313 }, "deprecated": false, "children": [ @@ -15053,14 +15370,16 @@ "type": "Object", "tags": [], "label": "saved_object", - "description": [], + "description": [ + "\nThe saved object that was found." + ], "signature": [ "SavedObject", "<T>" ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 306 + "lineNumber": 317 }, "deprecated": false }, @@ -15078,7 +15397,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 316 + "lineNumber": 327 }, "deprecated": false }, @@ -15096,7 +15415,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 320 + "lineNumber": 331 }, "deprecated": false } @@ -15275,7 +15594,7 @@ "\nRegister a {@link SavedObjectsType | savedObjects type} definition.\n\nSee the {@link SavedObjectsTypeMappingDefinition | mappings format} and\n{@link SavedObjectMigrationMap | migration format} for more details about these.\n" ], "signature": [ - "(type: ", + "<Attributes = any>(type: ", { "pluginId": "core", "scope": "server", @@ -15283,7 +15602,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - ") => void" + "<Attributes>) => void" ], "source": { "path": "src/core/server/saved_objects/saved_objects_service.ts", @@ -15306,7 +15625,8 @@ "docId": "kibCoreSavedObjectsPluginApi", "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" - } + }, + "<Attributes>" ], "source": { "path": "src/core/server/saved_objects/saved_objects_service.ts", @@ -16357,6 +16677,16 @@ "tags": [], "label": "SavedObjectsType", "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsType", + "text": "SavedObjectsType" + }, + "<Attributes>" + ], "source": { "path": "src/core/server/saved_objects/types.ts", "lineNumber": 256 @@ -16539,7 +16869,7 @@ "section": "def-server.SavedObjectsTypeManagementDefinition", "text": "SavedObjectsTypeManagementDefinition" }, - " | undefined" + "<Attributes> | undefined" ], "source": { "path": "src/core/server/saved_objects/types.ts", @@ -16559,6 +16889,16 @@ "description": [ "\nConfiguration options for the {@link SavedObjectsType | type}'s management section.\n" ], + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsTypeManagementDefinition", + "text": "SavedObjectsTypeManagementDefinition" + }, + "<Attributes>" + ], "source": { "path": "src/core/server/saved_objects/types.ts", "lineNumber": 348 @@ -16631,7 +16971,7 @@ "signature": [ "((savedObject: ", "SavedObject", - "<any>) => string) | undefined" + "<Attributes>) => string) | undefined" ], "source": { "path": "src/core/server/saved_objects/types.ts", @@ -16651,7 +16991,7 @@ "signature": [ "((savedObject: ", "SavedObject", - "<any>) => string) | undefined" + "<Attributes>) => string) | undefined" ], "source": { "path": "src/core/server/saved_objects/types.ts", @@ -16671,7 +17011,7 @@ "signature": [ "((savedObject: ", "SavedObject", - "<any>) => { path: string; uiCapabilitiesPath: string; }) | undefined" + "<Attributes>) => { path: string; uiCapabilitiesPath: string; }) | undefined" ], "source": { "path": "src/core/server/saved_objects/types.ts", @@ -16686,7 +17026,7 @@ "tags": [], "label": "onExport", "description": [ - "\nAn optional export transform function that can be used transform the objects of the registered type during\nthe export process.\n\nIt can be used to either mutate the exported objects, or add additional objects (of any type) to the export list.\n\nSee {@link SavedObjectsExportTransform | the transform type documentation} for more info and examples.\n" + "\nAn optional export transform function that can be used transform the objects of the registered type during\nthe export process.\n\nIt can be used to either mutate the exported objects, or add additional objects (of any type) to the export list.\n\nSee {@link SavedObjectsExportTransform | the transform type documentation} for more info and examples.\n\nWhen implementing both `isExportable` and `onExport`, it is mandatory that\n`isExportable` returns the same value for an object before and after going\nthough the export transform.\nE.g `isExportable(objectBeforeTransform) === isExportable(objectAfterTransform)`\n" ], "signature": [ { @@ -16696,11 +17036,11 @@ "section": "def-server.SavedObjectsExportTransform", "text": "SavedObjectsExportTransform" }, - " | undefined" + "<Attributes> | undefined" ], "source": { "path": "src/core/server/saved_objects/types.ts", - "lineNumber": 391 + "lineNumber": 398 }, "deprecated": false }, @@ -16721,11 +17061,30 @@ "section": "def-server.SavedObjectsImportHook", "text": "SavedObjectsImportHook" }, - "<unknown> | undefined" + "<Attributes> | undefined" + ], + "source": { + "path": "src/core/server/saved_objects/types.ts", + "lineNumber": 441 + }, + "deprecated": false + }, + { + "parentPluginId": "core", + "id": "def-server.SavedObjectsTypeManagementDefinition.isExportable", + "type": "Function", + "tags": [], + "label": "isExportable", + "description": [ + "\nOptional hook to specify whether an object should be exportable.\n\nIf specified, `isExportable` will be called during export for each\nof this type's objects in the export, and the ones not matching the\npredicate will be excluded from the export.\n\nWhen implementing both `isExportable` and `onExport`, it is mandatory that\n`isExportable` returns the same value for an object before and after going\nthough the export transform.\nE.g `isExportable(objectBeforeTransform) === isExportable(objectAfterTransform)`\n" + ], + "signature": [ + "SavedObjectsExportablePredicate", + "<Attributes> | undefined" ], "source": { "path": "src/core/server/saved_objects/types.ts", - "lineNumber": 434 + "lineNumber": 481 }, "deprecated": false } @@ -17047,7 +17406,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 215 + "lineNumber": 223 }, "deprecated": false, "children": [ @@ -17065,7 +17424,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 217 + "lineNumber": 225 }, "deprecated": false }, @@ -17084,7 +17443,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 219 + "lineNumber": 227 }, "deprecated": false }, @@ -17102,7 +17461,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 221 + "lineNumber": 229 }, "deprecated": false }, @@ -17120,7 +17479,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 223 + "lineNumber": 231 }, "deprecated": false } @@ -17150,7 +17509,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 295 + "lineNumber": 303 }, "deprecated": false, "children": [ @@ -17166,7 +17525,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 297 + "lineNumber": 305 }, "deprecated": false }, @@ -17183,7 +17542,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 298 + "lineNumber": 306 }, "deprecated": false } @@ -17225,7 +17584,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/saved_objects_exporter.ts", - "lineNumber": 30 + "lineNumber": 29 }, "deprecated": false, "initialIsOpen": false @@ -17549,7 +17908,7 @@ "section": "def-server.SavedObjectsIncrementCounterOptions", "text": "SavedObjectsIncrementCounterOptions" }, - "<T>) => Promise<", + "<T> | undefined) => Promise<", "SavedObject", "<T>>; openPointInTimeForType: (type: string | string[], { keepAlive, preference }?: ", { @@ -17611,7 +17970,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/lib/repository.ts", - "lineNumber": 156 + "lineNumber": 161 }, "deprecated": false, "initialIsOpen": false @@ -17634,7 +17993,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - " | undefined; getVisibleTypes: () => ", + "<any> | undefined; getVisibleTypes: () => ", { "pluginId": "core", "scope": "server", @@ -17642,7 +18001,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getAllTypes: () => ", + "<any>[]; getAllTypes: () => ", { "pluginId": "core", "scope": "server", @@ -17650,7 +18009,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; getImportableAndExportableTypes: () => ", + "<any>[]; getImportableAndExportableTypes: () => ", { "pluginId": "core", "scope": "server", @@ -17658,7 +18017,7 @@ "section": "def-server.SavedObjectsType", "text": "SavedObjectsType" }, - "[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" + "<any>[]; isNamespaceAgnostic: (type: string) => boolean; isSingleNamespace: (type: string) => boolean; isMultiNamespace: (type: string) => boolean; isShareable: (type: string) => boolean; isHidden: (type: string) => boolean; getIndex: (type: string) => string | undefined; isImportableAndExportable: (type: string) => boolean; }" ], "source": { "path": "src/core/server/saved_objects/saved_objects_type_registry.ts", @@ -18189,7 +18548,7 @@ ], "source": { "path": "src/core/server/saved_objects/service/saved_objects_client.ts", - "lineNumber": 350 + "lineNumber": 361 }, "deprecated": false, "initialIsOpen": false @@ -18239,7 +18598,7 @@ "\nTransformation function used to mutate the exported objects of the associated type.\n\nA type's export transform function will be executed once per user-initiated export,\nfor all objects of that type.\n" ], "signature": [ - "<T = unknown>(context: ", + "(context: ", { "pluginId": "core", "scope": "server", @@ -18257,7 +18616,7 @@ ], "source": { "path": "src/core/server/saved_objects/export/types.ts", - "lineNumber": 161 + "lineNumber": 175 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/core_saved_objects.mdx b/api_docs/core_saved_objects.mdx index fd3f96e081c9e3..55da0eea81ac28 100644 --- a/api_docs/core_saved_objects.mdx +++ b/api_docs/core_saved_objects.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.savedObjects'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import coreSavedObjectsObj from './core_saved_objects.json'; @@ -19,7 +18,7 @@ import coreSavedObjectsObj from './core_saved_objects.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2273 | 148 | 1052 | 26 | +| 2296 | 148 | 1056 | 30 | ## Client diff --git a/api_docs/dashboard.json b/api_docs/dashboard.json index 821d298ea1309e..793acb446174f2 100644 --- a/api_docs/dashboard.json +++ b/api_docs/dashboard.json @@ -1199,7 +1199,9 @@ "parentPluginId": "dashboard", "id": "def-public.createDashboardUrlGenerator", "type": "Function", - "tags": [], + "tags": [ + "deprecated" + ], "label": "createDashboardUrlGenerator", "description": [], "signature": [ @@ -1223,9 +1225,10 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 91 + "lineNumber": 97 }, - "deprecated": false, + "deprecated": true, + "references": [], "children": [ { "parentPluginId": "dashboard", @@ -1247,7 +1250,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 92 + "lineNumber": 98 }, "deprecated": false, "isRequired": true @@ -1258,6 +1261,297 @@ } ], "interfaces": [ + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams", + "type": "Interface", + "tags": [], + "label": "DashboardAppLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardAppLocatorParams", + "text": "DashboardAppLocatorParams" + }, + " extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + } + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.dashboardId", + "type": "string", + "tags": [], + "label": "dashboardId", + "description": [ + "\nIf given, the dashboard saved object with this id will be loaded. If not given,\na new, unsaved dashboard will be loaded up." + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.timeRange", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [ + "\nOptionally set the time range in the time picker." + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.refreshInterval", + "type": "CompoundType", + "tags": [], + "label": "refreshInterval", + "description": [ + "\nOptionally set the refresh interval." + ], + "signature": [ + "(", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.RefreshInterval", + "text": "RefreshInterval" + }, + " & ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + ") | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [ + "\nOptionally apply filers. NOTE: if given and used in conjunction with `dashboardId`, and the\nsaved dashboard has filters saved with it, this will _replace_ those filters." + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 49 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [ + "\nOptionally set a query. NOTE: if given and used in conjunction with `dashboardId`, and the\nsaved dashboard has a query saved with it, this will _replace_ that query." + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.useHash", + "type": "CompoundType", + "tags": [], + "label": "useHash", + "description": [ + "\nIf not given, will use the uiSettings configuration for `storeInSessionStorage`. useHash determines\nwhether to hash the data in the url to avoid url length issues." + ], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.preserveSavedFilters", + "type": "CompoundType", + "tags": [], + "label": "preserveSavedFilters", + "description": [ + "\nWhen `true` filters from saved filters from destination dashboard as merged with applied filters\nWhen `false` applied filters take precedence and override saved filters\n\ntrue is default" + ], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.viewMode", + "type": "CompoundType", + "tags": [], + "label": "viewMode", + "description": [ + "\nView mode of the dashboard." + ], + "signature": [ + { + "pluginId": "embeddable", + "scope": "common", + "docId": "kibEmbeddablePluginApi", + "section": "def-common.ViewMode", + "text": "ViewMode" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 72 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.searchSessionId", + "type": "string", + "tags": [], + "label": "searchSessionId", + "description": [ + "\nSearch search session ID to restore.\n(Background search)" + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 78 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.panels", + "type": "CompoundType", + "tags": [], + "label": "panels", + "description": [ + "\nList of dashboard panels" + ], + "signature": [ + "(", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel730ToLatest", + "text": "SavedDashboardPanel730ToLatest" + }, + "[] & ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + ") | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocatorParams.savedQuery", + "type": "string", + "tags": [], + "label": "savedQuery", + "description": [ + "\nSaved query ID" + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 88 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "dashboard", "id": "def-public.DashboardContainerInput", @@ -1547,7 +1841,7 @@ "description": [], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 92 + "lineNumber": 93 }, "deprecated": false, "children": [ @@ -1560,7 +1854,7 @@ "description": [], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 93 + "lineNumber": 94 }, "deprecated": false } @@ -2040,14 +2334,17 @@ "parentPluginId": "dashboard", "id": "def-public.DashboardUrlGeneratorState", "type": "Interface", - "tags": [], + "tags": [ + "deprecated" + ], "label": "DashboardUrlGeneratorState", "description": [], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 29 + "lineNumber": 32 }, - "deprecated": false, + "deprecated": true, + "references": [], "children": [ { "parentPluginId": "dashboard", @@ -2063,7 +2360,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 34 + "lineNumber": 37 }, "deprecated": false }, @@ -2088,7 +2385,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 38 + "lineNumber": 41 }, "deprecated": false }, @@ -2113,7 +2410,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 43 + "lineNumber": 46 }, "deprecated": false }, @@ -2138,7 +2435,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 49 + "lineNumber": 52 }, "deprecated": false }, @@ -2163,7 +2460,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 54 + "lineNumber": 57 }, "deprecated": false }, @@ -2181,7 +2478,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 59 + "lineNumber": 62 }, "deprecated": false }, @@ -2199,7 +2496,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 67 + "lineNumber": 70 }, "deprecated": false }, @@ -2224,7 +2521,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 72 + "lineNumber": 75 }, "deprecated": false }, @@ -2242,7 +2539,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 78 + "lineNumber": 81 }, "deprecated": false }, @@ -2267,7 +2564,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 83 + "lineNumber": 86 }, "deprecated": false }, @@ -2285,7 +2582,7 @@ ], "source": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 88 + "lineNumber": 91 }, "deprecated": false } @@ -2329,6 +2626,38 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardAppLocator", + "type": "Type", + "tags": [], + "label": "DashboardAppLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardAppLocatorParams", + "text": "DashboardAppLocatorParams" + }, + ">" + ], + "source": { + "path": "src/plugins/dashboard/public/locator.ts", + "lineNumber": 91 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "dashboard", "id": "def-public.DashboardUrlGenerator", @@ -2348,7 +2677,7 @@ ], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 90 + "lineNumber": 91 }, "deprecated": false, "initialIsOpen": false @@ -2532,18 +2861,40 @@ "setup": { "parentPluginId": "dashboard", "id": "def-public.DashboardSetup", - "type": "Type", + "type": "Interface", "tags": [], "label": "DashboardSetup", "description": [], - "signature": [ - "void" - ], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 124 + "lineNumber": 125 }, "deprecated": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardSetup.locator", + "type": "Object", + "tags": [], + "label": "locator", + "description": [], + "signature": [ + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardAppLocator", + "text": "DashboardAppLocator" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/plugin.tsx", + "lineNumber": 126 + }, + "deprecated": false + } + ], "lifecycle": "setup", "initialIsOpen": true }, @@ -2556,7 +2907,7 @@ "description": [], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 126 + "lineNumber": 129 }, "deprecated": false, "children": [ @@ -2579,7 +2930,7 @@ ], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 127 + "lineNumber": 130 }, "deprecated": false, "returnComment": [], @@ -2597,7 +2948,7 @@ ], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 128 + "lineNumber": 131 }, "deprecated": false, "returnComment": [], @@ -2607,7 +2958,9 @@ "parentPluginId": "dashboard", "id": "def-public.DashboardStart.dashboardUrlGenerator", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "dashboardUrlGenerator", "description": [], "signature": [ @@ -2622,7 +2975,39 @@ ], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 131 + "lineNumber": 142 + }, + "deprecated": true, + "references": [ + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx", + "lineNumber": 24 + } + } + ] + }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardStart.locator", + "type": "Object", + "tags": [], + "label": "locator", + "description": [], + "signature": [ + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardAppLocator", + "text": "DashboardAppLocator" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/dashboard/public/plugin.tsx", + "lineNumber": 143 }, "deprecated": false }, @@ -2644,7 +3029,7 @@ ], "source": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 132 + "lineNumber": 144 }, "deprecated": false } diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index de34ce88a77be5..2adae80a02061f 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dashboardObj from './dashboard.json'; @@ -19,7 +18,7 @@ import dashboardObj from './dashboard.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 145 | 1 | 133 | 9 | +| 160 | 1 | 137 | 9 | ## Client diff --git a/api_docs/dashboard_enhanced.json b/api_docs/dashboard_enhanced.json index b1ce19250a597d..09eda93ed0144e 100644 --- a/api_docs/dashboard_enhanced.json +++ b/api_docs/dashboard_enhanced.json @@ -124,10 +124,10 @@ }, { "parentPluginId": "dashboardEnhanced", - "id": "def-public.AbstractDashboardDrilldown.getURL", + "id": "def-public.AbstractDashboardDrilldown.getLocation", "type": "Function", "tags": [], - "label": "getURL", + "label": "getLocation", "description": [], "signature": [ "(config: ", @@ -139,14 +139,8 @@ "text": "DrilldownConfig" }, ", context: Context) => Promise<", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.KibanaURL", - "text": "KibanaURL" - }, - ">" + "KibanaLocation", + "<object>>" ], "source": { "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", @@ -156,7 +150,7 @@ "children": [ { "parentPluginId": "dashboardEnhanced", - "id": "def-public.AbstractDashboardDrilldown.getURL.$1", + "id": "def-public.AbstractDashboardDrilldown.getLocation.$1", "type": "Object", "tags": [], "label": "config", @@ -179,7 +173,7 @@ }, { "parentPluginId": "dashboardEnhanced", - "id": "def-public.AbstractDashboardDrilldown.getURL.$2", + "id": "def-public.AbstractDashboardDrilldown.getLocation.$2", "type": "Uncategorized", "tags": [], "label": "context", @@ -459,7 +453,7 @@ ], "source": { "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", - "lineNumber": 72 + "lineNumber": 76 }, "deprecated": false, "children": [ @@ -481,7 +475,7 @@ ], "source": { "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", - "lineNumber": 72 + "lineNumber": 76 }, "deprecated": false, "isRequired": true @@ -498,7 +492,7 @@ ], "source": { "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", - "lineNumber": 72 + "lineNumber": 76 }, "deprecated": false, "isRequired": true @@ -508,24 +502,32 @@ }, { "parentPluginId": "dashboardEnhanced", - "id": "def-public.AbstractDashboardDrilldown.urlGenerator", + "id": "def-public.AbstractDashboardDrilldown.locator", "type": "Object", "tags": [], - "label": "urlGenerator", + "label": "locator", "description": [], "signature": [ { "pluginId": "share", - "scope": "public", + "scope": "common", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorContract", - "text": "UrlGeneratorContract" + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" }, - "<\"DASHBOARD_APP_URL_GENERATOR\">" + "<", + { + "pluginId": "dashboard", + "scope": "public", + "docId": "kibDashboardPluginApi", + "section": "def-public.DashboardAppLocatorParams", + "text": "DashboardAppLocatorParams" + }, + ">" ], "source": { "path": "x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx", - "lineNumber": 77 + "lineNumber": 84 }, "deprecated": false } diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 4af7f6f96cf23c..41c3513a12a4ed 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dashboardEnhancedObj from './dashboard_enhanced.json'; diff --git a/api_docs/dashboard_mode.mdx b/api_docs/dashboard_mode.mdx index 28b68e29bd5f26..606532e85fe783 100644 --- a/api_docs/dashboard_mode.mdx +++ b/api_docs/dashboard_mode.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardMode'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dashboardModeObj from './dashboard_mode.json'; diff --git a/api_docs/data.json b/api_docs/data.json index 993dcec522d5e8..d1d776b5aea843 100644 --- a/api_docs/data.json +++ b/api_docs/data.json @@ -446,7 +446,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 202 + "lineNumber": 201 }, "deprecated": false, "children": [ @@ -469,7 +469,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 202 + "lineNumber": 201 }, "deprecated": false, "isRequired": false @@ -489,7 +489,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false, "children": [], @@ -507,7 +507,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false, "children": [ @@ -523,7 +523,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false, "isRequired": true @@ -540,7 +540,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false, "isRequired": true @@ -580,7 +580,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 236 + "lineNumber": 235 }, "deprecated": false, "children": [ @@ -604,7 +604,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 236 + "lineNumber": 235 }, "deprecated": false, "isRequired": true @@ -628,7 +628,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 236 + "lineNumber": 235 }, "deprecated": false, "isRequired": false @@ -660,7 +660,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "children": [ @@ -685,7 +685,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "isRequired": false @@ -709,7 +709,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 292 + "lineNumber": 291 }, "deprecated": false, "children": [], @@ -733,7 +733,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 323 + "lineNumber": 322 }, "deprecated": true, "references": [ @@ -762,7 +762,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 334 + "lineNumber": 333 }, "deprecated": false, "children": [], @@ -788,7 +788,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 343 + "lineNumber": 342 }, "deprecated": false, "children": [], @@ -824,7 +824,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 398 + "lineNumber": 397 }, "deprecated": false, "children": [], @@ -850,7 +850,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 402 + "lineNumber": 401 }, "deprecated": false, "children": [], @@ -876,7 +876,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 406 + "lineNumber": 405 }, "deprecated": false, "children": [], @@ -894,7 +894,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 410 + "lineNumber": 409 }, "deprecated": false, "children": [ @@ -910,7 +910,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 410 + "lineNumber": 409 }, "deprecated": false, "isRequired": true @@ -930,7 +930,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 414 + "lineNumber": 413 }, "deprecated": false, "children": [ @@ -946,7 +946,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 414 + "lineNumber": 413 }, "deprecated": false, "isRequired": true @@ -963,7 +963,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 414 + "lineNumber": 413 }, "deprecated": false, "isRequired": false @@ -983,7 +983,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 422 + "lineNumber": 421 }, "deprecated": false, "children": [], @@ -1001,7 +1001,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 428 + "lineNumber": 427 }, "deprecated": false, "children": [], @@ -1021,7 +1021,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 437 + "lineNumber": 436 }, "deprecated": false, "children": [], @@ -1039,7 +1039,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 441 + "lineNumber": 440 }, "deprecated": false, "children": [ @@ -1055,7 +1055,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 441 + "lineNumber": 440 }, "deprecated": false, "isRequired": true @@ -1082,7 +1082,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 455 + "lineNumber": 454 }, "deprecated": false, "children": [], @@ -1108,7 +1108,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 459 + "lineNumber": 458 }, "deprecated": false, "children": [], @@ -1126,7 +1126,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 463 + "lineNumber": 462 }, "deprecated": false, "children": [], @@ -1144,7 +1144,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 468 + "lineNumber": 467 }, "deprecated": false, "children": [], @@ -1193,7 +1193,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 479 + "lineNumber": 478 }, "deprecated": false }, @@ -1240,7 +1240,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 483 + "lineNumber": 482 }, "deprecated": false }, @@ -1264,7 +1264,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 513 + "lineNumber": 512 }, "deprecated": false, "children": [ @@ -1286,7 +1286,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 513 + "lineNumber": 512 }, "deprecated": false, "isRequired": true @@ -1648,6 +1648,36 @@ ], "returnComment": [] }, + { + "parentPluginId": "data", + "id": "def-public.AggConfigs.getResolvedTimeRange", + "type": "Function", + "tags": [], + "label": "getResolvedTimeRange", + "description": [ + "\nReturns the current time range as moment instance (date math will get resolved using the current \"now\" value or system time if not set)" + ], + "signature": [ + "() => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRangeBounds", + "text": "TimeRangeBounds" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_configs.ts", + "lineNumber": 134 + }, + "deprecated": false, + "children": [], + "returnComment": [ + "Current time range as resolved date." + ] + }, { "parentPluginId": "data", "id": "def-public.AggConfigs.clone", @@ -1667,7 +1697,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 131 + "lineNumber": 144 }, "deprecated": false, "children": [ @@ -1683,7 +1713,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 131 + "lineNumber": 144 }, "deprecated": false, "isRequired": true @@ -1737,7 +1767,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 144 + "lineNumber": 157 }, "deprecated": false, "children": [ @@ -1771,7 +1801,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 145 + "lineNumber": 158 }, "deprecated": false, "isRequired": true @@ -1788,7 +1818,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 146 + "lineNumber": 159 }, "deprecated": false, "isRequired": true @@ -1818,7 +1848,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 187 + "lineNumber": 200 }, "deprecated": false, "children": [ @@ -1843,7 +1873,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 187 + "lineNumber": 200 }, "deprecated": false, "isRequired": true @@ -1863,7 +1893,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 199 + "lineNumber": 212 }, "deprecated": false, "children": [], @@ -1889,7 +1919,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 289 + "lineNumber": 302 }, "deprecated": false, "children": [], @@ -1914,7 +1944,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 293 + "lineNumber": 306 }, "deprecated": false, "children": [ @@ -1930,7 +1960,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 293 + "lineNumber": 306 }, "deprecated": false, "isRequired": true @@ -1958,7 +1988,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 297 + "lineNumber": 310 }, "deprecated": false, "children": [ @@ -1974,7 +2004,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 297 + "lineNumber": 310 }, "deprecated": false, "isRequired": true @@ -2002,7 +2032,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 301 + "lineNumber": 314 }, "deprecated": false, "children": [ @@ -2018,7 +2048,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 301 + "lineNumber": 314 }, "deprecated": false, "isRequired": true @@ -2046,7 +2076,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 305 + "lineNumber": 318 }, "deprecated": false, "children": [ @@ -2062,7 +2092,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 305 + "lineNumber": 318 }, "deprecated": false, "isRequired": true @@ -2090,7 +2120,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 309 + "lineNumber": 322 }, "deprecated": false, "children": [ @@ -2106,7 +2136,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 309 + "lineNumber": 322 }, "deprecated": false, "isRequired": true @@ -2134,7 +2164,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 313 + "lineNumber": 326 }, "deprecated": false, "children": [ @@ -2150,7 +2180,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 313 + "lineNumber": 326 }, "deprecated": false, "isRequired": true @@ -2178,7 +2208,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 317 + "lineNumber": 330 }, "deprecated": false, "children": [], @@ -2196,7 +2226,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 331 + "lineNumber": 344 }, "deprecated": false, "children": [], @@ -2214,7 +2244,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 346 + "lineNumber": 359 }, "deprecated": false, "children": [], @@ -2232,7 +2262,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 353 + "lineNumber": 366 }, "deprecated": false, "children": [], @@ -2258,7 +2288,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 357 + "lineNumber": 370 }, "deprecated": false, "children": [ @@ -2274,7 +2304,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 357 + "lineNumber": 370 }, "deprecated": false, "isRequired": false @@ -2310,7 +2340,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 410 + "lineNumber": 423 }, "deprecated": false, "children": [ @@ -2333,7 +2363,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 410 + "lineNumber": 423 }, "deprecated": false, "isRequired": true @@ -2361,7 +2391,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 429 + "lineNumber": 442 }, "deprecated": false, "children": [ @@ -2377,7 +2407,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 429 + "lineNumber": 442 }, "deprecated": false, "isRequired": true @@ -2409,7 +2439,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 444 + "lineNumber": 457 }, "deprecated": false, "children": [], @@ -2439,7 +2469,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 458 + "lineNumber": 471 }, "deprecated": false, "children": [ @@ -2457,7 +2487,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 458 + "lineNumber": 471 }, "deprecated": false, "isRequired": true @@ -2493,7 +2523,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 467 + "lineNumber": 480 }, "deprecated": false, "children": [ @@ -2517,7 +2547,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 467 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -2541,7 +2571,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 467 + "lineNumber": 480 }, "deprecated": false, "isRequired": false @@ -4347,22 +4377,7 @@ "lineNumber": 272 }, "deprecated": true, - "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx", - "lineNumber": 117 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 778 - } - } - ], + "references": [], "children": [ { "parentPluginId": "data", @@ -4412,34 +4427,6 @@ }, "deprecated": true, "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx", - "lineNumber": 152 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 66 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 74 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 204 - } - }, { "plugin": "visTypeTimeseries", "link": { @@ -4506,15 +4493,7 @@ "lineNumber": 291 }, "deprecated": true, - "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx", - "lineNumber": 61 - } - } - ], + "references": [], "children": [], "returnComment": [] }, @@ -4782,7 +4761,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 }, "deprecated": false, "children": [ @@ -4800,7 +4779,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 }, "deprecated": false, "isRequired": true @@ -4825,7 +4804,145 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-public.IndexPattern.hasRuntimeField", + "type": "Function", + "tags": [], + "label": "hasRuntimeField", + "description": [ + "\nChecks if runtime field exists" + ], + "signature": [ + "(name: string) => boolean" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 389 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-public.IndexPattern.hasRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 389 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-public.IndexPattern.getRuntimeField", + "type": "Function", + "tags": [], + "label": "getRuntimeField", + "description": [ + "\nReturns runtime field if exists" + ], + "signature": [ + "(name: string) => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + " | null" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 397 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-public.IndexPattern.getRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 397 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-public.IndexPattern.replaceAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "replaceAllRuntimeFields", + "description": [ + "\nReplaces all existing runtime fields with new fields" + ], + "signature": [ + "(newFields: Record<string, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ">) => void" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 405 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-public.IndexPattern.replaceAllRuntimeFields.$1", + "type": "Object", + "tags": [], + "label": "newFields", + "description": [], + "signature": [ + "Record<string, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ">" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 405 }, "deprecated": false, "isRequired": true @@ -4840,14 +4957,14 @@ "tags": [], "label": "removeRuntimeField", "description": [ - "\nRemove a runtime field - removed from mapped field or removed unmapped\nfield as appropriate" + "\nRemove a runtime field - removed from mapped field or removed unmapped\nfield as appropriate. Doesn't clear associated field attributes." ], "signature": [ "(name: string) => void" ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 392 + "lineNumber": 421 }, "deprecated": false, "children": [ @@ -4858,14 +4975,14 @@ "tags": [], "label": "name", "description": [ - "Field name" + "- Field name to remove" ], "signature": [ "string" ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 392 + "lineNumber": 421 }, "deprecated": false, "isRequired": true @@ -4895,7 +5012,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 412 + "lineNumber": 438 }, "deprecated": false, "children": [ @@ -4911,7 +5028,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 412 + "lineNumber": 438 }, "deprecated": false, "isRequired": true @@ -4939,7 +5056,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 419 + "lineNumber": 445 }, "deprecated": false, "children": [ @@ -4955,7 +5072,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 420 + "lineNumber": 446 }, "deprecated": false, "isRequired": true @@ -4972,7 +5089,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 421 + "lineNumber": 447 }, "deprecated": false, "isRequired": true @@ -4996,7 +5113,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 422 + "lineNumber": 448 }, "deprecated": false, "isRequired": true @@ -5016,7 +5133,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "children": [ @@ -5032,7 +5149,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "isRequired": true @@ -5049,7 +5166,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "isRequired": false @@ -5069,7 +5186,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "children": [ @@ -5085,7 +5202,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "isRequired": true @@ -5102,7 +5219,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "isRequired": false @@ -5130,7 +5247,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "children": [ @@ -5146,7 +5263,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -5170,7 +5287,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -5190,7 +5307,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 458 + "lineNumber": 484 }, "deprecated": false, "children": [ @@ -5206,7 +5323,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 458 + "lineNumber": 484 }, "deprecated": false, "isRequired": true @@ -5883,7 +6000,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false, "children": [ @@ -5899,7 +6016,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 67 + "lineNumber": 66 }, "deprecated": false, "returnComment": [], @@ -5917,7 +6034,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -5933,7 +6050,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "isRequired": true @@ -5955,7 +6072,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "children": [ @@ -5973,7 +6090,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "isRequired": true @@ -5995,7 +6112,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "children": [ @@ -6013,7 +6130,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "isRequired": true @@ -6043,7 +6160,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "children": [ @@ -6059,7 +6176,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -6076,7 +6193,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -6100,7 +6217,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false, "children": [ @@ -6118,7 +6235,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 157 + "lineNumber": 156 }, "deprecated": false, "isRequired": true @@ -6140,7 +6257,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "children": [ @@ -6158,7 +6275,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "isRequired": false @@ -6182,7 +6299,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 184 + "lineNumber": 183 }, "deprecated": false, "children": [], @@ -6210,7 +6327,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 194 + "lineNumber": 193 }, "deprecated": false, "children": [], @@ -6230,7 +6347,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false, "children": [], @@ -6250,7 +6367,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -6266,7 +6383,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": false @@ -6283,7 +6400,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -6313,7 +6430,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "children": [ @@ -6335,7 +6452,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "isRequired": true @@ -6383,7 +6500,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 243 + "lineNumber": 242 }, "deprecated": false, "children": [ @@ -6413,7 +6530,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 244 + "lineNumber": 243 }, "deprecated": false, "isRequired": true @@ -6437,7 +6554,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 245 + "lineNumber": 244 }, "deprecated": false, "isRequired": false @@ -6469,7 +6586,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "children": [ @@ -6491,7 +6608,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "isRequired": true @@ -6537,7 +6654,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "children": [ @@ -6562,7 +6679,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": true @@ -6588,7 +6705,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": false @@ -6629,7 +6746,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "children": [ @@ -6654,7 +6771,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "isRequired": true @@ -6686,7 +6803,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "children": [ @@ -6702,7 +6819,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "isRequired": true @@ -6740,7 +6857,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "children": [ @@ -6762,7 +6879,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -6779,7 +6896,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -6819,7 +6936,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "children": [ @@ -6841,7 +6958,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -6860,7 +6977,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -6879,7 +6996,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -6917,7 +7034,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "children": [ @@ -6939,7 +7056,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -6958,7 +7075,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -6988,7 +7105,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 570 + "lineNumber": 573 }, "deprecated": false, "children": [ @@ -7010,7 +7127,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 571 + "lineNumber": 574 }, "deprecated": false, "isRequired": true @@ -7027,7 +7144,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 572 + "lineNumber": 575 }, "deprecated": false, "isRequired": true @@ -7044,7 +7161,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 573 + "lineNumber": 576 }, "deprecated": false, "isRequired": true @@ -7066,7 +7183,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "children": [ @@ -7084,7 +7201,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "isRequired": true @@ -7682,15 +7799,15 @@ { "plugin": "discover", "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 207 + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 288 } }, { "plugin": "discover", "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 213 + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 294 } } ], @@ -7993,6 +8110,13 @@ "lineNumber": 77 } }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/angular/context/api/anchor.ts", + "lineNumber": 52 + } + }, { "plugin": "maps", "link": { @@ -8004,14 +8128,14 @@ "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 498 + "lineNumber": 530 } }, { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/layers/blended_vector_layer/blended_vector_layer.ts", - "lineNumber": 330 + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", + "lineNumber": 819 } } ], @@ -8306,7 +8430,7 @@ ], "source": { "path": "src/plugins/data/common/search/search_source/extract_references.ts", - "lineNumber": 13 + "lineNumber": 15 }, "deprecated": false, "children": [ @@ -8328,7 +8452,7 @@ ], "source": { "path": "src/plugins/data/common/search/search_source/extract_references.ts", - "lineNumber": 14 + "lineNumber": 16 }, "deprecated": false, "isRequired": true @@ -11807,7 +11931,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 154 + "lineNumber": 153 }, "deprecated": false, "children": [ @@ -11823,7 +11947,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 155 + "lineNumber": 154 }, "deprecated": false }, @@ -11839,7 +11963,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false } @@ -11868,20 +11992,6 @@ "lineNumber": 104 } }, - { - "plugin": "discover", - "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 23 - } - }, - { - "plugin": "discover", - "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 59 - } - }, { "plugin": "maps", "link": { @@ -12152,21 +12262,21 @@ "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 13 + "lineNumber": 12 } }, { "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 164 + "lineNumber": 175 } }, { "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 281 + "lineNumber": 292 } }, { @@ -12246,90 +12356,6 @@ "lineNumber": 66 } }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 43 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts", - "lineNumber": 12 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts", - "lineNumber": 11 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx", - "lineNumber": 11 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx", - "lineNumber": 23 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 45 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 148 - } - }, { "plugin": "ml", "link": { @@ -13128,6 +13154,20 @@ "lineNumber": 9 } }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 25 + } + }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 53 + } + }, { "plugin": "maps", "link": { @@ -13202,7 +13242,7 @@ "plugin": "lens", "link": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/types.ts", - "lineNumber": 57 + "lineNumber": 60 } }, { @@ -14028,7 +14068,14 @@ "plugin": "stackAlerts", "link": { "path": "x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx", - "lineNumber": 45 + "lineNumber": 26 + } + }, + { + "plugin": "stackAlerts", + "link": { + "path": "x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx", + "lineNumber": 26 } }, { @@ -14083,14 +14130,14 @@ { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts", "lineNumber": 10 } }, { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts", "lineNumber": 12 } } @@ -14437,9 +14484,26 @@ ], "label": "IIndexPattern", "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IIndexPattern", + "text": "IIndexPattern" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" + } + ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": true, "references": [ @@ -14534,118 +14598,6 @@ "lineNumber": 72 } }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 29 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 29 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 46 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 32 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 32 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 43 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 50 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx", - "lineNumber": 22 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx", - "lineNumber": 171 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx", - "lineNumber": 15 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx", - "lineNumber": 18 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx", - "lineNumber": 12 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx", - "lineNumber": 15 - } - }, { "plugin": "savedObjectsManagement", "link": { @@ -14930,7 +14882,7 @@ "plugin": "infra", "link": { "path": "x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx", - "lineNumber": 32 + "lineNumber": 31 } }, { @@ -14958,7 +14910,7 @@ "plugin": "infra", "link": { "path": "x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx", - "lineNumber": 23 + "lineNumber": 24 } }, { @@ -15004,94 +14956,143 @@ } }, { - "plugin": "securitySolution", + "plugin": "timelines", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", - "lineNumber": 22 + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 8 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 86 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", - "lineNumber": 72 + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 8 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 86 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 17 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 22 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 37 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 80 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/t_grid/helpers.tsx", "lineNumber": 20 } }, { - "plugin": "securitySolution", + "plugin": "timelines", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", - "lineNumber": 100 + "path": "x-pack/plugins/timelines/public/components/t_grid/helpers.tsx", + "lineNumber": 153 } }, { - "plugin": "securitySolution", + "plugin": "timelines", "link": { - "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", - "lineNumber": 8 + "path": "x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx", + "lineNumber": 31 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx", + "lineNumber": 121 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", - "lineNumber": 86 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", + "lineNumber": 23 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", + "lineNumber": 81 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", - "lineNumber": 48 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", + "lineNumber": 20 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", - "lineNumber": 122 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", + "lineNumber": 100 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", - "lineNumber": 13 + "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", - "lineNumber": 112 + "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", + "lineNumber": 48 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", - "lineNumber": 152 + "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", + "lineNumber": 122 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/lib/keury/index.ts", - "lineNumber": 16 + "lineNumber": 17 } }, { @@ -15182,14 +15183,14 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx", - "lineNumber": 35 + "lineNumber": 36 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx", - "lineNumber": 122 + "lineNumber": 126 } }, { @@ -15237,148 +15238,169 @@ { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", - "lineNumber": 18 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", + "lineNumber": 55 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", - "lineNumber": 51 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", + "lineNumber": 77 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", - "lineNumber": 8 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", + "lineNumber": 82 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", - "lineNumber": 41 + "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", + "lineNumber": 13 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", + "lineNumber": 128 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", - "lineNumber": 34 + "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", + "lineNumber": 168 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", - "lineNumber": 48 + "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", + "lineNumber": 18 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", - "lineNumber": 64 + "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", + "lineNumber": 51 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", - "lineNumber": 69 + "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", + "lineNumber": 8 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", + "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", + "lineNumber": 41 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", - "lineNumber": 28 + "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", + "lineNumber": 34 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 15 + "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", + "lineNumber": 9 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 58 + "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", + "lineNumber": 65 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 132 + "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", + "lineNumber": 20 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 164 + "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", + "lineNumber": 44 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", - "lineNumber": 9 + "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", + "lineNumber": 21 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", - "lineNumber": 65 + "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", + "lineNumber": 33 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", - "lineNumber": 20 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", - "lineNumber": 44 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", + "lineNumber": 28 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", - "lineNumber": 21 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 15 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", - "lineNumber": 33 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 58 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 132 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 164 } }, { @@ -15395,6 +15417,20 @@ "lineNumber": 28 } }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/mock/index_pattern.ts", + "lineNumber": 8 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/mock/index_pattern.ts", + "lineNumber": 10 + } + }, { "plugin": "lens", "link": { @@ -15437,6 +15473,20 @@ "lineNumber": 66 } }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts", + "lineNumber": 1 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts", + "lineNumber": 66 + } + }, { "plugin": "infra", "link": { @@ -15500,6 +15550,27 @@ "lineNumber": 23 } }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", + "lineNumber": 3 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", + "lineNumber": 25 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", + "lineNumber": 55 + } + }, { "plugin": "infra", "link": { @@ -15542,27 +15613,6 @@ "lineNumber": 5 } }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", - "lineNumber": 3 - } - }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", - "lineNumber": 25 - } - }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", - "lineNumber": 55 - } - }, { "plugin": "securitySolution", "link": { @@ -15756,7 +15806,7 @@ "plugin": "infra", "link": { "path": "x-pack/plugins/infra/public/pages/metrics/index.tsx", - "lineNumber": 193 + "lineNumber": 162 } }, { @@ -15909,22 +15959,36 @@ { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", "lineNumber": 9 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", - "lineNumber": 35 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", - "lineNumber": 53 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 12 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 12 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 13 } }, { @@ -15966,42 +16030,28 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", - "lineNumber": 485 + "lineNumber": 504 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", "lineNumber": 9 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 12 - } - }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 12 - } - }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "lineNumber": 35 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 13 + "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "lineNumber": 52 } }, { @@ -16078,7 +16128,7 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts", - "lineNumber": 52 + "lineNumber": 53 } }, { @@ -16365,7 +16415,7 @@ "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 104 + "lineNumber": 94 } }, { @@ -16379,35 +16429,28 @@ "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 53 + "lineNumber": 56 } }, { "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 61 + "lineNumber": 64 } }, { "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 69 - } - }, - { - "plugin": "observability", - "link": { - "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts", - "lineNumber": 19 + "lineNumber": 72 } }, { "plugin": "observability", "link": { - "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts", - "lineNumber": 25 + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", + "lineNumber": 89 } }, { @@ -16650,29 +16693,6 @@ } ], "children": [ - { - "parentPluginId": "data", - "id": "def-public.IIndexPattern.fields", - "type": "Array", - "tags": [], - "label": "fields", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IFieldType", - "text": "IFieldType" - }, - "[]" - ], - "source": { - "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 33 - }, - "deprecated": false - }, { "parentPluginId": "data", "id": "def-public.IIndexPattern.title", @@ -16686,22 +16706,6 @@ }, "deprecated": false }, - { - "parentPluginId": "data", - "id": "def-public.IIndexPattern.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 35 - }, - "deprecated": false - }, { "parentPluginId": "data", "id": "def-public.IIndexPattern.type", @@ -16716,7 +16720,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 39 + "lineNumber": 38 }, "deprecated": false }, @@ -16732,7 +16736,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 40 + "lineNumber": 39 }, "deprecated": false }, @@ -16756,7 +16760,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 41 + "lineNumber": 40 }, "deprecated": false, "children": [], @@ -16782,7 +16786,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 42 + "lineNumber": 41 }, "deprecated": false }, @@ -16832,7 +16836,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false } @@ -17347,7 +17351,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 74 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -17365,7 +17369,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 78 + "lineNumber": 83 }, "deprecated": false }, @@ -17381,7 +17385,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 80 + "lineNumber": 85 }, "deprecated": false } @@ -17501,6 +17505,24 @@ }, "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-public.IKibanaSearchResponse.isRestored", + "type": "CompoundType", + "tags": [], + "label": "isRestored", + "description": [ + "\nIndicates whether the results returned are from the async-search index" + ], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "src/plugins/data/common/search/types.ts", + "lineNumber": 71 + }, + "deprecated": false + }, { "parentPluginId": "data", "id": "def-public.IKibanaSearchResponse.rawResponse", @@ -17515,7 +17537,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 71 + "lineNumber": 76 }, "deprecated": false } @@ -17533,7 +17555,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 54 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -17546,7 +17568,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 55 + "lineNumber": 54 }, "deprecated": false }, @@ -17559,7 +17581,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 56 + "lineNumber": 55 }, "deprecated": false }, @@ -17572,7 +17594,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false }, @@ -17585,7 +17607,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 58 + "lineNumber": 57 }, "deprecated": false }, @@ -17601,7 +17623,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false }, @@ -17617,7 +17639,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false }, @@ -17633,7 +17655,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 61 + "lineNumber": 60 }, "deprecated": false }, @@ -17649,7 +17671,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 62 + "lineNumber": 61 }, "deprecated": false }, @@ -17665,7 +17687,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 63 + "lineNumber": 62 }, "deprecated": false }, @@ -17681,7 +17703,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 64 + "lineNumber": 63 }, "deprecated": false }, @@ -17699,7 +17721,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false } @@ -17717,7 +17739,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 225 + "lineNumber": 224 }, "deprecated": false, "children": [ @@ -17735,7 +17757,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false }, @@ -17753,7 +17775,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 233 + "lineNumber": 232 }, "deprecated": false }, @@ -17769,7 +17791,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 234 + "lineNumber": 233 }, "deprecated": false }, @@ -17787,7 +17809,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 239 + "lineNumber": 238 }, "deprecated": true, "references": [] @@ -17804,7 +17826,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false }, @@ -17827,7 +17849,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 241 + "lineNumber": 240 }, "deprecated": false }, @@ -17851,7 +17873,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 242 + "lineNumber": 241 }, "deprecated": false }, @@ -17874,7 +17896,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 243 + "lineNumber": 242 }, "deprecated": false }, @@ -17890,7 +17912,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 244 + "lineNumber": 243 }, "deprecated": false }, @@ -17914,7 +17936,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 245 + "lineNumber": 244 }, "deprecated": false }, @@ -17938,7 +17960,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 246 + "lineNumber": 245 }, "deprecated": false }, @@ -17961,7 +17983,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 247 + "lineNumber": 246 }, "deprecated": false }, @@ -17977,7 +17999,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false } @@ -17993,7 +18015,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 90 + "lineNumber": 95 }, "deprecated": false, "children": [ @@ -18011,7 +18033,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 94 + "lineNumber": 99 }, "deprecated": false }, @@ -18029,7 +18051,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 99 + "lineNumber": 104 }, "deprecated": false }, @@ -18047,7 +18069,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 105 + "lineNumber": 110 }, "deprecated": false }, @@ -18065,7 +18087,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 110 + "lineNumber": 115 }, "deprecated": false }, @@ -18083,7 +18105,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 115 + "lineNumber": 120 }, "deprecated": false }, @@ -18101,7 +18123,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 121 + "lineNumber": 126 }, "deprecated": false }, @@ -18126,7 +18148,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 126 + "lineNumber": 131 }, "deprecated": false }, @@ -18151,7 +18173,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 131 + "lineNumber": 136 }, "deprecated": false } @@ -18428,7 +18450,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 35 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -18444,7 +18466,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false }, @@ -18460,7 +18482,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false }, @@ -18476,7 +18498,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 38 + "lineNumber": 39 }, "deprecated": false }, @@ -18492,7 +18514,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 39 + "lineNumber": 40 }, "deprecated": false }, @@ -18508,7 +18530,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false }, @@ -18524,7 +18546,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false }, @@ -18540,7 +18562,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 42 + "lineNumber": 43 }, "deprecated": false } @@ -19168,7 +19190,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 159 + "lineNumber": 158 }, "deprecated": false, "children": [ @@ -19184,7 +19206,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 160 + "lineNumber": 159 }, "deprecated": false }, @@ -19200,7 +19222,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 161 + "lineNumber": 160 }, "deprecated": false } @@ -19386,7 +19408,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 142 + "lineNumber": 141 }, "deprecated": false, "initialIsOpen": false @@ -19801,7 +19823,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false, "initialIsOpen": false @@ -20429,6 +20451,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-public.INDEX_PATTERN_SAVED_OBJECT_TYPE", + "type": "string", + "tags": [], + "label": "INDEX_PATTERN_SAVED_OBJECT_TYPE", + "description": [], + "signature": [ + "\"index-pattern\"" + ], + "source": { + "path": "src/plugins/data/common/constants.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-public.IndexPatternLoadExpressionFunctionDefinition", @@ -20651,7 +20690,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 662 + "lineNumber": 667 }, "deprecated": false, "initialIsOpen": false @@ -21012,7 +21051,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false, "initialIsOpen": false @@ -21044,7 +21083,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 19 + "lineNumber": 20 }, "deprecated": false, "initialIsOpen": false @@ -21103,7 +21142,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false, "initialIsOpen": false @@ -21135,7 +21174,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 50 + "lineNumber": 51 }, "deprecated": false, "initialIsOpen": false @@ -21439,9 +21478,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -21477,7 +21516,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 35 + "lineNumber": 36 }, "deprecated": false }, @@ -21493,7 +21532,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false }, @@ -21508,14 +21547,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false } @@ -21541,9 +21580,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -21579,7 +21618,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false }, @@ -21594,14 +21633,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false } @@ -21627,9 +21666,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -21665,7 +21704,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 61 + "lineNumber": 62 }, "deprecated": false }, @@ -21681,7 +21720,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 62 + "lineNumber": 63 }, "deprecated": false }, @@ -21696,14 +21735,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 63 + "lineNumber": 64 }, "deprecated": false } @@ -21805,9 +21844,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ", formattedValue?: string | undefined) => ", { @@ -21843,7 +21882,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 94 + "lineNumber": 92 }, "deprecated": false }, @@ -21865,7 +21904,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 95 + "lineNumber": 93 }, "deprecated": false }, @@ -21880,14 +21919,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 96 + "lineNumber": 94 }, "deprecated": false }, @@ -21903,7 +21942,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 97 + "lineNumber": 95 }, "deprecated": false } @@ -21945,7 +21984,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false } @@ -21987,7 +22026,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false } @@ -22029,7 +22068,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false } @@ -22071,7 +22110,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 73 + "lineNumber": 74 }, "deprecated": false } @@ -22447,7 +22486,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false } @@ -22505,7 +22544,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false } @@ -22571,8 +22610,8 @@ "; query?: any; }" ], "source": { - "path": "src/plugins/data/common/es_query/filters/get_display_value.ts", - "lineNumber": 31 + "path": "src/plugins/data/public/query/filter_manager/lib/get_display_value.ts", + "lineNumber": 30 }, "deprecated": false }, @@ -22594,8 +22633,8 @@ "[]" ], "source": { - "path": "src/plugins/data/common/es_query/filters/get_display_value.ts", - "lineNumber": 31 + "path": "src/plugins/data/public/query/filter_manager/lib/get_display_value.ts", + "lineNumber": 30 }, "deprecated": false } @@ -23605,18 +23644,12 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, config?: Record<string, any> | undefined, context?: Record<string, any> | undefined) => ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "src/plugins/data/public/index.ts", @@ -23658,9 +23691,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -23732,9 +23765,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, queries: ", { @@ -23820,9 +23853,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -23980,9 +24013,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { must: never[]; filter: ", { @@ -24043,9 +24076,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -25196,7 +25229,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 407 + "lineNumber": 409 }, "deprecated": false, "children": [ @@ -25209,7 +25242,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 408 + "lineNumber": 410 }, "deprecated": false, "children": [ @@ -25232,7 +25265,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 409 + "lineNumber": 411 }, "deprecated": false }, @@ -25248,7 +25281,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 410 + "lineNumber": 412 }, "deprecated": false, "returnComment": [], @@ -25288,7 +25321,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 411 + "lineNumber": 413 }, "deprecated": false }, @@ -25311,7 +25344,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 412 + "lineNumber": 414 }, "deprecated": false }, @@ -25334,7 +25367,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 413 + "lineNumber": 415 }, "deprecated": false }, @@ -25357,7 +25390,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 414 + "lineNumber": 416 }, "deprecated": false }, @@ -25380,7 +25413,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 415 + "lineNumber": 417 }, "deprecated": false, "returnComment": [], @@ -25423,7 +25456,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 416 + "lineNumber": 418 }, "deprecated": false, "returnComment": [], @@ -25472,7 +25505,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 417 + "lineNumber": 419 }, "deprecated": false, "returnComment": [], @@ -25521,7 +25554,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 418 + "lineNumber": 420 }, "deprecated": false, "returnComment": [], @@ -25556,7 +25589,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 419 + "lineNumber": 421 }, "deprecated": false, "returnComment": [], @@ -25588,7 +25621,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 420 + "lineNumber": 422 }, "deprecated": false, "returnComment": [], @@ -25633,7 +25666,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 421 + "lineNumber": 423 }, "deprecated": false }, @@ -25651,7 +25684,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 422 + "lineNumber": 424 }, "deprecated": false, "returnComment": [], @@ -25683,7 +25716,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 423 + "lineNumber": 425 }, "deprecated": false, "returnComment": [], @@ -25715,7 +25748,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 424 + "lineNumber": 426 }, "deprecated": false, "returnComment": [], @@ -25747,7 +25780,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 425 + "lineNumber": 427 }, "deprecated": false }, @@ -25763,7 +25796,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 426 + "lineNumber": 428 }, "deprecated": false }, @@ -25787,7 +25820,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 427 + "lineNumber": 429 }, "deprecated": false, "returnComment": [], @@ -25822,7 +25855,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 428 + "lineNumber": 430 }, "deprecated": false }, @@ -25846,7 +25879,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 429 + "lineNumber": 431 }, "deprecated": false, "returnComment": [], @@ -25903,7 +25936,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 430 + "lineNumber": 432 }, "deprecated": false, "returnComment": [], @@ -25963,7 +25996,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 432 + "lineNumber": 434 }, "deprecated": false, "returnComment": [], @@ -26040,7 +26073,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 433 + "lineNumber": 435 }, "deprecated": false, "returnComment": [], @@ -26125,7 +26158,7 @@ ], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 434 + "lineNumber": 436 }, "deprecated": false, "returnComment": [], @@ -26183,7 +26216,7 @@ ], "source": { "path": "src/plugins/data/common/constants.ts", - "lineNumber": 12 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false @@ -27925,22 +27958,7 @@ "lineNumber": 272 }, "deprecated": true, - "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx", - "lineNumber": 117 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 778 - } - } - ], + "references": [], "children": [ { "parentPluginId": "data", @@ -27990,34 +28008,6 @@ }, "deprecated": true, "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx", - "lineNumber": 152 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 66 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 74 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 204 - } - }, { "plugin": "visTypeTimeseries", "link": { @@ -28084,15 +28074,7 @@ "lineNumber": 291 }, "deprecated": true, - "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx", - "lineNumber": 61 - } - } - ], + "references": [], "children": [], "returnComment": [] }, @@ -28360,7 +28342,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 }, "deprecated": false, "children": [ @@ -28378,7 +28360,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 }, "deprecated": false, "isRequired": true @@ -28403,7 +28385,145 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-server.IndexPattern.hasRuntimeField", + "type": "Function", + "tags": [], + "label": "hasRuntimeField", + "description": [ + "\nChecks if runtime field exists" + ], + "signature": [ + "(name: string) => boolean" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 389 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-server.IndexPattern.hasRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 389 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-server.IndexPattern.getRuntimeField", + "type": "Function", + "tags": [], + "label": "getRuntimeField", + "description": [ + "\nReturns runtime field if exists" + ], + "signature": [ + "(name: string) => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + " | null" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 397 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-server.IndexPattern.getRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 397 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-server.IndexPattern.replaceAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "replaceAllRuntimeFields", + "description": [ + "\nReplaces all existing runtime fields with new fields" + ], + "signature": [ + "(newFields: Record<string, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ">) => void" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 405 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-server.IndexPattern.replaceAllRuntimeFields.$1", + "type": "Object", + "tags": [], + "label": "newFields", + "description": [], + "signature": [ + "Record<string, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ">" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 405 }, "deprecated": false, "isRequired": true @@ -28418,14 +28538,14 @@ "tags": [], "label": "removeRuntimeField", "description": [ - "\nRemove a runtime field - removed from mapped field or removed unmapped\nfield as appropriate" + "\nRemove a runtime field - removed from mapped field or removed unmapped\nfield as appropriate. Doesn't clear associated field attributes." ], "signature": [ "(name: string) => void" ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 392 + "lineNumber": 421 }, "deprecated": false, "children": [ @@ -28436,14 +28556,14 @@ "tags": [], "label": "name", "description": [ - "Field name" + "- Field name to remove" ], "signature": [ "string" ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 392 + "lineNumber": 421 }, "deprecated": false, "isRequired": true @@ -28473,7 +28593,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 412 + "lineNumber": 438 }, "deprecated": false, "children": [ @@ -28489,7 +28609,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 412 + "lineNumber": 438 }, "deprecated": false, "isRequired": true @@ -28517,7 +28637,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 419 + "lineNumber": 445 }, "deprecated": false, "children": [ @@ -28533,7 +28653,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 420 + "lineNumber": 446 }, "deprecated": false, "isRequired": true @@ -28550,7 +28670,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 421 + "lineNumber": 447 }, "deprecated": false, "isRequired": true @@ -28574,7 +28694,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 422 + "lineNumber": 448 }, "deprecated": false, "isRequired": true @@ -28594,7 +28714,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "children": [ @@ -28610,7 +28730,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "isRequired": true @@ -28627,7 +28747,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "isRequired": false @@ -28647,7 +28767,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "children": [ @@ -28663,7 +28783,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "isRequired": true @@ -28680,7 +28800,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "isRequired": false @@ -28708,7 +28828,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "children": [ @@ -28724,7 +28844,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -28748,7 +28868,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -28768,7 +28888,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 458 + "lineNumber": 484 }, "deprecated": false, "children": [ @@ -28784,7 +28904,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 458 + "lineNumber": 484 }, "deprecated": false, "isRequired": true @@ -28804,7 +28924,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false, "children": [ @@ -28820,7 +28940,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 67 + "lineNumber": 66 }, "deprecated": false, "returnComment": [], @@ -28838,7 +28958,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -28854,7 +28974,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "isRequired": true @@ -28876,7 +28996,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "children": [ @@ -28894,7 +29014,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "isRequired": true @@ -28916,7 +29036,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "children": [ @@ -28934,7 +29054,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "isRequired": true @@ -28964,7 +29084,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "children": [ @@ -28980,7 +29100,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -28997,7 +29117,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -29021,7 +29141,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false, "children": [ @@ -29039,7 +29159,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 157 + "lineNumber": 156 }, "deprecated": false, "isRequired": true @@ -29061,7 +29181,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "children": [ @@ -29079,7 +29199,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "isRequired": false @@ -29103,7 +29223,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 184 + "lineNumber": 183 }, "deprecated": false, "children": [], @@ -29131,7 +29251,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 194 + "lineNumber": 193 }, "deprecated": false, "children": [], @@ -29151,7 +29271,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false, "children": [], @@ -29171,7 +29291,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -29187,7 +29307,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": false @@ -29204,7 +29324,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -29234,7 +29354,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "children": [ @@ -29256,7 +29376,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "isRequired": true @@ -29304,7 +29424,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 243 + "lineNumber": 242 }, "deprecated": false, "children": [ @@ -29334,7 +29454,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 244 + "lineNumber": 243 }, "deprecated": false, "isRequired": true @@ -29358,7 +29478,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 245 + "lineNumber": 244 }, "deprecated": false, "isRequired": false @@ -29390,7 +29510,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "children": [ @@ -29412,7 +29532,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "isRequired": true @@ -29458,7 +29578,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "children": [ @@ -29483,7 +29603,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": true @@ -29509,7 +29629,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": false @@ -29550,7 +29670,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "children": [ @@ -29575,7 +29695,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "isRequired": true @@ -29607,7 +29727,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "children": [ @@ -29623,7 +29743,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "isRequired": true @@ -29661,7 +29781,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "children": [ @@ -29683,7 +29803,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -29700,7 +29820,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -29740,7 +29860,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "children": [ @@ -29762,7 +29882,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -29781,7 +29901,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -29800,7 +29920,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -29838,7 +29958,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "children": [ @@ -29860,7 +29980,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -29879,7 +29999,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -29909,7 +30029,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 570 + "lineNumber": 573 }, "deprecated": false, "children": [ @@ -29931,7 +30051,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 571 + "lineNumber": 574 }, "deprecated": false, "isRequired": true @@ -29948,7 +30068,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 572 + "lineNumber": 575 }, "deprecated": false, "isRequired": true @@ -29965,7 +30085,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 573 + "lineNumber": 576 }, "deprecated": false, "isRequired": true @@ -29987,7 +30107,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "children": [ @@ -30005,7 +30125,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "isRequired": true @@ -30025,7 +30145,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false, "children": [ @@ -30041,7 +30161,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 67 + "lineNumber": 66 }, "deprecated": false, "returnComment": [], @@ -30059,7 +30179,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -30075,7 +30195,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "isRequired": true @@ -30097,7 +30217,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "children": [ @@ -30115,7 +30235,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "isRequired": true @@ -30137,7 +30257,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "children": [ @@ -30155,7 +30275,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "isRequired": true @@ -30185,7 +30305,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "children": [ @@ -30201,7 +30321,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -30218,7 +30338,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -30242,7 +30362,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false, "children": [ @@ -30260,7 +30380,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 157 + "lineNumber": 156 }, "deprecated": false, "isRequired": true @@ -30282,7 +30402,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "children": [ @@ -30300,7 +30420,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "isRequired": false @@ -30324,7 +30444,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 184 + "lineNumber": 183 }, "deprecated": false, "children": [], @@ -30352,7 +30472,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 194 + "lineNumber": 193 }, "deprecated": false, "children": [], @@ -30372,7 +30492,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false, "children": [], @@ -30392,7 +30512,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -30408,7 +30528,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": false @@ -30425,7 +30545,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -30455,7 +30575,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "children": [ @@ -30477,7 +30597,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "isRequired": true @@ -30525,7 +30645,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 243 + "lineNumber": 242 }, "deprecated": false, "children": [ @@ -30555,7 +30675,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 244 + "lineNumber": 243 }, "deprecated": false, "isRequired": true @@ -30579,7 +30699,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 245 + "lineNumber": 244 }, "deprecated": false, "isRequired": false @@ -30611,7 +30731,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "children": [ @@ -30633,7 +30753,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "isRequired": true @@ -30679,7 +30799,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "children": [ @@ -30704,7 +30824,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": true @@ -30730,7 +30850,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": false @@ -30771,7 +30891,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "children": [ @@ -30796,7 +30916,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "isRequired": true @@ -30828,7 +30948,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "children": [ @@ -30844,7 +30964,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "isRequired": true @@ -30882,7 +31002,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "children": [ @@ -30904,7 +31024,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -30921,7 +31041,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -30961,7 +31081,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "children": [ @@ -30983,7 +31103,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -31002,7 +31122,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -31021,7 +31141,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -31059,7 +31179,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "children": [ @@ -31081,7 +31201,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -31100,7 +31220,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -31130,7 +31250,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 570 + "lineNumber": 573 }, "deprecated": false, "children": [ @@ -31152,7 +31272,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 571 + "lineNumber": 574 }, "deprecated": false, "isRequired": true @@ -31169,7 +31289,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 572 + "lineNumber": 575 }, "deprecated": false, "isRequired": true @@ -31186,7 +31306,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 573 + "lineNumber": 576 }, "deprecated": false, "isRequired": true @@ -31208,7 +31328,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "children": [ @@ -31226,7 +31346,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "isRequired": true @@ -33739,7 +33859,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 154 + "lineNumber": 153 }, "deprecated": false, "children": [ @@ -33755,7 +33875,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 155 + "lineNumber": 154 }, "deprecated": false }, @@ -33771,7 +33891,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false } @@ -33800,20 +33920,6 @@ "lineNumber": 104 } }, - { - "plugin": "discover", - "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 23 - } - }, - { - "plugin": "discover", - "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 59 - } - }, { "plugin": "maps", "link": { @@ -34084,21 +34190,21 @@ "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 13 + "lineNumber": 12 } }, { "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 164 + "lineNumber": 175 } }, { "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 281 + "lineNumber": 292 } }, { @@ -34178,90 +34284,6 @@ "lineNumber": 66 } }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 43 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts", - "lineNumber": 12 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts", - "lineNumber": 11 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx", - "lineNumber": 11 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx", - "lineNumber": 23 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 45 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 148 - } - }, { "plugin": "ml", "link": { @@ -35060,6 +35082,20 @@ "lineNumber": 9 } }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 25 + } + }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 53 + } + }, { "plugin": "maps", "link": { @@ -35134,7 +35170,7 @@ "plugin": "lens", "link": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/types.ts", - "lineNumber": 57 + "lineNumber": 60 } }, { @@ -35960,7 +35996,14 @@ "plugin": "stackAlerts", "link": { "path": "x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx", - "lineNumber": 45 + "lineNumber": 26 + } + }, + { + "plugin": "stackAlerts", + "link": { + "path": "x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx", + "lineNumber": 26 } }, { @@ -36015,14 +36058,14 @@ { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts", "lineNumber": 10 } }, { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts", "lineNumber": 12 } } @@ -36371,7 +36414,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 54 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -36384,7 +36427,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 55 + "lineNumber": 54 }, "deprecated": false }, @@ -36397,7 +36440,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 56 + "lineNumber": 55 }, "deprecated": false }, @@ -36410,7 +36453,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false }, @@ -36423,7 +36466,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 58 + "lineNumber": 57 }, "deprecated": false }, @@ -36439,7 +36482,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false }, @@ -36455,7 +36498,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false }, @@ -36471,7 +36514,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 61 + "lineNumber": 60 }, "deprecated": false }, @@ -36487,7 +36530,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 62 + "lineNumber": 61 }, "deprecated": false }, @@ -36503,7 +36546,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 63 + "lineNumber": 62 }, "deprecated": false }, @@ -36519,7 +36562,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 64 + "lineNumber": 63 }, "deprecated": false }, @@ -36537,7 +36580,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false } @@ -36553,7 +36596,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 90 + "lineNumber": 95 }, "deprecated": false, "children": [ @@ -36571,7 +36614,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 94 + "lineNumber": 99 }, "deprecated": false }, @@ -36589,7 +36632,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 99 + "lineNumber": 104 }, "deprecated": false }, @@ -36607,7 +36650,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 105 + "lineNumber": 110 }, "deprecated": false }, @@ -36625,7 +36668,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 110 + "lineNumber": 115 }, "deprecated": false }, @@ -36643,7 +36686,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 115 + "lineNumber": 120 }, "deprecated": false }, @@ -36661,7 +36704,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 121 + "lineNumber": 126 }, "deprecated": false }, @@ -36686,7 +36729,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 126 + "lineNumber": 131 }, "deprecated": false }, @@ -36711,7 +36754,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 131 + "lineNumber": 136 }, "deprecated": false } @@ -37723,6 +37766,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-server.INDEX_PATTERN_SAVED_OBJECT_TYPE", + "type": "string", + "tags": [], + "label": "INDEX_PATTERN_SAVED_OBJECT_TYPE", + "description": [], + "signature": [ + "\"index-pattern\"" + ], + "source": { + "path": "src/plugins/data/common/constants.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-server.IndexPatternLoadExpressionFunctionDefinition", @@ -38199,9 +38259,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -38237,7 +38297,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false }, @@ -38252,14 +38312,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false } @@ -38277,9 +38337,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ", field: ", { @@ -38332,9 +38392,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { @@ -38490,9 +38550,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -38528,7 +38588,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 61 + "lineNumber": 62 }, "deprecated": false }, @@ -38544,7 +38604,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 62 + "lineNumber": 63 }, "deprecated": false }, @@ -38559,14 +38619,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 63 + "lineNumber": 64 }, "deprecated": false } @@ -38592,9 +38652,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -38630,7 +38690,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 35 + "lineNumber": 36 }, "deprecated": false }, @@ -38646,7 +38706,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false }, @@ -38661,14 +38721,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false } @@ -38702,9 +38762,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ", formattedValue?: string | undefined) => ", { @@ -38740,7 +38800,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 94 + "lineNumber": 92 }, "deprecated": false }, @@ -38762,7 +38822,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 95 + "lineNumber": 93 }, "deprecated": false }, @@ -38777,14 +38837,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 96 + "lineNumber": 94 }, "deprecated": false }, @@ -38800,7 +38860,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 97 + "lineNumber": 95 }, "deprecated": false } @@ -38859,7 +38919,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/index.ts", - "lineNumber": 38 + "lineNumber": 36 }, "deprecated": false } @@ -38983,18 +39043,12 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, config?: Record<string, any> | undefined, context?: Record<string, any> | undefined) => ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "src/plugins/data/server/index.ts", @@ -39036,9 +39090,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -39118,9 +39172,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { must: never[]; filter: ", { @@ -39181,9 +39235,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -39262,9 +39316,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, queries: ", { @@ -39350,9 +39404,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -39938,7 +39992,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 128 + "lineNumber": 133 }, "deprecated": false, "children": [ @@ -39962,7 +40016,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 129 + "lineNumber": 134 }, "deprecated": false, "returnComment": [], @@ -40011,7 +40065,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 130 + "lineNumber": 135 }, "deprecated": false, "returnComment": [], @@ -40052,7 +40106,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 244 + "lineNumber": 250 }, "deprecated": false, "children": [ @@ -40065,7 +40119,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 245 + "lineNumber": 251 }, "deprecated": false, "children": [ @@ -40088,7 +40142,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 246 + "lineNumber": 252 }, "deprecated": false }, @@ -40104,7 +40158,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 247 + "lineNumber": 253 }, "deprecated": false, "returnComment": [], @@ -40144,7 +40198,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 248 + "lineNumber": 254 }, "deprecated": false }, @@ -40167,7 +40221,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 249 + "lineNumber": 255 }, "deprecated": false }, @@ -40190,7 +40244,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 250 + "lineNumber": 256 }, "deprecated": false }, @@ -40213,7 +40267,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 251 + "lineNumber": 257 }, "deprecated": false }, @@ -40237,7 +40291,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 252 + "lineNumber": 258 }, "deprecated": false, "returnComment": [], @@ -40286,7 +40340,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 253 + "lineNumber": 259 }, "deprecated": false, "returnComment": [], @@ -40335,7 +40389,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 254 + "lineNumber": 260 }, "deprecated": false, "returnComment": [], @@ -40370,7 +40424,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 255 + "lineNumber": 261 }, "deprecated": false, "returnComment": [], @@ -40402,7 +40456,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 256 + "lineNumber": 262 }, "deprecated": false, "returnComment": [], @@ -40447,7 +40501,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 257 + "lineNumber": 263 }, "deprecated": false }, @@ -40465,7 +40519,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 258 + "lineNumber": 264 }, "deprecated": false, "returnComment": [], @@ -40497,7 +40551,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 259 + "lineNumber": 265 }, "deprecated": false, "returnComment": [], @@ -40529,7 +40583,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 260 + "lineNumber": 266 }, "deprecated": false, "returnComment": [], @@ -40561,7 +40615,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 261 + "lineNumber": 267 }, "deprecated": false }, @@ -40577,7 +40631,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 262 + "lineNumber": 268 }, "deprecated": false }, @@ -40601,7 +40655,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 263 + "lineNumber": 269 }, "deprecated": false, "returnComment": [], @@ -40636,7 +40690,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 264 + "lineNumber": 270 }, "deprecated": false, "returnComment": [], @@ -40700,7 +40754,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 266 + "lineNumber": 272 }, "deprecated": false, "returnComment": [], @@ -40785,7 +40839,7 @@ ], "source": { "path": "src/plugins/data/server/index.ts", - "lineNumber": 267 + "lineNumber": 273 }, "deprecated": false, "returnComment": [], @@ -40843,7 +40897,7 @@ ], "source": { "path": "src/plugins/data/common/constants.ts", - "lineNumber": 12 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false @@ -41446,9 +41500,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, queries: ", { @@ -41533,9 +41587,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -41663,9 +41717,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -41678,7 +41732,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false, "children": [ @@ -41700,7 +41754,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false, "isRequired": true @@ -41716,14 +41770,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false, "isRequired": true @@ -41744,9 +41798,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ", field: ", { @@ -41798,9 +41852,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { @@ -41972,9 +42026,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -41987,7 +42041,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false, "children": [ @@ -42009,7 +42063,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 61 + "lineNumber": 62 }, "deprecated": false, "isRequired": true @@ -42026,7 +42080,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 62 + "lineNumber": 63 }, "deprecated": false, "isRequired": true @@ -42042,14 +42096,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 63 + "lineNumber": 64 }, "deprecated": false, "isRequired": true @@ -42078,9 +42132,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ") => ", { @@ -42093,7 +42147,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false, "children": [ @@ -42115,7 +42169,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 35 + "lineNumber": 36 }, "deprecated": false, "isRequired": true @@ -42132,7 +42186,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false, "isRequired": true @@ -42148,14 +42202,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false, "isRequired": true @@ -42262,9 +42316,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, ignoreFilterIfFieldNotInIndex?: boolean) => { must: never[]; filter: ", { @@ -42325,9 +42379,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -42387,9 +42441,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, ", formattedValue?: string | undefined) => ", { @@ -42402,7 +42456,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 93 + "lineNumber": 91 }, "deprecated": false, "children": [ @@ -42424,7 +42478,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 94 + "lineNumber": 92 }, "deprecated": false, "isRequired": true @@ -42447,7 +42501,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 95 + "lineNumber": 93 }, "deprecated": false, "isRequired": true @@ -42463,14 +42517,14 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" } ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 96 + "lineNumber": 94 }, "deprecated": false, "isRequired": true @@ -42487,7 +42541,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 97 + "lineNumber": 95 }, "deprecated": false, "isRequired": false @@ -42573,7 +42627,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/index.ts", - "lineNumber": 36 + "lineNumber": 34 }, "deprecated": false, "children": [ @@ -42597,7 +42651,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/index.ts", - "lineNumber": 36 + "lineNumber": 34 }, "deprecated": false, "isRequired": true @@ -42917,90 +42971,13 @@ ], "source": { "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", - "lineNumber": 44 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.fromKueryExpression.$1", - "type": "Any", - "tags": [], - "label": "expression", - "description": [], - "signature": [ - "any" - ], - "source": { - "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", - "lineNumber": 45 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "data", - "id": "def-common.fromKueryExpression.$2", - "type": "Object", - "tags": [], - "label": "parseOptions", - "description": [], - "signature": [ - "Partial<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KueryParseOptions", - "text": "KueryParseOptions" - }, - ">" - ], - "source": { - "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", - "lineNumber": 46 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "data", - "id": "def-common.fromLiteralExpression", - "type": "Function", - "tags": [], - "label": "fromLiteralExpression", - "description": [], - "signature": [ - "(expression: any, parseOptions?: Partial<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KueryParseOptions", - "text": "KueryParseOptions" - }, - ">) => ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KueryNode", - "text": "KueryNode" - } - ], - "source": { - "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", - "lineNumber": 30 + "lineNumber": 44 }, "deprecated": false, "children": [ { "parentPluginId": "data", - "id": "def-common.fromLiteralExpression.$1", + "id": "def-common.fromKueryExpression.$1", "type": "Any", "tags": [], "label": "expression", @@ -43010,14 +42987,14 @@ ], "source": { "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", - "lineNumber": 31 + "lineNumber": 45 }, "deprecated": false, "isRequired": true }, { "parentPluginId": "data", - "id": "def-common.fromLiteralExpression.$2", + "id": "def-common.fromKueryExpression.$2", "type": "Object", "tags": [], "label": "parseOptions", @@ -43035,7 +43012,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", - "lineNumber": 32 + "lineNumber": 46 }, "deprecated": false, "isRequired": true @@ -43046,54 +43023,47 @@ }, { "parentPluginId": "data", - "id": "def-common.getDisplayValueFromFilter", + "id": "def-common.fromLiteralExpression", "type": "Function", "tags": [], - "label": "getDisplayValueFromFilter", + "label": "fromLiteralExpression", "description": [], "signature": [ - "(filter: ", + "(expression: any, parseOptions?: Partial<", { "pluginId": "data", "scope": "common", "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.KueryParseOptions", + "text": "KueryParseOptions" }, - ", indexPatterns: ", + ">) => ", { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - "[]) => string" + "docId": "kibDataPluginApi", + "section": "def-common.KueryNode", + "text": "KueryNode" + } ], "source": { - "path": "src/plugins/data/common/es_query/filters/get_display_value.ts", - "lineNumber": 31 + "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", + "lineNumber": 30 }, "deprecated": false, "children": [ { "parentPluginId": "data", - "id": "def-common.getDisplayValueFromFilter.$1", - "type": "Object", + "id": "def-common.fromLiteralExpression.$1", + "type": "Any", "tags": [], - "label": "filter", + "label": "expression", "description": [], "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - } + "any" ], "source": { - "path": "src/plugins/data/common/es_query/filters/get_display_value.ts", + "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", "lineNumber": 31 }, "deprecated": false, @@ -43101,24 +43071,25 @@ }, { "parentPluginId": "data", - "id": "def-common.getDisplayValueFromFilter.$2", - "type": "Array", + "id": "def-common.fromLiteralExpression.$2", + "type": "Object", "tags": [], - "label": "indexPatterns", + "label": "parseOptions", "description": [], "signature": [ + "Partial<", { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.KueryParseOptions", + "text": "KueryParseOptions" }, - "[]" + ">" ], "source": { - "path": "src/plugins/data/common/es_query/filters/get_display_value.ts", - "lineNumber": 31 + "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", + "lineNumber": 32 }, "deprecated": false, "isRequired": true @@ -43191,7 +43162,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false, "children": [ @@ -43213,7 +43184,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false, "isRequired": true @@ -43449,97 +43420,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "data", - "id": "def-common.getIndexPatternFromFilter", - "type": "Function", - "tags": [], - "label": "getIndexPatternFromFilter", - "description": [], - "signature": [ - "(filter: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - ", indexPatterns: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - "[]) => ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - " | undefined" - ], - "source": { - "path": "src/plugins/data/common/es_query/filters/get_index_pattern_from_filter.ts", - "lineNumber": 12 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "data", - "id": "def-common.getIndexPatternFromFilter.$1", - "type": "Object", - "tags": [], - "label": "filter", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - } - ], - "source": { - "path": "src/plugins/data/common/es_query/filters/get_index_pattern_from_filter.ts", - "lineNumber": 13 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "data", - "id": "def-common.getIndexPatternFromFilter.$2", - "type": "Array", - "tags": [], - "label": "indexPatterns", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - "[]" - ], - "source": { - "path": "src/plugins/data/common/es_query/filters/get_index_pattern_from_filter.ts", - "lineNumber": 14 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "data", "id": "def-common.getKbnFieldType", @@ -43682,7 +43562,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false, "children": [ @@ -43704,7 +43584,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false, "isRequired": true @@ -43733,7 +43613,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false, "children": [ @@ -43755,7 +43635,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false, "isRequired": true @@ -43784,7 +43664,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 84 + "lineNumber": 85 }, "deprecated": false, "children": [ @@ -43806,7 +43686,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 84 + "lineNumber": 85 }, "deprecated": false, "isRequired": true @@ -43823,7 +43703,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 84 + "lineNumber": 85 }, "deprecated": false, "isRequired": true @@ -43852,7 +43732,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false, "children": [ @@ -43874,7 +43754,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false, "isRequired": true @@ -43903,7 +43783,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 81 + "lineNumber": 82 }, "deprecated": false, "children": [ @@ -43925,7 +43805,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 81 + "lineNumber": 82 }, "deprecated": false, "isRequired": true @@ -43962,7 +43842,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 140 + "lineNumber": 138 }, "deprecated": false, "children": [ @@ -43984,7 +43864,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 140 + "lineNumber": 138 }, "deprecated": false, "isRequired": true @@ -44007,7 +43887,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 140 + "lineNumber": 138 }, "deprecated": false, "isRequired": true @@ -44035,7 +43915,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false, "children": [ @@ -44051,7 +43931,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false, "isRequired": true @@ -44124,7 +44004,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/index.ts", - "lineNumber": 38 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -44146,7 +44026,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/index.ts", - "lineNumber": 38 + "lineNumber": 36 }, "deprecated": false, "isRequired": true @@ -44446,7 +44326,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false, "children": [ @@ -44462,7 +44342,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false, "isRequired": true @@ -44490,7 +44370,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false, "children": [ @@ -44506,7 +44386,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false, "isRequired": true @@ -44578,7 +44458,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 73 + "lineNumber": 74 }, "deprecated": false, "children": [ @@ -44594,7 +44474,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 73 + "lineNumber": 74 }, "deprecated": false, "isRequired": true @@ -44622,7 +44502,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 46 + "lineNumber": 47 }, "deprecated": false, "children": [ @@ -44638,7 +44518,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 46 + "lineNumber": 47 }, "deprecated": false, "isRequired": true @@ -44666,7 +44546,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 75 + "lineNumber": 76 }, "deprecated": false, "children": [ @@ -44682,7 +44562,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 75 + "lineNumber": 76 }, "deprecated": false, "isRequired": true @@ -44857,18 +44737,12 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined, config?: Record<string, any> | undefined, context?: Record<string, any> | undefined) => ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - } + "JsonObject" ], "source": { "path": "src/plugins/data/common/es_query/kuery/ast/ast.ts", @@ -44910,9 +44784,9 @@ { "pluginId": "data", "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" }, " | undefined" ], @@ -45289,7 +45163,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 56 + "lineNumber": 57 }, "deprecated": false, "children": [ @@ -45313,7 +45187,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 57 + "lineNumber": 58 }, "deprecated": false } @@ -45329,7 +45203,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 14 + "lineNumber": 15 }, "deprecated": false, "children": [ @@ -45345,7 +45219,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 15 + "lineNumber": 16 }, "deprecated": false } @@ -45435,6 +45309,61 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.IndexPatternBase", + "type": "Interface", + "tags": [], + "label": "IndexPatternBase", + "description": [], + "source": { + "path": "src/plugins/data/common/es_query/es_query/types.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.IndexPatternBase.fields", + "type": "Array", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IFieldType", + "text": "IFieldType" + }, + "[]" + ], + "source": { + "path": "src/plugins/data/common/es_query/es_query/types.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "data", + "id": "def-common.IndexPatternBase.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/data/common/es_query/es_query/types.ts", + "lineNumber": 13 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.KbnFieldTypeOptions", @@ -45764,7 +45693,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 35 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -45780,7 +45709,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false }, @@ -45796,7 +45725,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false }, @@ -45812,7 +45741,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 38 + "lineNumber": 39 }, "deprecated": false }, @@ -45828,7 +45757,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 39 + "lineNumber": 40 }, "deprecated": false }, @@ -45844,7 +45773,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false }, @@ -45860,7 +45789,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false }, @@ -45876,7 +45805,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 42 + "lineNumber": 43 }, "deprecated": false } @@ -46064,14 +45993,14 @@ "tags": [], "label": "namespaces", "description": [ - "Namespace(s) that this saved object exists in. This attribute is only used for multi-namespace saved object types." + "\nSpace(s) that this saved object exists in. This attribute is not used for \"global\" saved object types which are registered with\n`namespaceType: 'agnostic'`." ], "signature": [ "string[] | undefined" ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 88 + "lineNumber": 91 }, "deprecated": false }, @@ -46089,7 +46018,7 @@ ], "source": { "path": "src/core/types/saved_objects.ts", - "lineNumber": 95 + "lineNumber": 98 }, "deprecated": false } @@ -46266,7 +46195,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false, "initialIsOpen": false @@ -46283,7 +46212,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/exists_filter.ts", - "lineNumber": 12 + "lineNumber": 13 }, "deprecated": false, "initialIsOpen": false @@ -46597,6 +46526,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.INDEX_PATTERN_SAVED_OBJECT_TYPE", + "type": "string", + "tags": [], + "label": "INDEX_PATTERN_SAVED_OBJECT_TYPE", + "description": [], + "signature": [ + "\"index-pattern\"" + ], + "source": { + "path": "src/plugins/data/common/constants.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.KIBANA_USER_QUERY_LANGUAGE_KEY", @@ -46722,7 +46668,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false, "initialIsOpen": false @@ -46746,7 +46692,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrase_filter.ts", - "lineNumber": 13 + "lineNumber": 14 }, "deprecated": false, "initialIsOpen": false @@ -46778,7 +46724,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 19 + "lineNumber": 20 }, "deprecated": false, "initialIsOpen": false @@ -46802,7 +46748,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/phrases_filter.ts", - "lineNumber": 14 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false @@ -46893,7 +46839,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false, "initialIsOpen": false @@ -46925,7 +46871,7 @@ ], "source": { "path": "src/plugins/data/common/es_query/filters/range_filter.ts", - "lineNumber": 50 + "lineNumber": 51 }, "deprecated": false, "initialIsOpen": false @@ -47231,7 +47177,7 @@ ], "source": { "path": "src/plugins/data/common/constants.ts", - "lineNumber": 12 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/data.mdx b/api_docs/data.mdx index bd48fb09df8b30..4306690ca9c7e4 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataObj from './data.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Client diff --git a/api_docs/data_autocomplete.mdx b/api_docs/data_autocomplete.mdx index 7d18feb2140dd4..bc9ae7b61a2c7a 100644 --- a/api_docs/data_autocomplete.mdx +++ b/api_docs/data_autocomplete.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.autocomplete'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataAutocompleteObj from './data_autocomplete.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Client diff --git a/api_docs/data_enhanced.json b/api_docs/data_enhanced.json index 923a7886739c97..8fb94c25b7bd01 100644 --- a/api_docs/data_enhanced.json +++ b/api_docs/data_enhanced.json @@ -129,7 +129,7 @@ "section": "def-server.PluginInitializerContext", "text": "PluginInitializerContext" }, - "<Readonly<{} & { search: Readonly<{} & { sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; pageSize: number; trackingInterval: moment.Duration; monitoringTaskTimeout: moment.Duration; notTouchedTimeout: moment.Duration; notTouchedInProgressTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; }>>" + "<Readonly<{} & { search: Readonly<{} & { sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; pageSize: number; trackingInterval: moment.Duration; cleanupInterval: moment.Duration; expireInterval: moment.Duration; monitoringTaskTimeout: moment.Duration; notTouchedTimeout: moment.Duration; notTouchedInProgressTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; }>>" ], "source": { "path": "x-pack/plugins/data_enhanced/server/plugin.ts", diff --git a/api_docs/data_enhanced.mdx b/api_docs/data_enhanced.mdx index 1e6709794d3c49..9c84797b810ce6 100644 --- a/api_docs/data_enhanced.mdx +++ b/api_docs/data_enhanced.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataEnhancedObj from './data_enhanced.json'; diff --git a/api_docs/data_field_formats.json b/api_docs/data_field_formats.json index a5fba87c20169b..1d459b9c5e2f1f 100644 --- a/api_docs/data_field_formats.json +++ b/api_docs/data_field_formats.json @@ -3660,7 +3660,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 62 + "lineNumber": 66 }, "deprecated": false, "children": [ @@ -3682,7 +3682,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 63 + "lineNumber": 67 }, "deprecated": false }, @@ -3695,7 +3695,7 @@ "description": [], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 64 + "lineNumber": 68 }, "deprecated": false }, @@ -3718,7 +3718,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 67 + "lineNumber": 71 }, "deprecated": false }, @@ -3734,7 +3734,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 83 + "lineNumber": 87 }, "deprecated": false }, @@ -3750,7 +3750,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 85 + "lineNumber": 89 }, "deprecated": false, "children": [], @@ -3768,7 +3768,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 105 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -3784,7 +3784,7 @@ ], "source": { "path": "src/plugins/data/common/field_formats/converters/string.ts", - "lineNumber": 105 + "lineNumber": 109 }, "deprecated": false, "isRequired": true diff --git a/api_docs/data_field_formats.mdx b/api_docs/data_field_formats.mdx index c13562eba142df..765ba1c26ed3bc 100644 --- a/api_docs/data_field_formats.mdx +++ b/api_docs/data_field_formats.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.fieldFormats'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataFieldFormatsObj from './data_field_formats.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Client diff --git a/api_docs/data_index_patterns.json b/api_docs/data_index_patterns.json index 056442ee29d668..a05cd4cf3565fc 100644 --- a/api_docs/data_index_patterns.json +++ b/api_docs/data_index_patterns.json @@ -1783,22 +1783,7 @@ "lineNumber": 272 }, "deprecated": true, - "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx", - "lineNumber": 117 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 778 - } - } - ], + "references": [], "children": [ { "parentPluginId": "data", @@ -1848,34 +1833,6 @@ }, "deprecated": true, "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/source_filters_table/components/table/table.tsx", - "lineNumber": 152 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 66 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 74 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx", - "lineNumber": 204 - } - }, { "plugin": "visTypeTimeseries", "link": { @@ -1942,15 +1899,7 @@ "lineNumber": 291 }, "deprecated": true, - "references": [ - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_fields_table.tsx", - "lineNumber": 61 - } - } - ], + "references": [], "children": [], "returnComment": [] }, @@ -2218,7 +2167,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 }, "deprecated": false, "children": [ @@ -2236,7 +2185,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 }, "deprecated": false, "isRequired": true @@ -2261,7 +2210,145 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 368 + "lineNumber": 367 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-common.IndexPattern.hasRuntimeField", + "type": "Function", + "tags": [], + "label": "hasRuntimeField", + "description": [ + "\nChecks if runtime field exists" + ], + "signature": [ + "(name: string) => boolean" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 389 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.IndexPattern.hasRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 389 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-common.IndexPattern.getRuntimeField", + "type": "Function", + "tags": [], + "label": "getRuntimeField", + "description": [ + "\nReturns runtime field if exists" + ], + "signature": [ + "(name: string) => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + " | null" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 397 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.IndexPattern.getRuntimeField.$1", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 397 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "data", + "id": "def-common.IndexPattern.replaceAllRuntimeFields", + "type": "Function", + "tags": [], + "label": "replaceAllRuntimeFields", + "description": [ + "\nReplaces all existing runtime fields with new fields" + ], + "signature": [ + "(newFields: Record<string, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ">) => void" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 405 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.IndexPattern.replaceAllRuntimeFields.$1", + "type": "Object", + "tags": [], + "label": "newFields", + "description": [], + "signature": [ + "Record<string, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.RuntimeField", + "text": "RuntimeField" + }, + ">" + ], + "source": { + "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", + "lineNumber": 405 }, "deprecated": false, "isRequired": true @@ -2276,14 +2363,14 @@ "tags": [], "label": "removeRuntimeField", "description": [ - "\nRemove a runtime field - removed from mapped field or removed unmapped\nfield as appropriate" + "\nRemove a runtime field - removed from mapped field or removed unmapped\nfield as appropriate. Doesn't clear associated field attributes." ], "signature": [ "(name: string) => void" ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 392 + "lineNumber": 421 }, "deprecated": false, "children": [ @@ -2294,14 +2381,14 @@ "tags": [], "label": "name", "description": [ - "Field name" + "- Field name to remove" ], "signature": [ "string" ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 392 + "lineNumber": 421 }, "deprecated": false, "isRequired": true @@ -2331,7 +2418,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 412 + "lineNumber": 438 }, "deprecated": false, "children": [ @@ -2347,7 +2434,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 412 + "lineNumber": 438 }, "deprecated": false, "isRequired": true @@ -2375,7 +2462,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 419 + "lineNumber": 445 }, "deprecated": false, "children": [ @@ -2391,7 +2478,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 420 + "lineNumber": 446 }, "deprecated": false, "isRequired": true @@ -2408,7 +2495,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 421 + "lineNumber": 447 }, "deprecated": false, "isRequired": true @@ -2432,7 +2519,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 422 + "lineNumber": 448 }, "deprecated": false, "isRequired": true @@ -2452,7 +2539,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "children": [ @@ -2468,7 +2555,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "isRequired": true @@ -2485,7 +2572,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 430 + "lineNumber": 456 }, "deprecated": false, "isRequired": false @@ -2505,7 +2592,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "children": [ @@ -2521,7 +2608,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "isRequired": true @@ -2538,7 +2625,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 441 + "lineNumber": 467 }, "deprecated": false, "isRequired": false @@ -2566,7 +2653,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "children": [ @@ -2582,7 +2669,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -2606,7 +2693,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 454 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -2626,7 +2713,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 458 + "lineNumber": 484 }, "deprecated": false, "children": [ @@ -2642,7 +2729,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts", - "lineNumber": 458 + "lineNumber": 484 }, "deprecated": false, "isRequired": true @@ -3319,7 +3406,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false, "children": [ @@ -3335,7 +3422,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 67 + "lineNumber": 66 }, "deprecated": false, "returnComment": [], @@ -3353,7 +3440,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -3369,7 +3456,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "isRequired": true @@ -3391,7 +3478,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "children": [ @@ -3409,7 +3496,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false, "isRequired": true @@ -3431,7 +3518,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "children": [ @@ -3449,7 +3536,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false, "isRequired": true @@ -3479,7 +3566,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "children": [ @@ -3495,7 +3582,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -3512,7 +3599,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 138 + "lineNumber": 137 }, "deprecated": false, "isRequired": true @@ -3536,7 +3623,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false, "children": [ @@ -3554,7 +3641,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 157 + "lineNumber": 156 }, "deprecated": false, "isRequired": true @@ -3576,7 +3663,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "children": [ @@ -3594,7 +3681,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false, "isRequired": false @@ -3618,7 +3705,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 184 + "lineNumber": 183 }, "deprecated": false, "children": [], @@ -3646,7 +3733,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 194 + "lineNumber": 193 }, "deprecated": false, "children": [], @@ -3666,7 +3753,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false, "children": [], @@ -3686,7 +3773,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -3702,7 +3789,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": false @@ -3719,7 +3806,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -3749,7 +3836,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "children": [ @@ -3771,7 +3858,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 227 + "lineNumber": 226 }, "deprecated": false, "isRequired": true @@ -3819,7 +3906,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 243 + "lineNumber": 242 }, "deprecated": false, "children": [ @@ -3849,7 +3936,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 244 + "lineNumber": 243 }, "deprecated": false, "isRequired": true @@ -3873,7 +3960,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 245 + "lineNumber": 244 }, "deprecated": false, "isRequired": false @@ -3905,7 +3992,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "children": [ @@ -3927,7 +4014,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 258 + "lineNumber": 257 }, "deprecated": false, "isRequired": true @@ -3973,7 +4060,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "children": [ @@ -3998,7 +4085,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": true @@ -4024,7 +4111,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 335 + "lineNumber": 334 }, "deprecated": false, "isRequired": false @@ -4065,7 +4152,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "children": [ @@ -4090,7 +4177,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 351 + "lineNumber": 350 }, "deprecated": false, "isRequired": true @@ -4122,7 +4209,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "children": [ @@ -4138,7 +4225,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 480 + "lineNumber": 483 }, "deprecated": false, "isRequired": true @@ -4176,7 +4263,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "children": [ @@ -4198,7 +4285,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -4215,7 +4302,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 499 + "lineNumber": 502 }, "deprecated": false, "isRequired": true @@ -4255,7 +4342,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "children": [ @@ -4277,7 +4364,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -4296,7 +4383,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -4315,7 +4402,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 524 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -4353,7 +4440,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "children": [ @@ -4375,7 +4462,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -4394,7 +4481,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 537 + "lineNumber": 540 }, "deprecated": false, "isRequired": true @@ -4424,7 +4511,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 570 + "lineNumber": 573 }, "deprecated": false, "children": [ @@ -4446,7 +4533,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 571 + "lineNumber": 574 }, "deprecated": false, "isRequired": true @@ -4463,7 +4550,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 572 + "lineNumber": 575 }, "deprecated": false, "isRequired": true @@ -4480,7 +4567,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 573 + "lineNumber": 576 }, "deprecated": false, "isRequired": true @@ -4502,7 +4589,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "children": [ @@ -4520,7 +4607,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 656 + "lineNumber": 661 }, "deprecated": false, "isRequired": true @@ -4751,7 +4838,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 75 + "lineNumber": 74 }, "deprecated": false, "children": [ @@ -4767,7 +4854,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": false } @@ -4783,7 +4870,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 79 + "lineNumber": 78 }, "deprecated": false, "children": [ @@ -4799,7 +4886,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 80 + "lineNumber": 79 }, "deprecated": false }, @@ -4815,7 +4902,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 81 + "lineNumber": 80 }, "deprecated": false } @@ -4833,7 +4920,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 187 + "lineNumber": 186 }, "deprecated": false, "children": [ @@ -4851,7 +4938,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 191 + "lineNumber": 190 }, "deprecated": false }, @@ -4869,7 +4956,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 195 + "lineNumber": 194 }, "deprecated": false }, @@ -4887,7 +4974,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 200 + "lineNumber": 199 }, "deprecated": false }, @@ -4903,7 +4990,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 201 + "lineNumber": 200 }, "deprecated": false }, @@ -4926,7 +5013,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 202 + "lineNumber": 201 }, "deprecated": false }, @@ -4939,7 +5026,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 203 + "lineNumber": 202 }, "deprecated": false }, @@ -4952,7 +5039,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 204 + "lineNumber": 203 }, "deprecated": false }, @@ -4968,7 +5055,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 205 + "lineNumber": 204 }, "deprecated": false }, @@ -4984,7 +5071,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false }, @@ -4997,7 +5084,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 207 + "lineNumber": 206 }, "deprecated": false }, @@ -5010,7 +5097,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 208 + "lineNumber": 207 }, "deprecated": false }, @@ -5026,7 +5113,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 209 + "lineNumber": 208 }, "deprecated": false }, @@ -5049,7 +5136,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false }, @@ -5065,7 +5152,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 211 + "lineNumber": 210 }, "deprecated": false }, @@ -5081,7 +5168,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 212 + "lineNumber": 211 }, "deprecated": false }, @@ -5104,7 +5191,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 213 + "lineNumber": 212 }, "deprecated": false }, @@ -5120,7 +5207,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 215 + "lineNumber": 214 }, "deprecated": false }, @@ -5136,7 +5223,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false } @@ -5152,7 +5239,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 167 + "lineNumber": 166 }, "deprecated": false, "children": [ @@ -5168,7 +5255,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 168 + "lineNumber": 167 }, "deprecated": false }, @@ -5184,7 +5271,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 169 + "lineNumber": 168 }, "deprecated": false }, @@ -5200,7 +5287,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 170 + "lineNumber": 169 }, "deprecated": false }, @@ -5216,7 +5303,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 171 + "lineNumber": 170 }, "deprecated": false }, @@ -5229,7 +5316,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 172 + "lineNumber": 171 }, "deprecated": false }, @@ -5251,7 +5338,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 173 + "lineNumber": 172 }, "deprecated": false }, @@ -5267,7 +5354,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 174 + "lineNumber": 173 }, "deprecated": false }, @@ -5280,7 +5367,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 175 + "lineNumber": 174 }, "deprecated": false }, @@ -5293,7 +5380,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 176 + "lineNumber": 175 }, "deprecated": false }, @@ -5306,7 +5393,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 177 + "lineNumber": 176 }, "deprecated": false }, @@ -5322,7 +5409,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 178 + "lineNumber": 177 }, "deprecated": false }, @@ -5345,7 +5432,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 179 + "lineNumber": 178 }, "deprecated": false }, @@ -5368,7 +5455,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 180 + "lineNumber": 179 }, "deprecated": false }, @@ -5384,7 +5471,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 181 + "lineNumber": 180 }, "deprecated": false } @@ -5400,7 +5487,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "children": [ @@ -5413,7 +5500,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 120 + "lineNumber": 119 }, "deprecated": false }, @@ -5429,7 +5516,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 121 + "lineNumber": 120 }, "deprecated": false }, @@ -5445,7 +5532,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 122 + "lineNumber": 121 }, "deprecated": false }, @@ -5461,7 +5548,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 123 + "lineNumber": 122 }, "deprecated": false }, @@ -5477,7 +5564,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 124 + "lineNumber": 123 }, "deprecated": false }, @@ -5493,7 +5580,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 125 + "lineNumber": 124 }, "deprecated": false } @@ -5509,7 +5596,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 128 + "lineNumber": 127 }, "deprecated": false, "children": [ @@ -5522,7 +5609,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 129 + "lineNumber": 128 }, "deprecated": false }, @@ -5538,7 +5625,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 130 + "lineNumber": 129 }, "deprecated": false }, @@ -5551,7 +5638,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 131 + "lineNumber": 130 }, "deprecated": false }, @@ -5564,7 +5651,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 132 + "lineNumber": 131 }, "deprecated": false } @@ -5580,7 +5667,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 154 + "lineNumber": 153 }, "deprecated": false, "children": [ @@ -5596,7 +5683,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 155 + "lineNumber": 154 }, "deprecated": false }, @@ -5612,7 +5699,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 156 + "lineNumber": 155 }, "deprecated": false } @@ -5641,20 +5728,6 @@ "lineNumber": 104 } }, - { - "plugin": "discover", - "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 23 - } - }, - { - "plugin": "discover", - "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 59 - } - }, { "plugin": "maps", "link": { @@ -5925,21 +5998,21 @@ "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 13 + "lineNumber": 12 } }, { "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 164 + "lineNumber": 175 } }, { "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 281 + "lineNumber": 292 } }, { @@ -6019,90 +6092,6 @@ "lineNumber": 66 } }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 43 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts", - "lineNumber": 12 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts", - "lineNumber": 11 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx", - "lineNumber": 11 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx", - "lineNumber": 23 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 45 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx", - "lineNumber": 148 - } - }, { "plugin": "ml", "link": { @@ -6901,6 +6890,20 @@ "lineNumber": 9 } }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 25 + } + }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 53 + } + }, { "plugin": "maps", "link": { @@ -6975,7 +6978,7 @@ "plugin": "lens", "link": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/types.ts", - "lineNumber": 57 + "lineNumber": 60 } }, { @@ -7801,7 +7804,14 @@ "plugin": "stackAlerts", "link": { "path": "x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx", - "lineNumber": 45 + "lineNumber": 26 + } + }, + { + "plugin": "stackAlerts", + "link": { + "path": "x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx", + "lineNumber": 26 } }, { @@ -7856,14 +7866,14 @@ { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts", "lineNumber": 10 } }, { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts", "lineNumber": 12 } } @@ -8210,9 +8220,26 @@ ], "label": "IIndexPattern", "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IIndexPattern", + "text": "IIndexPattern" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.IndexPatternBase", + "text": "IndexPatternBase" + } + ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": true, "references": [ @@ -8307,118 +8334,6 @@ "lineNumber": 72 } }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 10 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 29 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 29 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 46 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 9 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 32 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 32 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 43 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/service/list/manager.ts", - "lineNumber": 50 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx", - "lineNumber": 22 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx", - "lineNumber": 171 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx", - "lineNumber": 15 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx", - "lineNumber": 18 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx", - "lineNumber": 12 - } - }, - { - "plugin": "indexPatternManagement", - "link": { - "path": "src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx", - "lineNumber": 15 - } - }, { "plugin": "savedObjectsManagement", "link": { @@ -8703,7 +8618,7 @@ "plugin": "infra", "link": { "path": "x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx", - "lineNumber": 32 + "lineNumber": 31 } }, { @@ -8731,7 +8646,7 @@ "plugin": "infra", "link": { "path": "x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx", - "lineNumber": 23 + "lineNumber": 24 } }, { @@ -8777,94 +8692,143 @@ } }, { - "plugin": "securitySolution", + "plugin": "timelines", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", - "lineNumber": 22 + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 8 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 86 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", - "lineNumber": 72 + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 8 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 86 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 17 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 22 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 37 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/utils/keury/index.ts", + "lineNumber": 80 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/t_grid/helpers.tsx", "lineNumber": 20 } }, { - "plugin": "securitySolution", + "plugin": "timelines", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", - "lineNumber": 100 + "path": "x-pack/plugins/timelines/public/components/t_grid/helpers.tsx", + "lineNumber": 153 } }, { - "plugin": "securitySolution", + "plugin": "timelines", "link": { - "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", - "lineNumber": 8 + "path": "x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx", + "lineNumber": 31 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx", + "lineNumber": 121 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", - "lineNumber": 86 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", + "lineNumber": 23 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts", + "lineNumber": 81 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", - "lineNumber": 48 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", + "lineNumber": 20 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", - "lineNumber": 122 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts", + "lineNumber": 100 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", - "lineNumber": 13 + "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", - "lineNumber": 112 + "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", + "lineNumber": 48 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", - "lineNumber": 152 + "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx", + "lineNumber": 122 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/lib/keury/index.ts", - "lineNumber": 16 + "lineNumber": 17 } }, { @@ -8955,14 +8919,14 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx", - "lineNumber": 35 + "lineNumber": 36 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx", - "lineNumber": 122 + "lineNumber": 126 } }, { @@ -9010,148 +8974,169 @@ { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", - "lineNumber": 18 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", + "lineNumber": 55 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", - "lineNumber": 51 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", + "lineNumber": 77 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", - "lineNumber": 8 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", + "lineNumber": 82 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", - "lineNumber": 41 + "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", + "lineNumber": 13 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", + "lineNumber": 128 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", - "lineNumber": 34 + "path": "x-pack/plugins/security_solution/public/common/components/url_state/types.ts", + "lineNumber": 168 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", - "lineNumber": 48 + "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", + "lineNumber": 18 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", - "lineNumber": 64 + "path": "x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx", + "lineNumber": 51 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts", - "lineNumber": 69 + "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", + "lineNumber": 8 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", + "path": "x-pack/plugins/security_solution/public/network/pages/details/types.ts", + "lineNumber": 41 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", - "lineNumber": 28 + "path": "x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx", + "lineNumber": 34 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 15 + "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", + "lineNumber": 9 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 58 + "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", + "lineNumber": 65 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 132 + "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", + "lineNumber": 20 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", - "lineNumber": 164 + "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", + "lineNumber": 44 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", - "lineNumber": 9 + "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", + "lineNumber": 21 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/hosts/pages/details/types.ts", - "lineNumber": 65 + "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", + "lineNumber": 33 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", - "lineNumber": 20 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx", - "lineNumber": 44 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts", + "lineNumber": 28 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", - "lineNumber": 21 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 15 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx", - "lineNumber": 33 + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 58 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 132 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx", + "lineNumber": 164 } }, { @@ -9168,6 +9153,20 @@ "lineNumber": 28 } }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/mock/index_pattern.ts", + "lineNumber": 8 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/public/mock/index_pattern.ts", + "lineNumber": 10 + } + }, { "plugin": "lens", "link": { @@ -9210,6 +9209,20 @@ "lineNumber": 66 } }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts", + "lineNumber": 1 + } + }, + { + "plugin": "timelines", + "link": { + "path": "x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts", + "lineNumber": 66 + } + }, { "plugin": "infra", "link": { @@ -9255,22 +9268,43 @@ { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts", - "lineNumber": 1 + "path": "x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts", + "lineNumber": 1 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts", + "lineNumber": 10 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts", + "lineNumber": 23 + } + }, + { + "plugin": "securitySolution", + "link": { + "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", + "lineNumber": 3 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts", - "lineNumber": 10 + "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", + "lineNumber": 25 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts", - "lineNumber": 23 + "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", + "lineNumber": 55 } }, { @@ -9315,27 +9349,6 @@ "lineNumber": 5 } }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", - "lineNumber": 3 - } - }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", - "lineNumber": 25 - } - }, - { - "plugin": "securitySolution", - "link": { - "path": "x-pack/plugins/security_solution/target/types/public/common/components/url_state/types.d.ts", - "lineNumber": 55 - } - }, { "plugin": "securitySolution", "link": { @@ -9529,7 +9542,7 @@ "plugin": "infra", "link": { "path": "x-pack/plugins/infra/public/pages/metrics/index.tsx", - "lineNumber": 193 + "lineNumber": 162 } }, { @@ -9682,99 +9695,99 @@ { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", "lineNumber": 9 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", - "lineNumber": 35 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", - "lineNumber": 53 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts", - "lineNumber": 16 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 12 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts", - "lineNumber": 31 + "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", + "lineNumber": 13 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", - "lineNumber": 39 + "path": "x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts", + "lineNumber": 16 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", - "lineNumber": 49 + "path": "x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts", + "lineNumber": 31 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", - "lineNumber": 52 + "lineNumber": 39 } }, { "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", - "lineNumber": 485 + "lineNumber": 49 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 9 + "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", + "lineNumber": 52 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx", + "lineNumber": 504 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "lineNumber": 9 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 12 + "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "lineNumber": 35 } }, { "plugin": "securitySolution", "link": { - "path": "x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts", - "lineNumber": 13 + "path": "x-pack/plugins/security_solution/public/network/pages/navigation/types.ts", + "lineNumber": 52 } }, { @@ -9851,7 +9864,7 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts", - "lineNumber": 52 + "lineNumber": 53 } }, { @@ -10138,7 +10151,7 @@ "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 104 + "lineNumber": 94 } }, { @@ -10152,35 +10165,28 @@ "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 53 + "lineNumber": 56 } }, { "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 61 + "lineNumber": 64 } }, { "plugin": "observability", "link": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 69 - } - }, - { - "plugin": "observability", - "link": { - "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts", - "lineNumber": 19 + "lineNumber": 72 } }, { "plugin": "observability", "link": { - "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts", - "lineNumber": 25 + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", + "lineNumber": 89 } }, { @@ -10423,29 +10429,6 @@ } ], "children": [ - { - "parentPluginId": "data", - "id": "def-common.IIndexPattern.fields", - "type": "Array", - "tags": [], - "label": "fields", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IFieldType", - "text": "IFieldType" - }, - "[]" - ], - "source": { - "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 33 - }, - "deprecated": false - }, { "parentPluginId": "data", "id": "def-common.IIndexPattern.title", @@ -10459,22 +10442,6 @@ }, "deprecated": false }, - { - "parentPluginId": "data", - "id": "def-common.IIndexPattern.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 35 - }, - "deprecated": false - }, { "parentPluginId": "data", "id": "def-common.IIndexPattern.type", @@ -10489,7 +10456,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 39 + "lineNumber": 38 }, "deprecated": false }, @@ -10505,7 +10472,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 40 + "lineNumber": 39 }, "deprecated": false }, @@ -10529,7 +10496,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 41 + "lineNumber": 40 }, "deprecated": false, "children": [], @@ -10555,7 +10522,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 42 + "lineNumber": 41 }, "deprecated": false }, @@ -10605,7 +10572,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false } @@ -11110,7 +11077,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 135 + "lineNumber": 134 }, "deprecated": false, "children": [ @@ -11134,7 +11101,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "returnComment": [], @@ -11157,7 +11124,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false } @@ -11183,7 +11150,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 137 + "lineNumber": 136 }, "deprecated": false, "returnComment": [], @@ -11206,7 +11173,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 137 + "lineNumber": 136 }, "deprecated": false } @@ -11226,7 +11193,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 54 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -11239,7 +11206,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 55 + "lineNumber": 54 }, "deprecated": false }, @@ -11252,7 +11219,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 56 + "lineNumber": 55 }, "deprecated": false }, @@ -11265,7 +11232,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 57 + "lineNumber": 56 }, "deprecated": false }, @@ -11278,7 +11245,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 58 + "lineNumber": 57 }, "deprecated": false }, @@ -11294,7 +11261,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false }, @@ -11310,7 +11277,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false }, @@ -11326,7 +11293,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 61 + "lineNumber": 60 }, "deprecated": false }, @@ -11342,7 +11309,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 62 + "lineNumber": 61 }, "deprecated": false }, @@ -11358,7 +11325,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 63 + "lineNumber": 62 }, "deprecated": false }, @@ -11374,7 +11341,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 64 + "lineNumber": 63 }, "deprecated": false }, @@ -11392,7 +11359,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false } @@ -11464,7 +11431,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 225 + "lineNumber": 224 }, "deprecated": false, "children": [ @@ -11482,7 +11449,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false }, @@ -11500,7 +11467,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 233 + "lineNumber": 232 }, "deprecated": false }, @@ -11516,7 +11483,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 234 + "lineNumber": 233 }, "deprecated": false }, @@ -11534,7 +11501,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 239 + "lineNumber": 238 }, "deprecated": true, "references": [] @@ -11551,7 +11518,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false }, @@ -11574,7 +11541,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 241 + "lineNumber": 240 }, "deprecated": false }, @@ -11598,7 +11565,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 242 + "lineNumber": 241 }, "deprecated": false }, @@ -11621,7 +11588,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 243 + "lineNumber": 242 }, "deprecated": false }, @@ -11637,7 +11604,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 244 + "lineNumber": 243 }, "deprecated": false }, @@ -11661,7 +11628,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 245 + "lineNumber": 244 }, "deprecated": false }, @@ -11685,7 +11652,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 246 + "lineNumber": 245 }, "deprecated": false }, @@ -11708,7 +11675,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 247 + "lineNumber": 246 }, "deprecated": false }, @@ -11724,7 +11691,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false } @@ -11740,7 +11707,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false, "children": [ @@ -11756,7 +11723,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false }, @@ -11772,7 +11739,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false } @@ -11788,7 +11755,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 102 + "lineNumber": 101 }, "deprecated": false, "children": [ @@ -11814,7 +11781,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 103 + "lineNumber": 102 }, "deprecated": false, "returnComment": [], @@ -11837,7 +11804,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 103 + "lineNumber": 102 }, "deprecated": false } @@ -11857,7 +11824,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "returnComment": [], @@ -11871,7 +11838,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false }, @@ -11884,7 +11851,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false } @@ -11904,7 +11871,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 105 + "lineNumber": 104 }, "deprecated": false, "returnComment": [], @@ -11918,7 +11885,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 106 + "lineNumber": 105 }, "deprecated": false }, @@ -11931,7 +11898,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 107 + "lineNumber": 106 }, "deprecated": false }, @@ -11947,7 +11914,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 108 + "lineNumber": 107 }, "deprecated": false }, @@ -11963,7 +11930,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 109 + "lineNumber": 108 }, "deprecated": false } @@ -11983,7 +11950,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 111 + "lineNumber": 110 }, "deprecated": false, "returnComment": [], @@ -11997,7 +11964,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 112 + "lineNumber": 111 }, "deprecated": false }, @@ -12013,7 +11980,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 113 + "lineNumber": 112 }, "deprecated": false }, @@ -12029,7 +11996,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 114 + "lineNumber": 113 }, "deprecated": false } @@ -12047,7 +12014,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 116 + "lineNumber": 115 }, "deprecated": false, "returnComment": [], @@ -12061,7 +12028,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 116 + "lineNumber": 115 }, "deprecated": false }, @@ -12074,7 +12041,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 116 + "lineNumber": 115 }, "deprecated": false } @@ -12092,7 +12059,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 94 + "lineNumber": 93 }, "deprecated": false, "children": [ @@ -12108,7 +12075,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 95 + "lineNumber": 94 }, "deprecated": false }, @@ -12124,7 +12091,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 96 + "lineNumber": 95 }, "deprecated": false }, @@ -12140,7 +12107,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 97 + "lineNumber": 96 }, "deprecated": false }, @@ -12156,7 +12123,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 98 + "lineNumber": 97 }, "deprecated": false }, @@ -12172,7 +12139,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 99 + "lineNumber": 98 }, "deprecated": false } @@ -12188,7 +12155,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 251 + "lineNumber": 250 }, "deprecated": false, "children": [ @@ -12201,7 +12168,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 252 + "lineNumber": 251 }, "deprecated": false } @@ -12217,7 +12184,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 159 + "lineNumber": 158 }, "deprecated": false, "children": [ @@ -12233,7 +12200,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 160 + "lineNumber": 159 }, "deprecated": false }, @@ -12249,7 +12216,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 161 + "lineNumber": 160 }, "deprecated": false } @@ -12265,7 +12232,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 87 + "lineNumber": 86 }, "deprecated": false, "children": [ @@ -12281,7 +12248,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 88 + "lineNumber": 87 }, "deprecated": false, "returnComment": [], @@ -12295,7 +12262,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 88 + "lineNumber": 87 }, "deprecated": false } @@ -12313,7 +12280,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 89 + "lineNumber": 88 }, "deprecated": false, "returnComment": [], @@ -12331,7 +12298,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 90 + "lineNumber": 89 }, "deprecated": false, "returnComment": [], @@ -12345,7 +12312,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 90 + "lineNumber": 89 }, "deprecated": false }, @@ -12361,7 +12328,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 90 + "lineNumber": 89 }, "deprecated": false } @@ -12379,7 +12346,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 91 + "lineNumber": 90 }, "deprecated": false, "returnComment": [], @@ -12393,7 +12360,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 91 + "lineNumber": 90 }, "deprecated": false } @@ -12417,7 +12384,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 142 + "lineNumber": 141 }, "deprecated": false, "initialIsOpen": false @@ -12442,7 +12409,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 17 + "lineNumber": 18 }, "deprecated": false, "initialIsOpen": false @@ -12459,7 +12426,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 164 + "lineNumber": 163 }, "deprecated": false, "initialIsOpen": false @@ -12484,7 +12451,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 219 + "lineNumber": 218 }, "deprecated": false, "initialIsOpen": false @@ -12711,7 +12678,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 662 + "lineNumber": 667 }, "deprecated": false, "initialIsOpen": false @@ -12736,7 +12703,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 85 + "lineNumber": 84 }, "deprecated": false, "initialIsOpen": false @@ -12761,7 +12728,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 84 + "lineNumber": 83 }, "deprecated": false, "initialIsOpen": false @@ -12778,7 +12745,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/types.ts", - "lineNumber": 19 + "lineNumber": 20 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/data_index_patterns.mdx b/api_docs/data_index_patterns.mdx index 8313619594a753..c5bb45f6e684e5 100644 --- a/api_docs/data_index_patterns.mdx +++ b/api_docs/data_index_patterns.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.indexPatterns'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataIndexPatternsObj from './data_index_patterns.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Server diff --git a/api_docs/data_query.json b/api_docs/data_query.json index a9c17111369510..d32f630b982f83 100644 --- a/api_docs/data_query.json +++ b/api_docs/data_query.json @@ -1183,7 +1183,7 @@ "section": "def-public.SavedObjectsClient", "text": "SavedObjectsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"update\" | \"bulkUpdate\">) => ", + ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"resolve\" | \"update\" | \"bulkUpdate\">) => ", { "pluginId": "data", "scope": "public", @@ -1214,7 +1214,7 @@ "section": "def-public.SavedObjectsClient", "text": "SavedObjectsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"update\" | \"bulkUpdate\">" + ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"resolve\" | \"update\" | \"bulkUpdate\">" ], "source": { "path": "src/plugins/data/public/query/saved_query/saved_query_service.ts", diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 751cd14dc7c5be..25edd420d1d91f 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataQueryObj from './data_query.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Client diff --git a/api_docs/data_search.json b/api_docs/data_search.json index 99c04298c27cbd..b6f3e18e359457 100644 --- a/api_docs/data_search.json +++ b/api_docs/data_search.json @@ -193,7 +193,7 @@ "description": [], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 67 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -209,7 +209,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 93 + "lineNumber": 95 }, "deprecated": false, "children": [ @@ -231,7 +231,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 93 + "lineNumber": 95 }, "deprecated": false, "isRequired": true @@ -251,7 +251,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 113 + "lineNumber": 116 }, "deprecated": false, "children": [], @@ -299,7 +299,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 313 + "lineNumber": 316 }, "deprecated": false, "children": [ @@ -322,7 +322,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 313 + "lineNumber": 316 }, "deprecated": false, "isRequired": true @@ -345,7 +345,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 313 + "lineNumber": 316 }, "deprecated": false, "isRequired": true @@ -367,7 +367,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 386 + "lineNumber": 413 }, "deprecated": false, "children": [ @@ -383,7 +383,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 386 + "lineNumber": 413 }, "deprecated": false, "isRequired": true @@ -1504,7 +1504,7 @@ "description": [], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false, "children": [ @@ -1526,7 +1526,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 55 + "lineNumber": 56 }, "deprecated": false }, @@ -1548,7 +1548,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 56 + "lineNumber": 57 }, "deprecated": false }, @@ -1570,7 +1570,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 57 + "lineNumber": 58 }, "deprecated": false }, @@ -1594,7 +1594,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 58 + "lineNumber": 59 }, "deprecated": false }, @@ -1756,7 +1756,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 59 + "lineNumber": 60 }, "deprecated": false }, @@ -1773,7 +1773,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false }, @@ -1827,7 +1827,7 @@ ], "source": { "path": "src/plugins/data/public/search/search_interceptor/search_interceptor.ts", - "lineNumber": 61 + "lineNumber": 62 }, "deprecated": false } @@ -2207,7 +2207,59 @@ "objects": [] }, "server": { - "classes": [], + "classes": [ + { + "parentPluginId": "data", + "id": "def-server.NoSearchIdInSessionError", + "type": "Class", + "tags": [], + "label": "NoSearchIdInSessionError", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "server", + "docId": "kibDataSearchPluginApi", + "section": "def-server.NoSearchIdInSessionError", + "text": "NoSearchIdInSessionError" + }, + " extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.KbnError", + "text": "KbnError" + } + ], + "source": { + "path": "src/plugins/data/server/search/errors/no_search_id_in_session.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-server.NoSearchIdInSessionError.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "src/plugins/data/server/search/errors/no_search_id_in_session.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "functions": [ { "parentPluginId": "data", @@ -4599,7 +4651,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 202 + "lineNumber": 201 }, "deprecated": false, "children": [ @@ -4622,7 +4674,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 202 + "lineNumber": 201 }, "deprecated": false, "isRequired": false @@ -4642,7 +4694,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 206 + "lineNumber": 205 }, "deprecated": false, "children": [], @@ -4660,7 +4712,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false, "children": [ @@ -4676,7 +4728,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false, "isRequired": true @@ -4693,7 +4745,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 210 + "lineNumber": 209 }, "deprecated": false, "isRequired": true @@ -4733,7 +4785,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 236 + "lineNumber": 235 }, "deprecated": false, "children": [ @@ -4757,7 +4809,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 236 + "lineNumber": 235 }, "deprecated": false, "isRequired": true @@ -4781,7 +4833,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 236 + "lineNumber": 235 }, "deprecated": false, "isRequired": false @@ -4813,7 +4865,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "children": [ @@ -4838,7 +4890,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "isRequired": false @@ -4862,7 +4914,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 292 + "lineNumber": 291 }, "deprecated": false, "children": [], @@ -4886,7 +4938,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 323 + "lineNumber": 322 }, "deprecated": true, "references": [ @@ -4915,7 +4967,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 334 + "lineNumber": 333 }, "deprecated": false, "children": [], @@ -4941,7 +4993,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 343 + "lineNumber": 342 }, "deprecated": false, "children": [], @@ -4977,7 +5029,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 398 + "lineNumber": 397 }, "deprecated": false, "children": [], @@ -5003,7 +5055,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 402 + "lineNumber": 401 }, "deprecated": false, "children": [], @@ -5029,7 +5081,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 406 + "lineNumber": 405 }, "deprecated": false, "children": [], @@ -5047,7 +5099,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 410 + "lineNumber": 409 }, "deprecated": false, "children": [ @@ -5063,7 +5115,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 410 + "lineNumber": 409 }, "deprecated": false, "isRequired": true @@ -5083,7 +5135,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 414 + "lineNumber": 413 }, "deprecated": false, "children": [ @@ -5099,7 +5151,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 414 + "lineNumber": 413 }, "deprecated": false, "isRequired": true @@ -5116,7 +5168,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 414 + "lineNumber": 413 }, "deprecated": false, "isRequired": false @@ -5136,7 +5188,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 422 + "lineNumber": 421 }, "deprecated": false, "children": [], @@ -5154,7 +5206,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 428 + "lineNumber": 427 }, "deprecated": false, "children": [], @@ -5174,7 +5226,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 437 + "lineNumber": 436 }, "deprecated": false, "children": [], @@ -5192,7 +5244,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 441 + "lineNumber": 440 }, "deprecated": false, "children": [ @@ -5208,7 +5260,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 441 + "lineNumber": 440 }, "deprecated": false, "isRequired": true @@ -5235,7 +5287,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 455 + "lineNumber": 454 }, "deprecated": false, "children": [], @@ -5261,7 +5313,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 459 + "lineNumber": 458 }, "deprecated": false, "children": [], @@ -5279,7 +5331,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 463 + "lineNumber": 462 }, "deprecated": false, "children": [], @@ -5297,7 +5349,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 468 + "lineNumber": 467 }, "deprecated": false, "children": [], @@ -5346,7 +5398,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 479 + "lineNumber": 478 }, "deprecated": false }, @@ -5393,7 +5445,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 483 + "lineNumber": 482 }, "deprecated": false }, @@ -5417,7 +5469,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 513 + "lineNumber": 512 }, "deprecated": false, "children": [ @@ -5439,7 +5491,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 513 + "lineNumber": 512 }, "deprecated": false, "isRequired": true @@ -5801,6 +5853,36 @@ ], "returnComment": [] }, + { + "parentPluginId": "data", + "id": "def-common.AggConfigs.getResolvedTimeRange", + "type": "Function", + "tags": [], + "label": "getResolvedTimeRange", + "description": [ + "\nReturns the current time range as moment instance (date math will get resolved using the current \"now\" value or system time if not set)" + ], + "signature": [ + "() => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRangeBounds", + "text": "TimeRangeBounds" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_configs.ts", + "lineNumber": 134 + }, + "deprecated": false, + "children": [], + "returnComment": [ + "Current time range as resolved date." + ] + }, { "parentPluginId": "data", "id": "def-common.AggConfigs.clone", @@ -5820,7 +5902,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 131 + "lineNumber": 144 }, "deprecated": false, "children": [ @@ -5836,7 +5918,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 131 + "lineNumber": 144 }, "deprecated": false, "isRequired": true @@ -5890,7 +5972,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 144 + "lineNumber": 157 }, "deprecated": false, "children": [ @@ -5924,7 +6006,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 145 + "lineNumber": 158 }, "deprecated": false, "isRequired": true @@ -5941,7 +6023,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 146 + "lineNumber": 159 }, "deprecated": false, "isRequired": true @@ -5971,7 +6053,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 187 + "lineNumber": 200 }, "deprecated": false, "children": [ @@ -5996,7 +6078,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 187 + "lineNumber": 200 }, "deprecated": false, "isRequired": true @@ -6016,7 +6098,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 199 + "lineNumber": 212 }, "deprecated": false, "children": [], @@ -6042,7 +6124,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 289 + "lineNumber": 302 }, "deprecated": false, "children": [], @@ -6067,7 +6149,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 293 + "lineNumber": 306 }, "deprecated": false, "children": [ @@ -6083,7 +6165,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 293 + "lineNumber": 306 }, "deprecated": false, "isRequired": true @@ -6111,7 +6193,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 297 + "lineNumber": 310 }, "deprecated": false, "children": [ @@ -6127,7 +6209,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 297 + "lineNumber": 310 }, "deprecated": false, "isRequired": true @@ -6155,7 +6237,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 301 + "lineNumber": 314 }, "deprecated": false, "children": [ @@ -6171,7 +6253,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 301 + "lineNumber": 314 }, "deprecated": false, "isRequired": true @@ -6199,7 +6281,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 305 + "lineNumber": 318 }, "deprecated": false, "children": [ @@ -6215,7 +6297,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 305 + "lineNumber": 318 }, "deprecated": false, "isRequired": true @@ -6243,7 +6325,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 309 + "lineNumber": 322 }, "deprecated": false, "children": [ @@ -6259,7 +6341,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 309 + "lineNumber": 322 }, "deprecated": false, "isRequired": true @@ -6287,7 +6369,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 313 + "lineNumber": 326 }, "deprecated": false, "children": [ @@ -6303,7 +6385,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 313 + "lineNumber": 326 }, "deprecated": false, "isRequired": true @@ -6331,7 +6413,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 317 + "lineNumber": 330 }, "deprecated": false, "children": [], @@ -6349,7 +6431,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 331 + "lineNumber": 344 }, "deprecated": false, "children": [], @@ -6367,7 +6449,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 346 + "lineNumber": 359 }, "deprecated": false, "children": [], @@ -6385,7 +6467,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 353 + "lineNumber": 366 }, "deprecated": false, "children": [], @@ -6411,7 +6493,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 357 + "lineNumber": 370 }, "deprecated": false, "children": [ @@ -6427,7 +6509,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 357 + "lineNumber": 370 }, "deprecated": false, "isRequired": false @@ -6463,7 +6545,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 410 + "lineNumber": 423 }, "deprecated": false, "children": [ @@ -6486,7 +6568,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 410 + "lineNumber": 423 }, "deprecated": false, "isRequired": true @@ -6514,7 +6596,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 429 + "lineNumber": 442 }, "deprecated": false, "children": [ @@ -6530,7 +6612,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 429 + "lineNumber": 442 }, "deprecated": false, "isRequired": true @@ -6562,7 +6644,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 444 + "lineNumber": 457 }, "deprecated": false, "children": [], @@ -6592,7 +6674,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 458 + "lineNumber": 471 }, "deprecated": false, "children": [ @@ -6610,7 +6692,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 458 + "lineNumber": 471 }, "deprecated": false, "isRequired": true @@ -6646,7 +6728,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 467 + "lineNumber": 480 }, "deprecated": false, "children": [ @@ -6670,7 +6752,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 467 + "lineNumber": 480 }, "deprecated": false, "isRequired": true @@ -6694,7 +6776,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 467 + "lineNumber": 480 }, "deprecated": false, "isRequired": false @@ -10424,15 +10506,15 @@ { "plugin": "discover", "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 207 + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 288 } }, { "plugin": "discover", "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 213 + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 294 } } ], @@ -10735,6 +10817,13 @@ "lineNumber": 77 } }, + { + "plugin": "discover", + "link": { + "path": "src/plugins/discover/public/application/angular/context/api/anchor.ts", + "lineNumber": 52 + } + }, { "plugin": "maps", "link": { @@ -10746,14 +10835,14 @@ "plugin": "maps", "link": { "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", - "lineNumber": 498 + "lineNumber": 530 } }, { "plugin": "maps", "link": { - "path": "x-pack/plugins/maps/public/classes/layers/blended_vector_layer/blended_vector_layer.ts", - "lineNumber": 330 + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx", + "lineNumber": 819 } } ], @@ -12288,7 +12377,7 @@ ], "source": { "path": "src/plugins/data/common/search/search_source/extract_references.ts", - "lineNumber": 13 + "lineNumber": 15 }, "deprecated": false, "children": [ @@ -12310,7 +12399,7 @@ ], "source": { "path": "src/plugins/data/common/search/search_source/extract_references.ts", - "lineNumber": 14 + "lineNumber": 16 }, "deprecated": false, "isRequired": true @@ -22092,7 +22181,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 83 + "lineNumber": 88 }, "deprecated": false, "children": [ @@ -22115,7 +22204,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 84 + "lineNumber": 89 }, "deprecated": false }, @@ -22128,7 +22217,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 85 + "lineNumber": 90 }, "deprecated": false }, @@ -22144,7 +22233,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 86 + "lineNumber": 91 }, "deprecated": false }, @@ -22160,7 +22249,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 87 + "lineNumber": 92 }, "deprecated": false } @@ -22186,7 +22275,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 74 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -22204,7 +22293,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 78 + "lineNumber": 83 }, "deprecated": false }, @@ -22220,7 +22309,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 80 + "lineNumber": 85 }, "deprecated": false } @@ -22340,6 +22429,24 @@ }, "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-common.IKibanaSearchResponse.isRestored", + "type": "CompoundType", + "tags": [], + "label": "isRestored", + "description": [ + "\nIndicates whether the results returned are from the async-search index" + ], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "src/plugins/data/common/search/types.ts", + "lineNumber": 71 + }, + "deprecated": false + }, { "parentPluginId": "data", "id": "def-common.IKibanaSearchResponse.rawResponse", @@ -22354,7 +22461,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 71 + "lineNumber": 76 }, "deprecated": false } @@ -22693,7 +22800,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 90 + "lineNumber": 95 }, "deprecated": false, "children": [ @@ -22711,7 +22818,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 94 + "lineNumber": 99 }, "deprecated": false }, @@ -22729,7 +22836,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 99 + "lineNumber": 104 }, "deprecated": false }, @@ -22747,7 +22854,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 105 + "lineNumber": 110 }, "deprecated": false }, @@ -22765,7 +22872,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 110 + "lineNumber": 115 }, "deprecated": false }, @@ -22783,7 +22890,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 115 + "lineNumber": 120 }, "deprecated": false }, @@ -22801,7 +22908,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 121 + "lineNumber": 126 }, "deprecated": false }, @@ -22826,7 +22933,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 126 + "lineNumber": 131 }, "deprecated": false }, @@ -22851,7 +22958,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 131 + "lineNumber": 136 }, "deprecated": false } @@ -26688,7 +26795,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false, "initialIsOpen": false @@ -27546,7 +27653,7 @@ ], "source": { "path": "src/plugins/data/common/search/types.ts", - "lineNumber": 138 + "lineNumber": 143 }, "deprecated": false, "initialIsOpen": false @@ -29139,7 +29246,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false, "children": [ @@ -29155,7 +29262,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false }, @@ -29171,7 +29278,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false }, @@ -29187,7 +29294,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 28 + "lineNumber": 29 }, "deprecated": false }, @@ -29200,7 +29307,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false }, @@ -29213,7 +29320,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false, "children": [ @@ -29226,7 +29333,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 33 + "lineNumber": 34 }, "deprecated": false, "children": [ @@ -29242,7 +29349,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false }, @@ -29258,7 +29365,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 35 + "lineNumber": 36 }, "deprecated": false }, @@ -29274,7 +29381,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false }, @@ -29287,7 +29394,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false } @@ -29302,7 +29409,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false, "children": [ @@ -29318,7 +29425,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 42 + "lineNumber": 43 }, "deprecated": false }, @@ -29334,7 +29441,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 43 + "lineNumber": 44 }, "deprecated": false }, @@ -29347,7 +29454,67 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 44 + "lineNumber": 45 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "data", + "id": "def-common.kibanaFilterFunction.args.disabled", + "type": "Object", + "tags": [], + "label": "disabled", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 49 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.kibanaFilterFunction.args.disabled.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"boolean\"[]" + ], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "data", + "id": "def-common.kibanaFilterFunction.args.disabled.default", + "type": "boolean", + "tags": [], + "label": "default", + "description": [], + "signature": [ + "false" + ], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "data", + "id": "def-common.kibanaFilterFunction.args.disabled.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 52 }, "deprecated": false } @@ -29367,7 +29534,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 50 + "lineNumber": 58 }, "deprecated": false, "children": [ @@ -29383,7 +29550,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 50 + "lineNumber": 58 }, "deprecated": false, "isRequired": true @@ -29400,7 +29567,7 @@ ], "source": { "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", - "lineNumber": 50 + "lineNumber": 58 }, "deprecated": false, "isRequired": true diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index d07be7dfc62aa2..4627768f160aeb 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataSearchObj from './data_search.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Client @@ -43,6 +42,9 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services ### Functions <DocDefinitionList data={dataSearchObj.server.functions}/> +### Classes +<DocDefinitionList data={dataSearchObj.server.classes}/> + ### Interfaces <DocDefinitionList data={dataSearchObj.server.interfaces}/> diff --git a/api_docs/data_ui.json b/api_docs/data_ui.json index 4a532af99a115f..31c9cd267f67fd 100644 --- a/api_docs/data_ui.json +++ b/api_docs/data_ui.json @@ -510,9 +510,9 @@ "signature": [ "Pick<Pick<", "EuiComboBoxProps", - "<any>, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"autoFocus\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"autoFocus\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\"> & Required<Pick<Pick<", + "<any>, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"async\" | \"compressed\" | \"fullWidth\" | \"isClearable\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"autoFocus\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"async\" | \"compressed\" | \"fullWidth\" | \"isClearable\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"autoFocus\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\"> & Required<Pick<Pick<", "EuiComboBoxProps", - "<any>, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"autoFocus\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"placeholder\">> & { onChange: (indexPatternId?: string | undefined) => void; indexPatternId: string; onNoIndexPatterns?: (() => void) | undefined; }" + "<any>, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"async\" | \"compressed\" | \"fullWidth\" | \"isClearable\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"autoFocus\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"placeholder\">> & { onChange: (indexPatternId?: string | undefined) => void; indexPatternId: string; onNoIndexPatterns?: (() => void) | undefined; }" ], "source": { "path": "src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx", @@ -537,7 +537,7 @@ "section": "def-public.SearchBarProps", "text": "SearchBarProps" }, - ", \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"intl\" | \"indexPatterns\" | \"isLoading\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"isClearable\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"timeHistory\" | \"onFiltersUpdated\" | \"onRefreshChange\">, \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"indexPatterns\" | \"isLoading\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"isClearable\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"timeHistory\" | \"onFiltersUpdated\" | \"onRefreshChange\">, any> & { WrappedComponent: React.ComponentType<Pick<", + ", \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"isClearable\" | \"isLoading\" | \"intl\" | \"indexPatterns\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"timeHistory\" | \"onFiltersUpdated\" | \"onRefreshChange\">, \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"isClearable\" | \"isLoading\" | \"indexPatterns\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"timeHistory\" | \"onFiltersUpdated\" | \"onRefreshChange\">, any> & { WrappedComponent: React.ComponentType<Pick<", { "pluginId": "data", "scope": "public", @@ -545,7 +545,7 @@ "section": "def-public.SearchBarProps", "text": "SearchBarProps" }, - ", \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"intl\" | \"indexPatterns\" | \"isLoading\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"isClearable\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"timeHistory\" | \"onFiltersUpdated\" | \"onRefreshChange\"> & ReactIntl.InjectedIntlProps>; }" + ", \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"isClearable\" | \"isLoading\" | \"intl\" | \"indexPatterns\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"timeHistory\" | \"onFiltersUpdated\" | \"onRefreshChange\"> & ReactIntl.InjectedIntlProps>; }" ], "source": { "path": "src/plugins/data/public/ui/search_bar/index.tsx", diff --git a/api_docs/data_ui.mdx b/api_docs/data_ui.mdx index c31b561bd4c803..64ea24211e524c 100644 --- a/api_docs/data_ui.mdx +++ b/api_docs/data_ui.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.ui'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataUiObj from './data_ui.json'; Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. @@ -19,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3809 | 107 | 3257 | 75 | +| 3833 | 107 | 3268 | 75 | ## Client diff --git a/api_docs/data_visualizer.json b/api_docs/data_visualizer.json index c965a0a5923ac4..938067800eb4cd 100644 --- a/api_docs/data_visualizer.json +++ b/api_docs/data_visualizer.json @@ -13,7 +13,7 @@ "description": [], "source": { "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx", - "lineNumber": 119 + "lineNumber": 120 }, "deprecated": false, "children": [ @@ -35,7 +35,7 @@ ], "source": { "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx", - "lineNumber": 120 + "lineNumber": 121 }, "deprecated": false }, @@ -58,7 +58,7 @@ ], "source": { "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx", - "lineNumber": 121 + "lineNumber": 122 }, "deprecated": false } @@ -81,7 +81,7 @@ ], "source": { "path": "x-pack/plugins/data_visualizer/public/plugin.ts", - "lineNumber": 38 + "lineNumber": 40 }, "deprecated": false, "lifecycle": "start", diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 384fd07bd11762..768d01762d31f9 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,12 +8,11 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import dataVisualizerObj from './data_visualizer.json'; +The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. - - +Contact [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/deprecations.mdx b/api_docs/deprecations.mdx index 74dae7faf838a4..c2b0b872ac35fd 100644 --- a/api_docs/deprecations.mdx +++ b/api_docs/deprecations.mdx @@ -71,10 +71,6 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibExpressionsPluginApi" section="def-common.Render" text="Render"/> | [table.ts#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts#L25) | - | | <DocLink id="kibExpressionsPluginApi" section="def-common.Render" text="Render"/> | [markdown.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/target/types/canvas_plugin_src/functions/browser/markdown.d.ts#L1) | - | | <DocLink id="kibExpressionsPluginApi" section="def-common.Render" text="Render"/> | [markdown.d.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/target/types/canvas_plugin_src/functions/browser/markdown.d.ts#L13) | - | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [query_es_sql.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/lib/query_es_sql.ts#L12) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [query_es_sql.ts#L37](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/lib/query_es_sql.ts#L37) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [functions.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#L8) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [functions.ts#L40](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#L40) | 7.16 | @@ -100,9 +96,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [types.ts#L33](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#L33) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [types.ts#L186](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/types.ts#L186) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [plugin.tsx#L42](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#L42) | - | -| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [plugin.tsx#L127](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#L127) | - | +| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [plugin.tsx#L130](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/plugin.tsx#L130) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [url_generator.ts#L19](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/url_generator.ts#L19) | - | -| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [url_generator.ts#L95](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/url_generator.ts#L95) | - | +| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [url_generator.ts#L101](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/url_generator.ts#L101) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [saved_objects.ts#L11](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/services/saved_objects.ts#L11) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [saved_dashboard.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#L10) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [saved_dashboard.ts#L19](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts#L19) | - | @@ -111,8 +107,6 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [clone_panel_action.tsx#L14](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#L14) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [clone_panel_action.tsx#L98](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#L98) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [clone_panel_action.tsx#L126](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/actions/clone_panel_action.tsx#L126) | - | -| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [use_dashboard_state_manager.ts#L23](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/hooks/use_dashboard_state_manager.ts#L23) | - | -| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [use_dashboard_state_manager.ts#L35](https://github.com/elastic/kibana/tree/master/src/plugins/dashboard/public/application/hooks/use_dashboard_state_manager.ts#L35) | - | @@ -126,23 +120,25 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L16](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#L16) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L30](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#L30) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [kibana_services.ts#L104](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/kibana_services.ts#L104) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [search_embeddable.ts#L23](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/search_embeddable.ts#L23) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [search_embeddable.ts#L59](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/search_embeddable.ts#L59) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [saved_search_embeddable.tsx#L25](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#L25) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [saved_search_embeddable.tsx#L53](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#L53) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [kibana_services.ts#L104](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/kibana_services.ts#L104) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [saved_search_embeddable.tsx#L25](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#L25) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [saved_search_embeddable.tsx#L53](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#L53) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [kibana_services.ts#L101](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/kibana_services.ts#L101) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [create_doc_table_react.tsx#L15](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/angular/doc_table/create_doc_table_react.tsx#L15) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [create_doc_table_react.tsx#L25](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/angular/doc_table/create_doc_table_react.tsx#L25) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L16](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#L16) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L30](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/types.ts#L30) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [kibana_services.ts#L104](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/kibana_services.ts#L104) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [search_embeddable.ts#L23](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/search_embeddable.ts#L23) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [search_embeddable.ts#L59](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/search_embeddable.ts#L59) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [saved_search_embeddable.tsx#L25](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#L25) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [saved_search_embeddable.tsx#L53](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx#L53) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectSaveModal" text="SavedObjectSaveModal"/> | [on_save_search.tsx#L11](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.tsx#L11) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectSaveModal" text="SavedObjectSaveModal"/> | [on_save_search.tsx#L133](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.tsx#L133) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [saved_searches.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/saved_searches.ts#L10) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [saved_searches.ts#L20](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/saved_searches.ts#L20) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [plugin.tsx#L33](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#L33) | - | -| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [plugin.tsx#L88](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#L88) | - | +| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectLoader" text="SavedObjectLoader"/> | [plugin.tsx#L122](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/plugin.tsx#L122) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [_saved_search.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/_saved_search.ts#L9) | - | | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObject" text="SavedObject"/> | [_saved_search.ts#L61](https://github.com/elastic/kibana/tree/master/src/plugins/discover/public/saved_searches/_saved_search.ts#L61) | - | @@ -153,7 +149,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location | Remove By | | ---------------|-----------|-----------| | <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectSaveModal" text="SavedObjectSaveModal"/> | [attribute_service.tsx#L13](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#L13) | - | -| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectSaveModal" text="SavedObjectSaveModal"/> | [attribute_service.tsx#L167](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#L167) | - | +| <DocLink id="kibSavedObjectsPluginApi" section="def-public.SavedObjectSaveModal" text="SavedObjectSaveModal"/> | [attribute_service.tsx#L165](https://github.com/elastic/kibana/tree/master/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx#L165) | - | @@ -189,7 +185,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [query_bar.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#L30) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [query_bar.tsx#L38](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/query_bar.tsx#L38) | - | | <DocLink id="kibCorePluginApi" section="def-server.AsyncPlugin" text="AsyncPlugin"/> | [plugin.ts#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#L14) | - | -| <DocLink id="kibCorePluginApi" section="def-server.AsyncPlugin" text="AsyncPlugin"/> | [plugin.ts#L189](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#L189) | - | +| <DocLink id="kibCorePluginApi" section="def-server.AsyncPlugin" text="AsyncPlugin"/> | [plugin.ts#L190](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/server/plugin.ts#L190) | - | | <DocLink id="kibCorePluginApi" section="def-server.AsyncPlugin" text="AsyncPlugin"/> | [plugin.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#L2) | - | | <DocLink id="kibCorePluginApi" section="def-server.AsyncPlugin" text="AsyncPlugin"/> | [plugin.d.ts#L84](https://github.com/elastic/kibana/tree/master/x-pack/plugins/fleet/target/types/server/plugin.d.ts#L84) | - | @@ -228,93 +224,18 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location | Remove By | | ---------------|-----------|-----------| -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/plugin.ts#L14) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L42](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/plugin.ts#L42) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/plugin.ts#L12) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L38](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/plugin.ts#L38) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.LegacyScopedClusterClient" text="LegacyScopedClusterClient"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L9) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyScopedClusterClient" text="LegacyScopedClusterClient"/> | [types.ts#L40](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L40) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.LegacyScopedClusterClient" text="LegacyScopedClusterClient"/> | [types.ts#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L39) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.LegacyScopedClusterClient" text="LegacyScopedClusterClient"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L1) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyScopedClusterClient" text="LegacyScopedClusterClient"/> | [types.d.ts#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L25) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.LegacyScopedClusterClient" text="LegacyScopedClusterClient"/> | [types.d.ts#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L24) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L10) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.ts#L43](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L43) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.ts#L50](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L50) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.ts#L42](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L42) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.ts#L49](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/server/types.ts#L49) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L1) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.d.ts#L27](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L27) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.d.ts#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L33) | 7.16 | - - - -## indexPatternManagement - -| Deprecated API | Reference location | Remove By | -| ---------------|-----------|-----------| -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [config.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [config.ts#L29](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L29) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [config.ts#L29](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L29) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [config.ts#L42](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L42) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [config.ts#L46](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L46) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L32](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L32) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L32](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L32) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L43](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L43) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L50](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L50) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L22](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#L22) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L171](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#L171) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L15](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#L15) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L18](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#L18) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_header.tsx#L12](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_header.tsx#L15](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#L15) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [config.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [config.ts#L42](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L42) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [manager.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [manager.ts#L43](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L43) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [extract_time_fields.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [extract_time_fields.ts#L12](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.ts#L11](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [indexed_fields_table.tsx#L11](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [indexed_fields_table.tsx#L23](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#L23) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_editor.tsx#L45](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#L45) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_editor.tsx#L148](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#L148) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [config.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [config.ts#L42](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L42) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [manager.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [manager.ts#L43](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L43) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [extract_time_fields.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [extract_time_fields.ts#L12](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.ts#L11](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [indexed_fields_table.tsx#L11](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [indexed_fields_table.tsx#L23](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#L23) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_editor.tsx#L45](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#L45) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_editor.tsx#L148](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#L148) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [config.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [config.ts#L29](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L29) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [config.ts#L29](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L29) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [config.ts#L42](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L42) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [config.ts#L46](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L46) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L32](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L32) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L32](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L32) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L43](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L43) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [manager.ts#L50](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L50) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L22](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#L22) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L171](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/components/table/table.tsx#L171) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L15](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#L15) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [table.tsx#L18](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/table/table.tsx#L18) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_header.tsx#L12](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_header.tsx#L15](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/index_header/index_header.tsx#L15) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [config.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [config.ts#L42](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/config.ts#L42) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [manager.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [manager.ts#L43](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/service/list/manager.ts#L43) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [extract_time_fields.ts#L10](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [extract_time_fields.ts#L12](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/lib/extract_time_fields.ts#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.ts#L11](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/types.ts#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [indexed_fields_table.tsx#L11](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [indexed_fields_table.tsx#L23](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.tsx#L23) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_editor.tsx#L45](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#L45) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_editor.tsx#L148](https://github.com/elastic/kibana/tree/master/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx#L148) | - | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.d.ts#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L26) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [types.d.ts#L32](https://github.com/elastic/kibana/tree/master/x-pack/plugins/index_management/target/types/server/types.d.ts#L32) | 7.16 | @@ -341,11 +262,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [with_source.tsx#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/with_source/with_source.tsx#L10) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [with_source.tsx#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/with_source/with_source.tsx#L24) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [toolbar.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [toolbar.tsx#L32](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx#L32) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [toolbar.tsx#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx#L31) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [use_metric_explorer_state.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metric_explorer_state.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [use_metric_explorer_state.ts#L32](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metric_explorer_state.ts#L32) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L23](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx#L23) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx#L24) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [with_kuery_autocompletion.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/containers/with_kuery_autocompletion.d.ts#L2) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [with_kuery_autocompletion.d.ts#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/containers/with_kuery_autocompletion.d.ts#L14) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [with_source.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/containers/with_source/with_source.d.ts#L2) | - | @@ -361,7 +282,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [use_metrics_explorer_data.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_data.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [use_metrics_explorer_data.d.ts#L4](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_data.d.ts#L4) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/index.tsx#L14) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L193](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/index.tsx#L193) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L162](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/index.tsx#L162) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_patterns.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts#L13) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_patterns.ts#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts#L30) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_patterns.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/common/dependency_mocks/index_patterns.d.ts#L1) | - | @@ -497,11 +418,11 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [with_source.tsx#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/with_source/with_source.tsx#L10) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [with_source.tsx#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/containers/with_source/with_source.tsx#L24) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [toolbar.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [toolbar.tsx#L32](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx#L32) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [toolbar.tsx#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/toolbar.tsx#L31) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [use_metric_explorer_state.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metric_explorer_state.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [use_metric_explorer_state.ts#L32](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metric_explorer_state.ts#L32) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L23](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx#L23) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/index.tsx#L24) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [with_kuery_autocompletion.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/containers/with_kuery_autocompletion.d.ts#L2) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [with_kuery_autocompletion.d.ts#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/containers/with_kuery_autocompletion.d.ts#L14) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [with_source.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/containers/with_source/with_source.d.ts#L2) | - | @@ -517,7 +438,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [use_metrics_explorer_data.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_data.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [use_metrics_explorer_data.d.ts#L4](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_data.d.ts#L4) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/index.tsx#L14) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L193](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/index.tsx#L193) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L162](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/public/pages/metrics/index.tsx#L162) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_patterns.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts#L13) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_patterns.ts#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/common/dependency_mocks/index_patterns.ts#L30) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_patterns.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/common/dependency_mocks/index_patterns.d.ts#L1) | - | @@ -578,11 +499,6 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [custom_metric_form.d.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/inventory_view/components/waffle/metric_control/custom_metric_form.d.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/inventory_view/components/waffle/metric_control/index.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [index.d.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/public/pages/metrics/inventory_view/components/waffle/metric_control/index.d.ts#L9) | - | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [log_entry_categories_analysis.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts#L9) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [log_entry_categories_analysis.ts#L139](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts#L139) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [log_entry_categories_analysis.ts#L405](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts#L405) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [log_entry_categories_analysis.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/server/lib/log_analysis/log_entry_categories_analysis.d.ts#L1) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [log_entry_categories_analysis.d.ts#L58](https://github.com/elastic/kibana/tree/master/x-pack/plugins/infra/target/types/server/lib/log_analysis/log_entry_categories_analysis.d.ts#L58) | 7.16 | @@ -592,6 +508,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | ---------------|-----------|-----------| | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [embeddable.tsx#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx#L14) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [embeddable.tsx#L85](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx#L85) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#L25) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L102](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#L102) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field_item.tsx#L47](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#L47) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field_item.tsx#L172](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#L172) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [datapanel.tsx#L42](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#L42) | - | @@ -604,12 +522,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [save.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts#L10) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [save.test.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts#L18) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L8) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.ts#L57](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L57) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.ts#L60](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L60) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L139](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L139) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L248](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L248) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L287](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L287) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L329](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L329) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L141](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L141) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L250](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L250) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L290](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L290) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.ts#L332](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L332) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/public/indexpattern_datasource/types.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [types.d.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/public/indexpattern_datasource/types.d.ts#L22) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [field_stats.d.ts#L3](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#L3) | - | @@ -619,12 +537,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [save.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts#L10) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [save.test.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts#L18) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L8) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.ts#L57](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L57) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.ts#L60](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L60) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L139](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L139) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L248](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L248) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L287](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L287) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L329](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L329) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L141](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L141) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L250](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L250) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L290](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L290) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.ts#L332](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L332) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/public/indexpattern_datasource/types.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [types.d.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/public/indexpattern_datasource/types.d.ts#L22) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.d.ts#L3](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#L3) | - | @@ -633,6 +551,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [field_stats.d.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [embeddable.tsx#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx#L14) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [embeddable.tsx#L85](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx#L85) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#L25) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L102](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx#L102) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field_item.tsx#L47](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#L47) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field_item.tsx#L172](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx#L172) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [datapanel.tsx#L42](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx#L42) | - | @@ -645,12 +565,12 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [save.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts#L10) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [save.test.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/editor_frame_service/editor_frame/save.test.ts#L18) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L8) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.ts#L57](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L57) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.ts#L60](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/public/indexpattern_datasource/types.ts#L60) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L11) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L139](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L139) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L248](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L248) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L287](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L287) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L329](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L329) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L141](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L141) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L250](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L250) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L290](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L290) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.ts#L332](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/server/routes/field_stats.ts#L332) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/public/indexpattern_datasource/types.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [types.d.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/public/indexpattern_datasource/types.d.ts#L22) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [field_stats.d.ts#L3](https://github.com/elastic/kibana/tree/master/x-pack/plugins/lens/target/types/server/routes/field_stats.d.ts#L3) | - | @@ -668,20 +588,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [types.ts#L85](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/types.ts#L85) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [types.ts#L110](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/types.ts#L110) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L18) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L109](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L109) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L151](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L151) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L180](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L180) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L110](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L110) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L154](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L154) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.ts#L183](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L183) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.test.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.test.ts#L18) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [plugin.test.ts#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.test.ts#L33) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [types.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/target/types/server/types.d.ts#L2) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [types.d.ts#L70](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/target/types/server/types.d.ts#L70) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyClusterClient" text="ILegacyClusterClient"/> | [types.d.ts#L94](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/target/types/server/types.d.ts#L94) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L19) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L102](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L102) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L103](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L103) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L111](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L111) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L114](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L114) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L104](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L104) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L112](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L112) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L115](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L115) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyScopedClusterClient" text="ILegacyScopedClusterClient"/> | [plugin.ts#L116](https://github.com/elastic/kibana/tree/master/x-pack/plugins/licensing/server/plugin.ts#L116) | 7.16 | @@ -936,7 +856,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location | Remove By | | ---------------|-----------|-----------| | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#L8) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#L45) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#L44) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_doc_field.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_doc_field.ts#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#L45) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_source.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#L10) | - | @@ -975,9 +895,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L17) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L39) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L40](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L40) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L13) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L164) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L281](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L281) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L175](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L175) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L292](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L292) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L22) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L43](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L43) | - | @@ -1029,8 +949,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L30) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L33) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#L10) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_doc_field.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_doc_field.ts#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#L45) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_source.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#L10) | - | @@ -1069,9 +989,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L17) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L39) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L40](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L40) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L13) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L164) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L281](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L281) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L175](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L175) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L292](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L292) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L22) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L43](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L43) | - | @@ -1123,10 +1043,10 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L30) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L33) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#L10) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#L8) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#L45) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/embeddable/types.ts#L44) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_doc_field.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_doc_field.ts#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts#L45) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_source.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts#L10) | - | @@ -1165,9 +1085,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L17) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L39) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [update_source_editor.tsx#L40](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/update_source_editor.tsx#L40) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L13) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L164) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L281](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L281) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L175](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L175) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [es_search_source.tsx#L292](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#L292) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L22) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [metric_editor.tsx#L43](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx#L43) | - | @@ -1219,8 +1139,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L30) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L33) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [create_source_editor.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/get_docvalue_source_fields.test.ts#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#L10) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [get_docvalue_source_fields.test.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/maps/public/classes/sources/es_search_source/util/get_docvalue_source_fields.test.ts#L12) | - | @@ -1361,7 +1281,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [static_globals.ts#L43](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/server/static_globals.ts#L43) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/server/plugin.ts#L18) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L74](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/server/plugin.ts#L74) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L279](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/server/plugin.ts#L279) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.ts#L284](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/server/plugin.ts#L284) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [types.d.ts#L2](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/server/types.d.ts#L2) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [types.d.ts#L47](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/server/types.d.ts#L47) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.ILegacyCustomClusterClient" text="ILegacyCustomClusterClient"/> | [plugin.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/monitoring/target/types/server/plugin.d.ts#L1) | 7.16 | @@ -1450,22 +1370,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location | Remove By | | ---------------|-----------|-----------| -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L18) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L95](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L95) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L19) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L94](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L94) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L53) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L61](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L61) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L69](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L69) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [default_configs.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#L19) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [default_configs.ts#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#L24) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L18) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L95](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L95) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L56](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L56) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L64](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L64) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L72](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L72) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L89](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L89) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L19) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L94](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts#L94) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L10) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L53) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L61](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L61) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L69](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L69) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [default_configs.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#L19) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [default_configs.ts#L24](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/default_configs.ts#L24) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L56](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L56) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L64](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L64) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L72](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L72) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [utils.ts#L89](https://github.com/elastic/kibana/tree/master/x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts#L89) | - | @@ -1533,7 +1451,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location | Remove By | | ---------------|-----------|-----------| | <DocLink id="kibCorePluginApi" section="def-server.LegacyRequest" text="LegacyRequest"/> | [index.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/saved_objects/index.ts#L8) | - | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyRequest" text="LegacyRequest"/> | [index.ts#L34](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/saved_objects/index.ts#L34) | - | +| <DocLink id="kibCorePluginApi" section="def-server.LegacyRequest" text="LegacyRequest"/> | [index.ts#L47](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/saved_objects/index.ts#L47) | - | @@ -1541,19 +1459,16 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | Deprecated API | Reference location | Remove By | | ---------------|-----------|-----------| -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L21) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L66) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [action.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L19) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [action.ts#L100](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L100) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L86](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#L86) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L23](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L23) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L81](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L81) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [action.ts#L20](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L20) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [action.ts#L100](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L100) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#L12) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L48](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#L48) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L122](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#L122) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L13) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L112](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L112) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L152](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L152) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L16](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L16) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L17) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L22) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L37](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L37) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L80](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L80) | - | @@ -1566,35 +1481,38 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [columns.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/columns.tsx#L11) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [columns.tsx#L50](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/columns.tsx#L50) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [columns.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/columns.tsx#L164) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L122](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L122) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L36](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L36) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L126](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L126) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L28](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#L28) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L48](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#L48) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [top_n.tsx#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx#L17) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [top_n.tsx#L55](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx#L55) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx#L18) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L79](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx#L79) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L55](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L55) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L77](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L77) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L82](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L82) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L13) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L128](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L128) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L168](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L168) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx#L18) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L51](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx#L51) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/details/types.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L41](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/details/types.ts#L41) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx#L12) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L34](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx#L34) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L44) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L60](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L60) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L65](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L65) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L28](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L28) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L15) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L58](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L58) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L132](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L132) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L164) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/hosts/pages/details/types.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L65](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/hosts/pages/details/types.ts#L65) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L20](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx#L20) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx#L44) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx#L21) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx#L33) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L28](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L28) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L15) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L58](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L58) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L132](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L132) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L164) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/common/search_strategy/index_fields/index.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/common/search_strategy/index_fields/index.d.ts#L66) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts#L1) | - | @@ -1614,20 +1532,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/network/components/network_top_countries_table/index.d.ts#L10) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/network/pages/details/types.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.d.ts#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/network/pages/details/types.d.ts#L25) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L53) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L16](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L16) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L31) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L39) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L49](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L49) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L52) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L485](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L485) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L13) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L16](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L16) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L31) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L39) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L49](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L49) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L52) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L504](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L504) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L9) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L35) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [types.ts#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L52) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx#L11) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field.tsx#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx#L18) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field.tsx#L93](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx#L93) | - | @@ -1637,6 +1555,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [use_field_value_autocomplete.ts#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.ts#L31) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field_value_match.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [field_value_match.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.tsx#L30) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [query.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts#L13) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [query.ts#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts#L53) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [model.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/sourcerer/model.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [model.ts#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/sourcerer/model.ts#L30) | - | | <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx#L33) | - | @@ -1753,19 +1673,16 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [index.tsx#L242](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx#L242) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/autocomplete_field/index.tsx#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [index.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/autocomplete_field/index.tsx#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L21) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L66) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [action.ts#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L19) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [action.ts#L100](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L100) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L86](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#L86) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L23](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L23) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L81](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts#L81) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [action.ts#L20](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L20) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [action.ts#L100](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts#L100) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L48](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#L48) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L122](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/containers/source/index.tsx#L122) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L13) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L112](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L112) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L152](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L152) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L16](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L16) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L17) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L22) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L37](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L37) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L80](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/lib/keury/index.ts#L80) | - | @@ -1778,35 +1695,38 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [columns.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/columns.tsx#L11) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [columns.tsx#L50](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/columns.tsx#L50) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [columns.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/columns.tsx#L164) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L122](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L122) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L36](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L36) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [events_viewer.tsx#L126](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx#L126) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L28](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#L28) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L48](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/events_by_dataset/index.tsx#L48) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [top_n.tsx#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx#L17) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [top_n.tsx#L55](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/top_n.tsx#L55) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx#L18) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L79](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx#L79) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L55](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L55) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L77](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L77) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L82](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L82) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L13) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L128](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L128) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L168](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/url_state/types.ts#L168) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx#L18) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L51](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/search_bar/index.tsx#L51) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/details/types.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L41](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/details/types.ts#L41) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L34](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/components/network_top_countries_table/index.tsx#L34) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L44) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L60](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L60) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [middleware.ts#L65](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#L65) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L12) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L28](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L28) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L15) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L58](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L58) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L132](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L132) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L164) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/hosts/pages/details/types.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L65](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/hosts/pages/details/types.ts#L65) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L20](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx#L20) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.tsx#L44) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx#L21) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx#L33) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L12) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L28](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/types.ts#L28) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L15) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L58](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L58) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L132](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L132) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L164](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx#L164) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/common/search_strategy/index_fields/index.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/common/search_strategy/index_fields/index.d.ts#L66) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/common/containers/source/index.d.ts#L1) | - | @@ -1826,20 +1746,20 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/network/components/network_top_countries_table/index.d.ts#L10) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/network/pages/details/types.d.ts#L1) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.d.ts#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/target/types/public/network/pages/details/types.d.ts#L25) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L9) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L35) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L53) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L16](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L16) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L31) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L39) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L49](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L49) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L52) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L485](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L485) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L9) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L12) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/models/index_pattern.ts#L13) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L16](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L16) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [get_query_filter.ts#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/common/detection_engine/get_query_filter.ts#L31) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L39](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L39) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L49](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L49) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L52) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L504](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx#L504) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L9](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L9) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L35) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [types.ts#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/network/pages/navigation/types.ts#L52) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field.tsx#L11](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx#L11) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field.tsx#L18](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx#L18) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field.tsx#L93](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx#L93) | - | @@ -1849,6 +1769,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [use_field_value_autocomplete.ts#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.ts#L31) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field_value_match.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [field_value_match.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.tsx#L30) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [query.ts#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts#L13) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [query.ts#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/reference_rules/query.ts#L53) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [model.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/sourcerer/model.ts#L8) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [model.ts#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/common/store/sourcerer/model.ts#L30) | - | | <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx#L33) | - | @@ -1913,18 +1835,22 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [index.tsx#L242](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx#L242) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/autocomplete_field/index.tsx#L12) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [index.tsx#L35](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/detections/components/rules/autocomplete_field/index.tsx#L35) | - | -| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#L14) | - | -| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L30](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#L30) | - | -| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L27](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/index.tsx#L27) | - | -| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L44](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/index.tsx#L44) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#L13) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L23](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/timelines/components/flyout/index.tsx#L23) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx#L13) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L25](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/bottom_bar/index.tsx#L25) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx#L12) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx#L66) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L12](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/index.tsx#L12) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [index.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/home/index.tsx#L26) | - | | <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [routes.tsx#L13](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/routes.tsx#L13) | - | | <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [routes.tsx#L23](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/routes.tsx#L23) | - | | <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [app.tsx#L14](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/app.tsx#L14) | - | -| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [app.tsx#L33](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/app.tsx#L33) | - | -| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [app.tsx#L73](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/app.tsx#L73) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [app.tsx#L32](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/app.tsx#L32) | - | +| <DocLink id="kibCorePluginApi" section="def-public.AppLeaveHandler" text="AppLeaveHandler"/> | [app.tsx#L81](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/public/app/app.tsx#L81) | - | | <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [sender.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts#L10) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [sender.ts#L457](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts#L457) | 7.16 | -| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [sender.ts#L476](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts#L476) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [sender.ts#L462](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts#L462) | 7.16 | +| <DocLink id="kibCorePluginApi" section="def-server.LegacyAPICaller" text="LegacyAPICaller"/> | [sender.ts#L481](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts#L481) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.LegacyCallAPIOptions" text="LegacyCallAPIOptions"/> | [types.ts#L55](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts#L55) | 7.16 | | <DocLink id="kibCorePluginApi" section="def-server.LegacyCallAPIOptions" text="LegacyCallAPIOptions"/> | [types.ts#L111](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security_solution/server/lib/detection_engine/types.ts#L111) | 7.16 | @@ -1964,7 +1890,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_index_expression.tsx#L87](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#L87) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L15) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L21) | - | -| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L45) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L26) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L26) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L52) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [boundary_index_expression.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-public.IFieldType" text="IFieldType"/> | [boundary_index_expression.tsx#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#L53) | - | @@ -1989,7 +1916,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_index_expression.tsx#L87](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#L87) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L15) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L21) | - | -| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L45) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L26) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L26) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L52) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [boundary_index_expression.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-common.IFieldType" text="IFieldType"/> | [boundary_index_expression.tsx#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#L53) | - | @@ -2027,7 +1955,8 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_index_expression.tsx#L87](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_index_expression.tsx#L87) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L15](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L15) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L21](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L21) | - | -| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L45](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L45) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L26) | - | +| <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L26](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L26) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [entity_by_expression.tsx#L52](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/entity_by_expression.tsx#L52) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [boundary_index_expression.tsx#L19](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#L19) | - | | <DocLink id="kibDataPluginApi" section="def-server.IFieldType" text="IFieldType"/> | [boundary_index_expression.tsx#L53](https://github.com/elastic/kibana/tree/master/x-pack/plugins/stack_alerts/public/alert_types/geo_containment/query_builder/expressions/boundary_index_expression.tsx#L53) | - | @@ -2038,6 +1967,41 @@ warning: This document is auto-generated and is meant to be viewed inside our ex +## timelines + +| Deprecated API | Reference location | Remove By | +| ---------------|-----------|-----------| +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts#L8) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L86](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts#L86) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L17) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L22) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L37](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L37) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.ts#L80](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L80) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L20](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#L20) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L153](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#L153) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#L31) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L121](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#L121) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#L8) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#L10) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts#L1) | - | +| <DocLink id="kibDataPluginApi" section="def-public.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts#L66) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts#L8) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L86](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts#L86) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L17](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L17) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L22](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L22) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L37](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L37) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.ts#L80](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/utils/keury/index.ts#L80) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L20](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#L20) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [helpers.tsx#L153](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/helpers.tsx#L153) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L31](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#L31) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.tsx#L121](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/components/t_grid/integrated/index.tsx#L121) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L8](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#L8) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index_pattern.ts#L10](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/public/mock/index_pattern.ts#L10) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L1](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts#L1) | - | +| <DocLink id="kibDataPluginApi" section="def-common.IIndexPattern" text="IIndexPattern"/> | [index.d.ts#L66](https://github.com/elastic/kibana/tree/master/x-pack/plugins/timelines/target/types/common/search_strategy/index_fields/index.d.ts#L66) | - | + + + ## transform | Deprecated API | Reference location | Remove By | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 89d67f54866f23..5d58ee25d5c327 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import devToolsObj from './dev_tools.json'; diff --git a/api_docs/discover.json b/api_docs/discover.json index 48ed4d51abc67b..e6a83719f5b880 100644 --- a/api_docs/discover.json +++ b/api_docs/discover.json @@ -70,6 +70,300 @@ } ], "interfaces": [ + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams", + "type": "Interface", + "tags": [], + "label": "DiscoverAppLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "discover", + "scope": "public", + "docId": "kibDiscoverPluginApi", + "section": "def-public.DiscoverAppLocatorParams", + "text": "DiscoverAppLocatorParams" + }, + " extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + } + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 17 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.savedSearchId", + "type": "string", + "tags": [], + "label": "savedSearchId", + "description": [ + "\nOptionally set saved search ID." + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.indexPatternId", + "type": "string", + "tags": [], + "label": "indexPatternId", + "description": [ + "\nOptionally set index pattern ID." + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.timeRange", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [ + "\nOptionally set the time range in the time picker." + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.refreshInterval", + "type": "CompoundType", + "tags": [], + "label": "refreshInterval", + "description": [ + "\nOptionally set the refresh interval." + ], + "signature": [ + "(", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.RefreshInterval", + "text": "RefreshInterval" + }, + " & ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + ") | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [ + "\nOptionally apply filters." + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [ + "\nOptionally set a query." + ], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.useHash", + "type": "CompoundType", + "tags": [], + "label": "useHash", + "description": [ + "\nIf not given, will use the uiSettings configuration for `storeInSessionStorage`. useHash determines\nwhether to hash the data in the url to avoid url length issues." + ], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.searchSessionId", + "type": "string", + "tags": [], + "label": "searchSessionId", + "description": [ + "\nBackground search session id" + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [ + "\nColumns displayed in the table" + ], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 62 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [ + "\nUsed interval of the histogram" + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [ + "\nArray of the used sorting [[field,direction],...]" + ], + "signature": [ + "(string[][] & ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + ") | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 72 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocatorParams.savedQuery", + "type": "string", + "tags": [], + "label": "savedQuery", + "description": [ + "\nid of the used saved query" + ], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 77 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "discover", "id": "def-public.DiscoverUrlGeneratorState", @@ -895,6 +1189,38 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverAppLocator", + "type": "Type", + "tags": [], + "label": "DiscoverAppLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "discover", + "scope": "public", + "docId": "kibDiscoverPluginApi", + "section": "def-public.DiscoverAppLocatorParams", + "text": "DiscoverAppLocatorParams" + }, + ">" + ], + "source": { + "path": "src/plugins/discover/public/locator.ts", + "lineNumber": 80 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "discover", "id": "def-public.SEARCH_EMBEDDABLE_TYPE", @@ -923,7 +1249,7 @@ "description": [], "source": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 76 + "lineNumber": 78 }, "deprecated": false, "children": [ @@ -943,7 +1269,32 @@ ], "source": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 77 + "lineNumber": 79 + }, + "deprecated": false + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverSetup.locator", + "type": "Object", + "tags": [], + "label": "locator", + "description": [ + "\n`share` plugin URL locator for Discover app. Use it to generate links into\nDiscover application, for example, navigate:\n\n```ts\nawait plugins.discover.locator.navigate({\n savedSearchId: '571aaf70-4c88-11e8-b3d7-01146121b73d',\n indexPatternId: 'c367b774-a4c2-11ea-bb37-0242ac130002',\n timeRange: {\n to: 'now',\n from: 'now-15m',\n mode: 'relative',\n },\n});\n```\n\nGenerate a location:\n\n```ts\nconst location = await plugins.discover.locator.getLocation({\n savedSearchId: '571aaf70-4c88-11e8-b3d7-01146121b73d',\n indexPatternId: 'c367b774-a4c2-11ea-bb37-0242ac130002',\n timeRange: {\n to: 'now',\n from: 'now-15m',\n mode: 'relative',\n },\n});\n```" + ], + "signature": [ + { + "pluginId": "discover", + "scope": "public", + "docId": "kibDiscoverPluginApi", + "section": "def-public.DiscoverAppLocator", + "text": "DiscoverAppLocator" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 118 }, "deprecated": false } @@ -960,7 +1311,7 @@ "description": [], "source": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 87 + "lineNumber": 121 }, "deprecated": false, "children": [ @@ -982,7 +1333,7 @@ ], "source": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 88 + "lineNumber": 122 }, "deprecated": false }, @@ -990,11 +1341,11 @@ "parentPluginId": "discover", "id": "def-public.DiscoverStart.urlGenerator", "type": "Object", - "tags": [], - "label": "urlGenerator", - "description": [ - "\n`share` plugin URL generator for Discover app. Use it to generate links into\nDiscover application, example:\n\n```ts\nconst url = await plugins.discover.urlGenerator.createUrl({\n savedSearchId: '571aaf70-4c88-11e8-b3d7-01146121b73d',\n indexPatternId: 'c367b774-a4c2-11ea-bb37-0242ac130002',\n timeRange: {\n to: 'now',\n from: 'now-15m',\n mode: 'relative',\n },\n});\n```" + "tags": [ + "deprecated" ], + "label": "urlGenerator", + "description": [], "signature": [ { "pluginId": "share", @@ -1007,7 +1358,48 @@ ], "source": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 106 + "lineNumber": 127 + }, + "deprecated": true, + "references": [ + { + "plugin": "osquery", + "link": { + "path": "x-pack/plugins/osquery/public/scheduled_query_groups/scheduled_query_group_queries_table.tsx", + "lineNumber": 224 + } + }, + { + "plugin": "osquery", + "link": { + "path": "x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx", + "lineNumber": 21 + } + } + ] + }, + { + "parentPluginId": "discover", + "id": "def-public.DiscoverStart.locator", + "type": "Object", + "tags": [], + "label": "locator", + "description": [ + "\n`share` plugin URL locator for Discover app. Use it to generate links into\nDiscover application, for example, navigate:\n\n```ts\nawait plugins.discover.locator.navigate({\n savedSearchId: '571aaf70-4c88-11e8-b3d7-01146121b73d',\n indexPatternId: 'c367b774-a4c2-11ea-bb37-0242ac130002',\n timeRange: {\n to: 'now',\n from: 'now-15m',\n mode: 'relative',\n },\n});\n```\n\nGenerate a location:\n\n```ts\nconst location = await plugins.discover.locator.getLocation({\n savedSearchId: '571aaf70-4c88-11e8-b3d7-01146121b73d',\n indexPatternId: 'c367b774-a4c2-11ea-bb37-0242ac130002',\n timeRange: {\n to: 'now',\n from: 'now-15m',\n mode: 'relative',\n },\n});\n```" + ], + "signature": [ + { + "pluginId": "discover", + "scope": "public", + "docId": "kibDiscoverPluginApi", + "section": "def-public.DiscoverAppLocator", + "text": "DiscoverAppLocator" + }, + " | undefined" + ], + "source": { + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 159 }, "deprecated": false } @@ -1234,6 +1626,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "discover", + "id": "def-common.SHOW_MULTIFIELDS", + "type": "string", + "tags": [], + "label": "SHOW_MULTIFIELDS", + "description": [], + "signature": [ + "\"discover:showMultiFields\"" + ], + "source": { + "path": "src/plugins/discover/common/index.ts", + "lineNumber": 22 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "discover", "id": "def-common.SORT_DEFAULT_ORDER_SETTING", diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index d4720530b58487..610ec5d90f2676 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import discoverObj from './discover.json'; +This plugin contains the Discover application and the saved search embeddable. - - +Contact [Kibana App](https://github.com/orgs/elastic/teams/kibana-app) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 64 | 0 | 51 | 6 | +| 81 | 0 | 55 | 6 | ## Client diff --git a/api_docs/discover_enhanced.json b/api_docs/discover_enhanced.json index e575671b5ef226..254ca8afc3fa0d 100644 --- a/api_docs/discover_enhanced.json +++ b/api_docs/discover_enhanced.json @@ -441,23 +441,17 @@ }, { "parentPluginId": "discoverEnhanced", - "id": "def-public.ExploreDataChartAction.getUrl", + "id": "def-public.ExploreDataChartAction.getLocation", "type": "Function", "tags": [], - "label": "getUrl", + "label": "getLocation", "description": [], "signature": [ "(context: ", "ExploreDataChartActionContext", ") => Promise<", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.KibanaURL", - "text": "KibanaURL" - }, - ">" + "KibanaLocation", + "<object>>" ], "source": { "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts", @@ -467,7 +461,7 @@ "children": [ { "parentPluginId": "discoverEnhanced", - "id": "def-public.ExploreDataChartAction.getUrl.$1", + "id": "def-public.ExploreDataChartAction.getLocation.$1", "type": "Object", "tags": [], "label": "context", @@ -573,21 +567,15 @@ }, { "parentPluginId": "discoverEnhanced", - "id": "def-public.ExploreDataContextMenuAction.getUrl", + "id": "def-public.ExploreDataContextMenuAction.getLocation", "type": "Function", "tags": [], - "label": "getUrl", + "label": "getLocation", "description": [], "signature": [ "(context: EmbeddableQueryContext) => Promise<", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.KibanaURL", - "text": "KibanaURL" - }, - ">" + "KibanaLocation", + "<object>>" ], "source": { "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts", @@ -597,7 +585,7 @@ "children": [ { "parentPluginId": "discoverEnhanced", - "id": "def-public.ExploreDataContextMenuAction.getUrl.$1", + "id": "def-public.ExploreDataContextMenuAction.getLocation.$1", "type": "Object", "tags": [], "label": "context", @@ -607,7 +595,7 @@ ], "source": { "path": "x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts", - "lineNumber": 43 + "lineNumber": 44 }, "deprecated": false, "isRequired": true diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index fb8842cd56bfed..3f9ab4d4068a7d 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import discoverEnhancedObj from './discover_enhanced.json'; diff --git a/api_docs/embeddable.json b/api_docs/embeddable.json index d560148f35b136..cc8977dbff87d6 100644 --- a/api_docs/embeddable.json +++ b/api_docs/embeddable.json @@ -29,7 +29,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false, "children": [ @@ -45,7 +45,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 24 + "lineNumber": 25 }, "deprecated": false }, @@ -61,7 +61,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false }, @@ -77,7 +77,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false, "children": [ @@ -151,7 +151,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 28 + "lineNumber": 29 }, "deprecated": false, "isRequired": true @@ -218,7 +218,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false, "isRequired": true @@ -241,7 +241,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 30 + "lineNumber": 31 }, "deprecated": false, "isRequired": true @@ -264,7 +264,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 31 + "lineNumber": 32 }, "deprecated": false, "isRequired": true @@ -281,10 +281,29 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "embeddable", + "id": "def-public.AddPanelAction.Unnamed.$6", + "type": "Function", + "tags": [], + "label": "reportUiCounter", + "description": [], + "signature": [ + "((appName: string, type: ", + "UiCounterMetricType", + ", eventNames: string | string[], count?: number | undefined) => void) | undefined" + ], + "source": { + "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", + "lineNumber": 34 + }, + "deprecated": false, + "isRequired": false } ], "returnComment": [] @@ -301,7 +320,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 35 + "lineNumber": 37 }, "deprecated": false, "children": [], @@ -319,7 +338,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 41 + "lineNumber": 43 }, "deprecated": false, "children": [], @@ -345,7 +364,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 45 + "lineNumber": 47 }, "deprecated": false, "children": [ @@ -368,7 +387,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 45 + "lineNumber": 47 }, "deprecated": false, "isRequired": true @@ -396,7 +415,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 50 + "lineNumber": 52 }, "deprecated": false, "children": [ @@ -419,7 +438,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 50 + "lineNumber": 52 }, "deprecated": false, "isRequired": true @@ -3309,7 +3328,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 89 + "lineNumber": 108 }, "deprecated": false, "children": [ @@ -3325,7 +3344,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 96 + "lineNumber": 115 }, "deprecated": false, "children": [ @@ -3341,7 +3360,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 96 + "lineNumber": 115 }, "deprecated": false, "isRequired": true @@ -3361,7 +3380,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 153 + "lineNumber": 182 }, "deprecated": false, "children": [], @@ -3379,7 +3398,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 187 + "lineNumber": 216 }, "deprecated": false, "children": [], @@ -3397,7 +3416,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 199 + "lineNumber": 228 }, "deprecated": false, "children": [ @@ -3413,7 +3432,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 199 + "lineNumber": 228 }, "deprecated": false, "isRequired": true @@ -3433,7 +3452,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 203 + "lineNumber": 232 }, "deprecated": false, "children": [ @@ -3449,7 +3468,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 203 + "lineNumber": 232 }, "deprecated": false, "isRequired": true @@ -3469,7 +3488,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 209 + "lineNumber": 238 }, "deprecated": false, "children": [], @@ -3487,7 +3506,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 251 + "lineNumber": 285 }, "deprecated": false, "children": [], @@ -3505,7 +3524,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx", - "lineNumber": 274 + "lineNumber": 308 }, "deprecated": false, "children": [], @@ -4708,7 +4727,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "lineNumber": 82 + "lineNumber": 142 }, "deprecated": false, "children": [ @@ -4733,7 +4752,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", - "lineNumber": 83 + "lineNumber": 143 }, "deprecated": false, "isRequired": true @@ -5555,7 +5574,9 @@ "section": "def-public.NotificationsStart", "text": "NotificationsStart" }, - "; SavedObjectFinder: React.ComponentType<any>; showCreateNewMenu?: boolean | undefined; }) => ", + "; SavedObjectFinder: React.ComponentType<any>; showCreateNewMenu?: boolean | undefined; reportUiCounter?: ((appName: string, type: ", + "UiCounterMetricType", + ", eventNames: string | string[], count?: number | undefined) => void) | undefined; }) => ", { "pluginId": "core", "scope": "public", @@ -5566,7 +5587,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "children": [ @@ -5579,7 +5600,7 @@ "description": [], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "children": [ @@ -5618,7 +5639,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 17 + "lineNumber": 18 }, "deprecated": false }, @@ -5692,7 +5713,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false, "returnComment": [], @@ -5774,7 +5795,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 19 + "lineNumber": 20 }, "deprecated": false, "returnComment": [], @@ -5798,7 +5819,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false }, @@ -5820,7 +5841,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false }, @@ -5836,7 +5857,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false }, @@ -5852,7 +5873,25 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", - "lineNumber": 23 + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "embeddable", + "id": "def-public.openAddPanelFlyout.$1.options.reportUiCounter", + "type": "Function", + "tags": [], + "label": "reportUiCounter", + "description": [], + "signature": [ + "((appName: string, type: ", + "UiCounterMetricType", + ", eventNames: string | string[], count?: number | undefined) => void) | undefined" + ], + "source": { + "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx", + "lineNumber": 25 }, "deprecated": false } @@ -5862,6 +5901,67 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "embeddable", + "id": "def-public.useEmbeddableFactory", + "type": "Function", + "tags": [], + "label": "useEmbeddableFactory", + "description": [], + "signature": [ + "({\n input,\n factory,\n onInputUpdated,\n}: EmbeddableRendererWithFactory<I>) => readonly [", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.ErrorEmbeddable", + "text": "ErrorEmbeddable" + }, + " | ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.IEmbeddable", + "text": "IEmbeddable" + }, + "<I, ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.EmbeddableOutput", + "text": "EmbeddableOutput" + }, + "> | undefined, boolean, string | undefined]" + ], + "source": { + "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", + "lineNumber": 43 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "embeddable", + "id": "def-public.useEmbeddableFactory.$1", + "type": "Object", + "tags": [], + "label": "{\n input,\n factory,\n onInputUpdated,\n}", + "description": [], + "signature": [ + "EmbeddableRendererWithFactory<I>" + ], + "source": { + "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_renderer.tsx", + "lineNumber": 43 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "embeddable", "id": "def-public.withEmbeddableSubscription", @@ -8923,7 +9023,7 @@ ], "source": { "path": "src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.ts", - "lineNumber": 17 + "lineNumber": 18 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 46a877be6ac243..28ae1645b7073f 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import embeddableObj from './embeddable.json'; @@ -19,7 +18,7 @@ import embeddableObj from './embeddable.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 449 | 4 | 379 | 3 | +| 453 | 4 | 383 | 3 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 8680c6807bbcaa..cbd087908e0073 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import embeddableEnhancedObj from './embeddable_enhanced.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index e152ec4aec9a85..02cbf225c355d4 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,12 +8,11 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import encryptedSavedObjectsObj from './encrypted_saved_objects.json'; +This plugin provides encryption and decryption utilities for saved objects containing sensitive information. - - +Contact [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 8156918dcefe49..7be4954e1e4167 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,12 +8,11 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import enterpriseSearchObj from './enterprise_search.json'; +Adds dashboards for discovering and managing Enterprise Search products - - +Contact [Enterprise Search](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/es_ui_shared.json b/api_docs/es_ui_shared.json index e7117e6be62a05..73cc06d346e971 100644 --- a/api_docs/es_ui_shared.json +++ b/api_docs/es_ui_shared.json @@ -278,7 +278,7 @@ ], "source": { "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx", - "lineNumber": 49 + "lineNumber": 47 }, "deprecated": false, "children": [ @@ -294,7 +294,7 @@ ], "source": { "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx", - "lineNumber": 49 + "lineNumber": 47 }, "deprecated": false, "isRequired": true @@ -415,6 +415,80 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "esUiShared", + "id": "def-public.PageError", + "type": "Function", + "tags": [], + "label": "PageError", + "description": [], + "signature": [ + "({ title, error, actions, isCentered, ...rest }: React.PropsWithChildren<Props>) => JSX.Element" + ], + "source": { + "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx", + "lineNumber": 28 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "esUiShared", + "id": "def-public.PageError.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n title,\n error,\n actions,\n isCentered,\n ...rest\n}", + "description": [], + "signature": [ + "React.PropsWithChildren<Props>" + ], + "source": { + "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/page_error.tsx", + "lineNumber": 28 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "esUiShared", + "id": "def-public.PageLoading", + "type": "Function", + "tags": [], + "label": "PageLoading", + "description": [], + "signature": [ + "({ children }: { children?: React.ReactNode; }) => JSX.Element" + ], + "source": { + "path": "src/plugins/es_ui_shared/public/components/page_loading/page_loading.tsx", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "esUiShared", + "id": "def-public.PageLoading.$1", + "type": "Object", + "tags": [], + "label": "{ children }", + "description": [], + "signature": [ + "{ children?: React.ReactNode; }" + ], + "source": { + "path": "src/plugins/es_ui_shared/public/components/page_loading/page_loading.tsx", + "lineNumber": 12 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "esUiShared", "id": "def-public.SectionError", @@ -427,7 +501,7 @@ ], "source": { "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", - "lineNumber": 24 + "lineNumber": 19 }, "deprecated": false, "children": [ @@ -443,7 +517,7 @@ ], "source": { "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", - "lineNumber": 24 + "lineNumber": 19 }, "deprecated": false, "isRequired": true @@ -591,7 +665,7 @@ ], "source": { "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx", - "lineNumber": 35 + "lineNumber": 33 }, "deprecated": false, "children": [], @@ -735,8 +809,8 @@ "label": "Error", "description": [], "source": { - "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", - "lineNumber": 12 + "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts", + "lineNumber": 18 }, "deprecated": false, "children": [ @@ -748,8 +822,8 @@ "label": "error", "description": [], "source": { - "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", - "lineNumber": 13 + "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts", + "lineNumber": 19 }, "deprecated": false }, @@ -764,8 +838,8 @@ "string[] | undefined" ], "source": { - "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", - "lineNumber": 14 + "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts", + "lineNumber": 20 }, "deprecated": false }, @@ -780,8 +854,8 @@ "string | undefined" ], "source": { - "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx", - "lineNumber": 15 + "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts", + "lineNumber": 21 }, "deprecated": false } @@ -1349,7 +1423,7 @@ ], "source": { "path": "src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx", - "lineNumber": 33 + "lineNumber": 31 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index e317299f0b48aa..0db5869f46abfb 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import esUiSharedObj from './es_ui_shared.json'; @@ -19,7 +18,7 @@ import esUiSharedObj from './es_ui_shared.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 88 | 4 | 86 | 1 | +| 92 | 4 | 90 | 1 | ## Client diff --git a/api_docs/event_log.json b/api_docs/event_log.json index 1d5605105c7c1a..c36b74d9490932 100644 --- a/api_docs/event_log.json +++ b/api_docs/event_log.json @@ -687,7 +687,7 @@ "label": "logEvent", "description": [], "signature": [ - "(properties: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => void" + "(properties: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => void" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", @@ -703,7 +703,7 @@ "label": "properties", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", @@ -723,7 +723,7 @@ "label": "startTiming", "description": [], "signature": [ - "(event: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => void" + "(event: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => void" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", @@ -739,7 +739,7 @@ "label": "event", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", @@ -759,7 +759,7 @@ "label": "stopTiming", "description": [], "signature": [ - "(event: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => void" + "(event: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => void" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", @@ -775,7 +775,7 @@ "label": "event", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", @@ -850,7 +850,7 @@ "label": "data", "description": [], "signature": [ - "(Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" + "(Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}> | undefined)[]" ], "source": { "path": "x-pack/plugins/event_log/server/es/cluster_client_adapter.ts", @@ -872,7 +872,7 @@ "label": "IEvent", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "source": { "path": "x-pack/plugins/event_log/generated/schemas.ts", @@ -889,7 +889,7 @@ "label": "IValidatedEvent", "description": [], "signature": [ - "Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}> | undefined" + "Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}> | undefined" ], "source": { "path": "x-pack/plugins/event_log/generated/schemas.ts", @@ -1171,7 +1171,7 @@ "label": "getLogger", "description": [], "signature": [ - "(properties: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => ", + "(properties: DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined) => ", { "pluginId": "eventLog", "scope": "server", @@ -1194,7 +1194,7 @@ "label": "properties", "description": [], "signature": [ - "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" + "DeepPartial<DeepWriteable<Readonly<{ kibana?: Readonly<{ saved_objects?: Readonly<{ type?: string | undefined; id?: string | undefined; rel?: string | undefined; namespace?: string | undefined; type_id?: string | undefined; } & {}>[] | undefined; alerting?: Readonly<{ status?: string | undefined; instance_id?: string | undefined; action_group_id?: string | undefined; action_subgroup?: string | undefined; } & {}> | undefined; server_uuid?: string | undefined; task?: Readonly<{ scheduled?: string | undefined; schedule_delay?: number | undefined; } & {}> | undefined; } & {}> | undefined; user?: Readonly<{ name?: string | undefined; } & {}> | undefined; error?: Readonly<{ type?: string | undefined; id?: string | undefined; message?: string | undefined; code?: string | undefined; stack_trace?: string | undefined; } & {}> | undefined; message?: string | undefined; tags?: string[] | undefined; event?: Readonly<{ start?: string | undefined; type?: string[] | undefined; id?: string | undefined; url?: string | undefined; end?: string | undefined; category?: string[] | undefined; code?: string | undefined; action?: string | undefined; kind?: string | undefined; original?: string | undefined; severity?: number | undefined; created?: string | undefined; dataset?: string | undefined; duration?: number | undefined; hash?: string | undefined; ingested?: string | undefined; module?: string | undefined; outcome?: string | undefined; provider?: string | undefined; reason?: string | undefined; reference?: string | undefined; risk_score?: number | undefined; risk_score_norm?: number | undefined; sequence?: number | undefined; timezone?: string | undefined; } & {}> | undefined; rule?: Readonly<{ description?: string | undefined; id?: string | undefined; name?: string | undefined; version?: string | undefined; license?: string | undefined; category?: string | undefined; reference?: string | undefined; author?: string[] | undefined; ruleset?: string | undefined; uuid?: string | undefined; } & {}> | undefined; '@timestamp'?: string | undefined; log?: Readonly<{ logger?: string | undefined; level?: string | undefined; } & {}> | undefined; ecs?: Readonly<{ version?: string | undefined; } & {}> | undefined; } & {}>>> | undefined" ], "source": { "path": "x-pack/plugins/event_log/server/types.ts", diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 409d6ad6d21c29..8929e1f586ebe9 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import eventLogObj from './event_log.json'; diff --git a/api_docs/expressions.json b/api_docs/expressions.json index 79a9d016df0710..1fbdfe4dc8f0be 100644 --- a/api_docs/expressions.json +++ b/api_docs/expressions.json @@ -999,7 +999,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 81 + "lineNumber": 80 }, "deprecated": false, "children": [ @@ -1031,7 +1031,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 83 + "lineNumber": 82 }, "deprecated": false, "children": [ @@ -1054,7 +1054,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 84 + "lineNumber": 83 }, "deprecated": false, "isRequired": false @@ -1105,7 +1105,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 92 + "lineNumber": 91 }, "deprecated": false }, @@ -1129,7 +1129,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 97 + "lineNumber": 96 }, "deprecated": true, "references": [] @@ -1154,7 +1154,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 102 + "lineNumber": 101 }, "deprecated": true, "references": [] @@ -1171,7 +1171,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "children": [ @@ -1194,7 +1194,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "isRequired": false @@ -1230,7 +1230,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 110 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -1261,7 +1261,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 111 + "lineNumber": 110 }, "deprecated": false, "isRequired": true @@ -1289,7 +1289,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "children": [ @@ -1305,7 +1305,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "isRequired": true @@ -1333,7 +1333,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 123 + "lineNumber": 122 }, "deprecated": false, "children": [], @@ -1367,7 +1367,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 127 + "lineNumber": 126 }, "deprecated": false, "children": [ @@ -1398,7 +1398,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 128 + "lineNumber": 127 }, "deprecated": false, "isRequired": true @@ -1426,7 +1426,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "children": [ @@ -1442,7 +1442,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "isRequired": true @@ -1470,7 +1470,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 140 + "lineNumber": 139 }, "deprecated": false, "children": [], @@ -1488,7 +1488,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 144 + "lineNumber": 143 }, "deprecated": false, "children": [ @@ -1504,7 +1504,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 144 + "lineNumber": 143 }, "deprecated": false, "isRequired": true @@ -1524,7 +1524,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 148 + "lineNumber": 147 }, "deprecated": false }, @@ -1584,7 +1584,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 160 + "lineNumber": 159 }, "deprecated": false, "children": [ @@ -1609,7 +1609,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 161 + "lineNumber": 160 }, "deprecated": false, "isRequired": true @@ -1628,7 +1628,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 162 + "lineNumber": 161 }, "deprecated": false, "isRequired": true @@ -1651,7 +1651,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 163 + "lineNumber": 162 }, "deprecated": false, "isRequired": true @@ -1703,7 +1703,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 168 + "lineNumber": 167 }, "deprecated": false, "children": [ @@ -1726,7 +1726,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 169 + "lineNumber": 168 }, "deprecated": false, "isRequired": true @@ -1749,7 +1749,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 170 + "lineNumber": 169 }, "deprecated": false, "isRequired": true @@ -1786,7 +1786,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -1808,7 +1808,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -1826,7 +1826,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -1864,7 +1864,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false, "children": [ @@ -1886,7 +1886,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false, "isRequired": true @@ -1914,7 +1914,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "children": [ @@ -1936,7 +1936,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "isRequired": true @@ -1953,7 +1953,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "isRequired": true @@ -1988,7 +1988,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "children": [ @@ -2010,7 +2010,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "isRequired": true @@ -2027,7 +2027,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "isRequired": true @@ -2055,7 +2055,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "children": [], @@ -3655,7 +3655,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 32 + "lineNumber": 38 }, "deprecated": false, "children": [ @@ -3671,7 +3671,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 35 + "lineNumber": 41 }, "deprecated": false, "children": [ @@ -3694,7 +3694,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 35 + "lineNumber": 41 }, "deprecated": false, "isRequired": true @@ -3730,7 +3730,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 45 + "lineNumber": 51 }, "deprecated": false, "children": [ @@ -3753,7 +3753,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 45 + "lineNumber": 51 }, "deprecated": false, "isRequired": true @@ -3788,7 +3788,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 59 + "lineNumber": 65 }, "deprecated": false, "children": [ @@ -3810,7 +3810,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 59 + "lineNumber": 65 }, "deprecated": false, "isRequired": true @@ -3830,7 +3830,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 75 + "lineNumber": 81 }, "deprecated": false, "children": [], @@ -3882,7 +3882,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 32 + "lineNumber": 38 }, "deprecated": false, "children": [ @@ -3898,7 +3898,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 35 + "lineNumber": 41 }, "deprecated": false, "children": [ @@ -3921,7 +3921,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 35 + "lineNumber": 41 }, "deprecated": false, "isRequired": true @@ -3957,7 +3957,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 45 + "lineNumber": 51 }, "deprecated": false, "children": [ @@ -3980,7 +3980,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 45 + "lineNumber": 51 }, "deprecated": false, "isRequired": true @@ -4015,7 +4015,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 59 + "lineNumber": 65 }, "deprecated": false, "children": [ @@ -4037,7 +4037,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 59 + "lineNumber": 65 }, "deprecated": false, "isRequired": true @@ -4057,7 +4057,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 75 + "lineNumber": 81 }, "deprecated": false, "children": [], @@ -4103,7 +4103,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 175 + "lineNumber": 189 }, "deprecated": false, "children": [ @@ -4126,7 +4126,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 176 + "lineNumber": 190 }, "deprecated": false }, @@ -4148,7 +4148,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 177 + "lineNumber": 191 }, "deprecated": false }, @@ -4164,7 +4164,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 179 + "lineNumber": 193 }, "deprecated": false, "children": [ @@ -4186,7 +4186,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 179 + "lineNumber": 193 }, "deprecated": false, "isRequired": true @@ -4224,7 +4224,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 219 + "lineNumber": 233 }, "deprecated": false, "children": [ @@ -4255,7 +4255,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 220 + "lineNumber": 234 }, "deprecated": false, "isRequired": true @@ -4291,7 +4291,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 223 + "lineNumber": 237 }, "deprecated": false, "children": [ @@ -4322,7 +4322,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 224 + "lineNumber": 238 }, "deprecated": false, "isRequired": true @@ -4358,7 +4358,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 227 + "lineNumber": 241 }, "deprecated": false, "children": [ @@ -4389,7 +4389,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 228 + "lineNumber": 242 }, "deprecated": false, "isRequired": true @@ -4425,7 +4425,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "children": [ @@ -4448,7 +4448,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "isRequired": true @@ -4465,7 +4465,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "isRequired": true @@ -4489,7 +4489,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "isRequired": false @@ -4517,7 +4517,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 234 + "lineNumber": 248 }, "deprecated": false, "children": [ @@ -4533,7 +4533,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 234 + "lineNumber": 248 }, "deprecated": false, "isRequired": true @@ -4563,7 +4563,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 241 + "lineNumber": 255 }, "deprecated": false, "children": [], @@ -4589,7 +4589,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 244 + "lineNumber": 258 }, "deprecated": false, "children": [ @@ -4605,7 +4605,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 244 + "lineNumber": 258 }, "deprecated": false, "isRequired": true @@ -4635,7 +4635,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 251 + "lineNumber": 265 }, "deprecated": false, "children": [], @@ -4661,7 +4661,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 254 + "lineNumber": 268 }, "deprecated": false, "children": [ @@ -4677,7 +4677,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 254 + "lineNumber": 268 }, "deprecated": false, "isRequired": true @@ -4707,7 +4707,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 261 + "lineNumber": 275 }, "deprecated": false, "children": [], @@ -4749,7 +4749,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 263 + "lineNumber": 277 }, "deprecated": false, "returnComment": [], @@ -4773,7 +4773,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 133 + "lineNumber": 147 }, "deprecated": false }, @@ -4789,7 +4789,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 135 + "lineNumber": 149 }, "deprecated": false }, @@ -4812,7 +4812,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 136 + "lineNumber": 150 }, "deprecated": false } @@ -4837,7 +4837,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 269 + "lineNumber": 283 }, "deprecated": false, "children": [], @@ -4865,7 +4865,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 281 + "lineNumber": 295 }, "deprecated": false, "children": [ @@ -4889,7 +4889,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 282 + "lineNumber": 296 }, "deprecated": false, "isRequired": true @@ -4906,7 +4906,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 283 + "lineNumber": 297 }, "deprecated": false, "isRequired": true @@ -4946,7 +4946,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 293 + "lineNumber": 307 }, "deprecated": false, "children": [ @@ -4970,7 +4970,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 293 + "lineNumber": 307 }, "deprecated": false, "isRequired": true @@ -5011,7 +5011,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 303 + "lineNumber": 317 }, "deprecated": false, "children": [ @@ -5035,7 +5035,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 303 + "lineNumber": 317 }, "deprecated": false, "isRequired": true @@ -5055,7 +5055,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 303 + "lineNumber": 317 }, "deprecated": false, "isRequired": true @@ -5094,7 +5094,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 313 + "lineNumber": 327 }, "deprecated": false, "children": [ @@ -5118,7 +5118,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 313 + "lineNumber": 327 }, "deprecated": false, "isRequired": true @@ -5137,7 +5137,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 313 + "lineNumber": 327 }, "deprecated": false, "isRequired": true @@ -5157,7 +5157,7 @@ "\nReturns Kibana Platform *setup* life-cycle contract. Useful to return the\nsame contract on server-side and browser-side." ], "signature": [ - "() => Pick<", + "(...args: unknown[]) => Pick<", { "pluginId": "expressions", "scope": "common", @@ -5169,10 +5169,28 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 321 + "lineNumber": 335 }, "deprecated": false, - "children": [], + "children": [ + { + "parentPluginId": "expressions", + "id": "def-public.ExpressionsService.setup.$1", + "type": "Array", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "unknown[]" + ], + "source": { + "path": "src/plugins/expressions/common/service/expressions_services.ts", + "lineNumber": 335 + }, + "deprecated": false, + "isRequired": true + } + ], "returnComment": [] }, { @@ -5185,7 +5203,7 @@ "\nReturns Kibana Platform *start* life-cycle contract. Useful to return the\nsame contract on server-side and browser-side." ], "signature": [ - "() => ", + "(...args: unknown[]) => ", { "pluginId": "expressions", "scope": "common", @@ -5196,10 +5214,28 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 329 + "lineNumber": 360 }, "deprecated": false, - "children": [], + "children": [ + { + "parentPluginId": "expressions", + "id": "def-public.ExpressionsService.start.$1", + "type": "Array", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "unknown[]" + ], + "source": { + "path": "src/plugins/expressions/common/service/expressions_services.ts", + "lineNumber": 360 + }, + "deprecated": false, + "isRequired": true + } + ], "returnComment": [] }, { @@ -5214,7 +5250,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 333 + "lineNumber": 364 }, "deprecated": false, "children": [], @@ -5746,7 +5782,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false, "children": [ @@ -5762,7 +5798,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false, "children": [ @@ -5785,7 +5821,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false, "isRequired": true @@ -5821,7 +5857,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 62 + "lineNumber": 61 }, "deprecated": false, "children": [ @@ -5852,7 +5888,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 63 + "lineNumber": 62 }, "deprecated": false, "isRequired": true @@ -5880,7 +5916,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false, "children": [ @@ -5896,7 +5932,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false, "isRequired": true @@ -5924,7 +5960,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 72 + "lineNumber": 71 }, "deprecated": false, "children": [], @@ -5950,7 +5986,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": false, "children": [], @@ -6111,7 +6147,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 37 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -6127,7 +6163,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 38 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -6150,7 +6186,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 38 + "lineNumber": 37 }, "deprecated": false, "isRequired": true @@ -6186,7 +6222,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 40 + "lineNumber": 39 }, "deprecated": false, "children": [ @@ -6217,7 +6253,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 41 + "lineNumber": 40 }, "deprecated": false, "isRequired": true @@ -6245,7 +6281,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "children": [ @@ -6261,7 +6297,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "isRequired": true @@ -6289,7 +6325,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 50 + "lineNumber": 49 }, "deprecated": false, "children": [], @@ -6315,7 +6351,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 54 + "lineNumber": 53 }, "deprecated": false, "children": [], @@ -8241,7 +8277,11 @@ "section": "def-common.KnownTypeToString", "text": "KnownTypeToString" }, - "<", + "<Output extends ", + "ObservableLike", + "<any> ? ", + "UnwrapObservable", + "<Output> : ", "UnwrapPromiseOrReturn", "<Output>> | undefined" ], @@ -8479,27 +8519,6 @@ "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts", "lineNumber": 32 } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/escount.ts", - "lineNumber": 33 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/esdocs.ts", - "lineNumber": 36 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/essql.ts", - "lineNumber": 32 - } } ] } @@ -8799,6 +8818,71 @@ }, "deprecated": false }, + { + "parentPluginId": "expressions", + "id": "def-public.ExpressionFunctionDefinitions.overall_metric", + "type": "Object", + "tags": [], + "label": "overall_metric", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"overall_metric\", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.OverallMetricArgs", + "text": "OverallMetricArgs" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/types.ts", + "lineNumber": 123 + }, + "deprecated": false + }, { "parentPluginId": "expressions", "id": "def-public.ExpressionFunctionDefinitions.derivative", @@ -8860,7 +8944,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/types.ts", - "lineNumber": 123 + "lineNumber": 124 }, "deprecated": false }, @@ -8925,7 +9009,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/types.ts", - "lineNumber": 124 + "lineNumber": 125 }, "deprecated": false } @@ -9297,7 +9381,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 72 + "lineNumber": 86 }, "deprecated": false, "children": [ @@ -9323,7 +9407,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 79 + "lineNumber": 93 }, "deprecated": false, "returnComment": [], @@ -9337,7 +9421,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 79 + "lineNumber": 93 }, "deprecated": false } @@ -9365,7 +9449,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 87 + "lineNumber": 101 }, "deprecated": false, "returnComment": [], @@ -9379,7 +9463,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 87 + "lineNumber": 101 }, "deprecated": false } @@ -9407,7 +9491,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 95 + "lineNumber": 109 }, "deprecated": false, "returnComment": [], @@ -9421,7 +9505,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 95 + "lineNumber": 109 }, "deprecated": false } @@ -9457,7 +9541,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 121 + "lineNumber": 135 }, "deprecated": false, "returnComment": [], @@ -9481,7 +9565,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 122 + "lineNumber": 136 }, "deprecated": false }, @@ -9497,7 +9581,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 123 + "lineNumber": 137 }, "deprecated": false }, @@ -9520,7 +9604,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 124 + "lineNumber": 138 }, "deprecated": false } @@ -9564,7 +9648,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 132 + "lineNumber": 146 }, "deprecated": false, "returnComment": [], @@ -9588,7 +9672,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 133 + "lineNumber": 147 }, "deprecated": false }, @@ -9604,7 +9688,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 135 + "lineNumber": 149 }, "deprecated": false }, @@ -9627,7 +9711,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 136 + "lineNumber": 150 }, "deprecated": false } @@ -9654,7 +9738,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 148 + "lineNumber": 162 }, "deprecated": false, "returnComment": [], @@ -11370,16 +11454,16 @@ "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionAstFunction", - "text": "ExpressionAstFunction" + "section": "def-common.ExpressionAstExpression", + "text": "ExpressionAstExpression" }, " | ", { "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionAstExpression", - "text": "ExpressionAstExpression" + "section": "def-common.ExpressionAstFunction", + "text": "ExpressionAstFunction" } ], "source": { @@ -12081,7 +12165,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 19 + "lineNumber": 25 }, "deprecated": false, "lifecycle": "setup", @@ -12115,7 +12199,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 24 + "lineNumber": 30 }, "deprecated": false, "children": [ @@ -12132,7 +12216,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 25 + "lineNumber": 31 }, "deprecated": false }, @@ -12155,7 +12239,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 26 + "lineNumber": 32 }, "deprecated": false }, @@ -12188,7 +12272,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 27 + "lineNumber": 33 }, "deprecated": false, "returnComment": [], @@ -12276,7 +12360,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 28 + "lineNumber": 34 }, "deprecated": false, "returnComment": [], @@ -12326,7 +12410,7 @@ ], "source": { "path": "src/plugins/expressions/public/plugin.ts", - "lineNumber": 29 + "lineNumber": 35 }, "deprecated": false, "returnComment": [], @@ -13171,7 +13255,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 81 + "lineNumber": 80 }, "deprecated": false, "children": [ @@ -13203,7 +13287,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 83 + "lineNumber": 82 }, "deprecated": false, "children": [ @@ -13226,7 +13310,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 84 + "lineNumber": 83 }, "deprecated": false, "isRequired": false @@ -13277,7 +13361,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 92 + "lineNumber": 91 }, "deprecated": false }, @@ -13301,7 +13385,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 97 + "lineNumber": 96 }, "deprecated": true, "references": [] @@ -13326,7 +13410,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 102 + "lineNumber": 101 }, "deprecated": true, "references": [] @@ -13343,7 +13427,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "children": [ @@ -13366,7 +13450,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "isRequired": false @@ -13402,7 +13486,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 110 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -13433,7 +13517,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 111 + "lineNumber": 110 }, "deprecated": false, "isRequired": true @@ -13461,7 +13545,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "children": [ @@ -13477,7 +13561,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "isRequired": true @@ -13505,7 +13589,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 123 + "lineNumber": 122 }, "deprecated": false, "children": [], @@ -13539,7 +13623,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 127 + "lineNumber": 126 }, "deprecated": false, "children": [ @@ -13570,7 +13654,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 128 + "lineNumber": 127 }, "deprecated": false, "isRequired": true @@ -13598,7 +13682,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "children": [ @@ -13614,7 +13698,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "isRequired": true @@ -13642,7 +13726,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 140 + "lineNumber": 139 }, "deprecated": false, "children": [], @@ -13660,7 +13744,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 144 + "lineNumber": 143 }, "deprecated": false, "children": [ @@ -13676,7 +13760,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 144 + "lineNumber": 143 }, "deprecated": false, "isRequired": true @@ -13696,7 +13780,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 148 + "lineNumber": 147 }, "deprecated": false }, @@ -13756,7 +13840,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 160 + "lineNumber": 159 }, "deprecated": false, "children": [ @@ -13781,7 +13865,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 161 + "lineNumber": 160 }, "deprecated": false, "isRequired": true @@ -13800,7 +13884,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 162 + "lineNumber": 161 }, "deprecated": false, "isRequired": true @@ -13823,7 +13907,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 163 + "lineNumber": 162 }, "deprecated": false, "isRequired": true @@ -13875,7 +13959,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 168 + "lineNumber": 167 }, "deprecated": false, "children": [ @@ -13898,7 +13982,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 169 + "lineNumber": 168 }, "deprecated": false, "isRequired": true @@ -13921,7 +14005,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 170 + "lineNumber": 169 }, "deprecated": false, "isRequired": true @@ -13958,7 +14042,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -13980,7 +14064,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -13998,7 +14082,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -14036,7 +14120,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false, "children": [ @@ -14058,7 +14142,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false, "isRequired": true @@ -14086,7 +14170,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "children": [ @@ -14108,7 +14192,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "isRequired": true @@ -14125,7 +14209,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "isRequired": true @@ -14160,7 +14244,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "children": [ @@ -14182,7 +14266,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "isRequired": true @@ -14199,7 +14283,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "isRequired": true @@ -14227,7 +14311,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "children": [], @@ -15482,7 +15566,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "children": [ @@ -15504,7 +15588,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false }, @@ -15520,7 +15604,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false, "children": [ @@ -15543,7 +15627,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false, "isRequired": true @@ -15579,7 +15663,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false, "children": [ @@ -15602,7 +15686,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false, "isRequired": true @@ -15637,7 +15721,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false, "children": [ @@ -15659,7 +15743,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false, "isRequired": true @@ -15679,7 +15763,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 38 + "lineNumber": 39 }, "deprecated": false, "children": [], @@ -15731,7 +15815,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "children": [ @@ -15753,7 +15837,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false }, @@ -15769,7 +15853,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false, "children": [ @@ -15792,7 +15876,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false, "isRequired": true @@ -15828,7 +15912,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false, "children": [ @@ -15851,7 +15935,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false, "isRequired": true @@ -15886,7 +15970,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false, "children": [ @@ -15908,7 +15992,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false, "isRequired": true @@ -15928,7 +16012,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 38 + "lineNumber": 39 }, "deprecated": false, "children": [], @@ -16460,7 +16544,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false, "children": [ @@ -16476,7 +16560,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false, "children": [ @@ -16499,7 +16583,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false, "isRequired": true @@ -16535,7 +16619,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 62 + "lineNumber": 61 }, "deprecated": false, "children": [ @@ -16566,7 +16650,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 63 + "lineNumber": 62 }, "deprecated": false, "isRequired": true @@ -16594,7 +16678,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false, "children": [ @@ -16610,7 +16694,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false, "isRequired": true @@ -16638,7 +16722,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 72 + "lineNumber": 71 }, "deprecated": false, "children": [], @@ -16664,7 +16748,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": false, "children": [], @@ -16708,7 +16792,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 37 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -16724,7 +16808,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 38 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -16747,7 +16831,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 38 + "lineNumber": 37 }, "deprecated": false, "isRequired": true @@ -16783,7 +16867,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 40 + "lineNumber": 39 }, "deprecated": false, "children": [ @@ -16814,7 +16898,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 41 + "lineNumber": 40 }, "deprecated": false, "isRequired": true @@ -16842,7 +16926,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "children": [ @@ -16858,7 +16942,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "isRequired": true @@ -16886,7 +16970,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 50 + "lineNumber": 49 }, "deprecated": false, "children": [], @@ -16912,7 +16996,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 54 + "lineNumber": 53 }, "deprecated": false, "children": [], @@ -18752,7 +18836,11 @@ "section": "def-common.KnownTypeToString", "text": "KnownTypeToString" }, - "<", + "<Output extends ", + "ObservableLike", + "<any> ? ", + "UnwrapObservable", + "<Output> : ", "UnwrapPromiseOrReturn", "<Output>> | undefined" ], @@ -18990,27 +19078,6 @@ "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts", "lineNumber": 32 } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/escount.ts", - "lineNumber": 33 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/esdocs.ts", - "lineNumber": 36 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/essql.ts", - "lineNumber": 32 - } } ] } @@ -19310,6 +19377,71 @@ }, "deprecated": false }, + { + "parentPluginId": "expressions", + "id": "def-server.ExpressionFunctionDefinitions.overall_metric", + "type": "Object", + "tags": [], + "label": "overall_metric", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"overall_metric\", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.OverallMetricArgs", + "text": "OverallMetricArgs" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/types.ts", + "lineNumber": 123 + }, + "deprecated": false + }, { "parentPluginId": "expressions", "id": "def-server.ExpressionFunctionDefinitions.derivative", @@ -19371,7 +19503,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/types.ts", - "lineNumber": 123 + "lineNumber": 124 }, "deprecated": false }, @@ -19436,7 +19568,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/types.ts", - "lineNumber": 124 + "lineNumber": 125 }, "deprecated": false } @@ -20941,16 +21073,16 @@ "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionAstFunction", - "text": "ExpressionAstFunction" + "section": "def-common.ExpressionAstExpression", + "text": "ExpressionAstExpression" }, " | ", { "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionAstExpression", - "text": "ExpressionAstExpression" + "section": "def-common.ExpressionAstFunction", + "text": "ExpressionAstFunction" } ], "source": { @@ -21592,7 +21724,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 12 + "lineNumber": 13 }, "deprecated": false, "lifecycle": "setup", @@ -21616,7 +21748,7 @@ ], "source": { "path": "src/plugins/expressions/server/plugin.ts", - "lineNumber": 14 + "lineNumber": 15 }, "deprecated": false, "lifecycle": "start", @@ -22622,7 +22754,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 81 + "lineNumber": 80 }, "deprecated": false, "children": [ @@ -22654,7 +22786,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 83 + "lineNumber": 82 }, "deprecated": false, "children": [ @@ -22677,7 +22809,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 84 + "lineNumber": 83 }, "deprecated": false, "isRequired": false @@ -22728,7 +22860,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 92 + "lineNumber": 91 }, "deprecated": false }, @@ -22752,7 +22884,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 97 + "lineNumber": 96 }, "deprecated": true, "references": [] @@ -22777,7 +22909,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 102 + "lineNumber": 101 }, "deprecated": true, "references": [] @@ -22794,7 +22926,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "children": [ @@ -22817,7 +22949,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 104 + "lineNumber": 103 }, "deprecated": false, "isRequired": false @@ -22853,7 +22985,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 110 + "lineNumber": 109 }, "deprecated": false, "children": [ @@ -22884,7 +23016,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 111 + "lineNumber": 110 }, "deprecated": false, "isRequired": true @@ -22912,7 +23044,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "children": [ @@ -22928,7 +23060,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 119 + "lineNumber": 118 }, "deprecated": false, "isRequired": true @@ -22956,7 +23088,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 123 + "lineNumber": 122 }, "deprecated": false, "children": [], @@ -22990,7 +23122,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 127 + "lineNumber": 126 }, "deprecated": false, "children": [ @@ -23021,7 +23153,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 128 + "lineNumber": 127 }, "deprecated": false, "isRequired": true @@ -23049,7 +23181,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "children": [ @@ -23065,7 +23197,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 136 + "lineNumber": 135 }, "deprecated": false, "isRequired": true @@ -23093,7 +23225,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 140 + "lineNumber": 139 }, "deprecated": false, "children": [], @@ -23111,7 +23243,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 144 + "lineNumber": 143 }, "deprecated": false, "children": [ @@ -23127,7 +23259,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 144 + "lineNumber": 143 }, "deprecated": false, "isRequired": true @@ -23147,7 +23279,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 148 + "lineNumber": 147 }, "deprecated": false }, @@ -23207,7 +23339,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 160 + "lineNumber": 159 }, "deprecated": false, "children": [ @@ -23232,7 +23364,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 161 + "lineNumber": 160 }, "deprecated": false, "isRequired": true @@ -23251,7 +23383,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 162 + "lineNumber": 161 }, "deprecated": false, "isRequired": true @@ -23274,7 +23406,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 163 + "lineNumber": 162 }, "deprecated": false, "isRequired": true @@ -23326,7 +23458,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 168 + "lineNumber": 167 }, "deprecated": false, "children": [ @@ -23349,7 +23481,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 169 + "lineNumber": 168 }, "deprecated": false, "isRequired": true @@ -23372,7 +23504,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 170 + "lineNumber": 169 }, "deprecated": false, "isRequired": true @@ -23409,7 +23541,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "children": [ @@ -23431,7 +23563,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -23449,7 +23581,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 216 + "lineNumber": 215 }, "deprecated": false, "isRequired": true @@ -23487,7 +23619,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false, "children": [ @@ -23509,7 +23641,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 229 + "lineNumber": 228 }, "deprecated": false, "isRequired": true @@ -23537,7 +23669,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "children": [ @@ -23559,7 +23691,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "isRequired": true @@ -23576,7 +23708,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 240 + "lineNumber": 239 }, "deprecated": false, "isRequired": true @@ -23611,7 +23743,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "children": [ @@ -23633,7 +23765,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "isRequired": true @@ -23650,7 +23782,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 248 + "lineNumber": 247 }, "deprecated": false, "isRequired": true @@ -23678,7 +23810,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 257 + "lineNumber": 256 }, "deprecated": false, "children": [], @@ -25005,7 +25137,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 175 + "lineNumber": 189 }, "deprecated": false, "children": [ @@ -25028,7 +25160,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 176 + "lineNumber": 190 }, "deprecated": false }, @@ -25050,7 +25182,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 177 + "lineNumber": 191 }, "deprecated": false }, @@ -25066,7 +25198,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 179 + "lineNumber": 193 }, "deprecated": false, "children": [ @@ -25088,7 +25220,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 179 + "lineNumber": 193 }, "deprecated": false, "isRequired": true @@ -25126,7 +25258,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 219 + "lineNumber": 233 }, "deprecated": false, "children": [ @@ -25157,7 +25289,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 220 + "lineNumber": 234 }, "deprecated": false, "isRequired": true @@ -25193,7 +25325,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 223 + "lineNumber": 237 }, "deprecated": false, "children": [ @@ -25224,7 +25356,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 224 + "lineNumber": 238 }, "deprecated": false, "isRequired": true @@ -25260,7 +25392,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 227 + "lineNumber": 241 }, "deprecated": false, "children": [ @@ -25291,7 +25423,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 228 + "lineNumber": 242 }, "deprecated": false, "isRequired": true @@ -25327,7 +25459,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "children": [ @@ -25350,7 +25482,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "isRequired": true @@ -25367,7 +25499,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "isRequired": true @@ -25391,7 +25523,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 231 + "lineNumber": 245 }, "deprecated": false, "isRequired": false @@ -25419,7 +25551,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 234 + "lineNumber": 248 }, "deprecated": false, "children": [ @@ -25435,7 +25567,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 234 + "lineNumber": 248 }, "deprecated": false, "isRequired": true @@ -25465,7 +25597,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 241 + "lineNumber": 255 }, "deprecated": false, "children": [], @@ -25491,7 +25623,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 244 + "lineNumber": 258 }, "deprecated": false, "children": [ @@ -25507,7 +25639,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 244 + "lineNumber": 258 }, "deprecated": false, "isRequired": true @@ -25537,7 +25669,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 251 + "lineNumber": 265 }, "deprecated": false, "children": [], @@ -25563,7 +25695,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 254 + "lineNumber": 268 }, "deprecated": false, "children": [ @@ -25579,7 +25711,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 254 + "lineNumber": 268 }, "deprecated": false, "isRequired": true @@ -25609,7 +25741,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 261 + "lineNumber": 275 }, "deprecated": false, "children": [], @@ -25651,7 +25783,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 263 + "lineNumber": 277 }, "deprecated": false, "returnComment": [], @@ -25675,7 +25807,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 133 + "lineNumber": 147 }, "deprecated": false }, @@ -25691,7 +25823,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 135 + "lineNumber": 149 }, "deprecated": false }, @@ -25714,7 +25846,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 136 + "lineNumber": 150 }, "deprecated": false } @@ -25739,7 +25871,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 269 + "lineNumber": 283 }, "deprecated": false, "children": [], @@ -25767,7 +25899,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 281 + "lineNumber": 295 }, "deprecated": false, "children": [ @@ -25791,7 +25923,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 282 + "lineNumber": 296 }, "deprecated": false, "isRequired": true @@ -25808,7 +25940,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 283 + "lineNumber": 297 }, "deprecated": false, "isRequired": true @@ -25848,7 +25980,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 293 + "lineNumber": 307 }, "deprecated": false, "children": [ @@ -25872,7 +26004,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 293 + "lineNumber": 307 }, "deprecated": false, "isRequired": true @@ -25913,7 +26045,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 303 + "lineNumber": 317 }, "deprecated": false, "children": [ @@ -25937,7 +26069,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 303 + "lineNumber": 317 }, "deprecated": false, "isRequired": true @@ -25957,7 +26089,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 303 + "lineNumber": 317 }, "deprecated": false, "isRequired": true @@ -25996,7 +26128,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 313 + "lineNumber": 327 }, "deprecated": false, "children": [ @@ -26020,7 +26152,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 313 + "lineNumber": 327 }, "deprecated": false, "isRequired": true @@ -26039,7 +26171,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 313 + "lineNumber": 327 }, "deprecated": false, "isRequired": true @@ -26059,7 +26191,7 @@ "\nReturns Kibana Platform *setup* life-cycle contract. Useful to return the\nsame contract on server-side and browser-side." ], "signature": [ - "() => Pick<", + "(...args: unknown[]) => Pick<", { "pluginId": "expressions", "scope": "common", @@ -26071,10 +26203,28 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 321 + "lineNumber": 335 }, "deprecated": false, - "children": [], + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.ExpressionsService.setup.$1", + "type": "Array", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "unknown[]" + ], + "source": { + "path": "src/plugins/expressions/common/service/expressions_services.ts", + "lineNumber": 335 + }, + "deprecated": false, + "isRequired": true + } + ], "returnComment": [] }, { @@ -26087,7 +26237,7 @@ "\nReturns Kibana Platform *start* life-cycle contract. Useful to return the\nsame contract on server-side and browser-side." ], "signature": [ - "() => ", + "(...args: unknown[]) => ", { "pluginId": "expressions", "scope": "common", @@ -26098,10 +26248,28 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 329 + "lineNumber": 360 }, "deprecated": false, - "children": [], + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.ExpressionsService.start.$1", + "type": "Array", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "unknown[]" + ], + "source": { + "path": "src/plugins/expressions/common/service/expressions_services.ts", + "lineNumber": 360 + }, + "deprecated": false, + "isRequired": true + } + ], "returnComment": [] }, { @@ -26116,7 +26284,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 333 + "lineNumber": 364 }, "deprecated": false, "children": [], @@ -26648,7 +26816,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false, "children": [ @@ -26664,7 +26832,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false, "children": [ @@ -26687,7 +26855,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 60 + "lineNumber": 59 }, "deprecated": false, "isRequired": true @@ -26723,7 +26891,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 62 + "lineNumber": 61 }, "deprecated": false, "children": [ @@ -26754,7 +26922,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 63 + "lineNumber": 62 }, "deprecated": false, "isRequired": true @@ -26782,7 +26950,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false, "children": [ @@ -26798,7 +26966,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 68 + "lineNumber": 67 }, "deprecated": false, "isRequired": true @@ -26826,7 +26994,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 72 + "lineNumber": 71 }, "deprecated": false, "children": [], @@ -26852,7 +27020,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": false, "children": [], @@ -27013,7 +27181,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 37 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -27029,7 +27197,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 38 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -27052,7 +27220,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 38 + "lineNumber": 37 }, "deprecated": false, "isRequired": true @@ -27088,7 +27256,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 40 + "lineNumber": 39 }, "deprecated": false, "children": [ @@ -27119,7 +27287,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 41 + "lineNumber": 40 }, "deprecated": false, "isRequired": true @@ -27147,7 +27315,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "children": [ @@ -27163,7 +27331,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 46 + "lineNumber": 45 }, "deprecated": false, "isRequired": true @@ -27191,7 +27359,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 50 + "lineNumber": 49 }, "deprecated": false, "children": [], @@ -27217,7 +27385,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 54 + "lineNumber": 53 }, "deprecated": false, "children": [], @@ -28102,6 +28270,50 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.getUiSettingFn", + "type": "Function", + "tags": [], + "label": "getUiSettingFn", + "description": [], + "signature": [ + "({\n getStartDependencies,\n}: UiSettingFnArguments) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionUiSetting", + "text": "ExpressionFunctionUiSetting" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/ui_setting.ts", + "lineNumber": 39 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.getUiSettingFn.$1", + "type": "Object", + "tags": [], + "label": "{\n getStartDependencies,\n}", + "description": [], + "signature": [ + "UiSettingFnArguments" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/ui_setting.ts", + "lineNumber": 39 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.isDatatable", @@ -31030,7 +31242,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 28 + "lineNumber": 27 }, "deprecated": false, "children": [ @@ -31048,7 +31260,7 @@ ], "source": { "path": "src/plugins/expressions/common/executor/executor.ts", - "lineNumber": 34 + "lineNumber": 33 }, "deprecated": false } @@ -31064,7 +31276,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 42 + "lineNumber": 56 }, "deprecated": false, "children": [ @@ -31087,7 +31299,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 43 + "lineNumber": 57 }, "deprecated": false }, @@ -31103,7 +31315,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 45 + "lineNumber": 59 }, "deprecated": false }, @@ -31121,7 +31333,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 52 + "lineNumber": 66 }, "deprecated": false }, @@ -31146,7 +31358,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 59 + "lineNumber": 73 }, "deprecated": false }, @@ -31162,7 +31374,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 61 + "lineNumber": 75 }, "deprecated": false }, @@ -31178,7 +31390,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 63 + "lineNumber": 77 }, "deprecated": false }, @@ -31201,7 +31413,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 65 + "lineNumber": 79 }, "deprecated": false } @@ -31303,7 +31515,11 @@ "section": "def-common.KnownTypeToString", "text": "KnownTypeToString" }, - "<", + "<Output extends ", + "ObservableLike", + "<any> ? ", + "UnwrapObservable", + "<Output> : ", "UnwrapPromiseOrReturn", "<Output>> | undefined" ], @@ -31541,27 +31757,6 @@ "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts", "lineNumber": 32 } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/escount.ts", - "lineNumber": 33 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/esdocs.ts", - "lineNumber": 36 - } - }, - { - "plugin": "canvas", - "link": { - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/essql.ts", - "lineNumber": 32 - } } ] } @@ -31861,6 +32056,71 @@ }, "deprecated": false }, + { + "parentPluginId": "expressions", + "id": "def-common.ExpressionFunctionDefinitions.overall_metric", + "type": "Object", + "tags": [], + "label": "overall_metric", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"overall_metric\", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.OverallMetricArgs", + "text": "OverallMetricArgs" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/types.ts", + "lineNumber": 123 + }, + "deprecated": false + }, { "parentPluginId": "expressions", "id": "def-common.ExpressionFunctionDefinitions.derivative", @@ -31922,7 +32182,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/types.ts", - "lineNumber": 123 + "lineNumber": 124 }, "deprecated": false }, @@ -31987,7 +32247,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/types.ts", - "lineNumber": 124 + "lineNumber": 125 }, "deprecated": false } @@ -32254,7 +32514,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 151 + "lineNumber": 165 }, "deprecated": false, "children": [ @@ -32277,7 +32537,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 152 + "lineNumber": 166 }, "deprecated": false }, @@ -32300,7 +32560,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 153 + "lineNumber": 167 }, "deprecated": false } @@ -32318,7 +32578,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 72 + "lineNumber": 86 }, "deprecated": false, "children": [ @@ -32344,7 +32604,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 79 + "lineNumber": 93 }, "deprecated": false, "returnComment": [], @@ -32358,7 +32618,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 79 + "lineNumber": 93 }, "deprecated": false } @@ -32386,7 +32646,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 87 + "lineNumber": 101 }, "deprecated": false, "returnComment": [], @@ -32400,7 +32660,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 87 + "lineNumber": 101 }, "deprecated": false } @@ -32428,7 +32688,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 95 + "lineNumber": 109 }, "deprecated": false, "returnComment": [], @@ -32442,7 +32702,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 95 + "lineNumber": 109 }, "deprecated": false } @@ -32478,7 +32738,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 121 + "lineNumber": 135 }, "deprecated": false, "returnComment": [], @@ -32502,7 +32762,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 122 + "lineNumber": 136 }, "deprecated": false }, @@ -32518,7 +32778,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 123 + "lineNumber": 137 }, "deprecated": false }, @@ -32541,7 +32801,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 124 + "lineNumber": 138 }, "deprecated": false } @@ -32585,7 +32845,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 132 + "lineNumber": 146 }, "deprecated": false, "returnComment": [], @@ -32609,7 +32869,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 133 + "lineNumber": 147 }, "deprecated": false }, @@ -32625,7 +32885,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 135 + "lineNumber": 149 }, "deprecated": false }, @@ -32648,7 +32908,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 136 + "lineNumber": 150 }, "deprecated": false } @@ -32675,7 +32935,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 148 + "lineNumber": 162 }, "deprecated": false, "returnComment": [], @@ -33343,7 +33603,7 @@ "label": "expression", "description": [], "signature": [ - "((datatable: ", + "(datatable: ", { "pluginId": "expressions", "scope": "common", @@ -33353,7 +33613,7 @@ }, ") => ", "Observable", - "<string | number | boolean | null>) | undefined" + "<string | number | boolean | null>" ], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/map_column.ts", @@ -33493,6 +33753,96 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.OverallMetricArgs", + "type": "Interface", + "tags": [], + "label": "OverallMetricArgs", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.OverallMetricArgs.by", + "type": "Array", + "tags": [], + "label": "by", + "description": [], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.OverallMetricArgs.inputColumnId", + "type": "string", + "tags": [], + "label": "inputColumnId", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.OverallMetricArgs.outputColumnId", + "type": "string", + "tags": [], + "label": "outputColumnId", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.OverallMetricArgs.outputColumnName", + "type": "string", + "tags": [], + "label": "outputColumnName", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.OverallMetricArgs.metric", + "type": "CompoundType", + "tags": [], + "label": "metric", + "description": [], + "signature": [ + "\"max\" | \"min\" | \"sum\" | \"average\"" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 19 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.PointSeriesColumn", @@ -33738,6 +34088,51 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.UiSettingArguments", + "type": "Interface", + "tags": [], + "label": "UiSettingArguments", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/ui_setting.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.UiSettingArguments.default", + "type": "Unknown", + "tags": [], + "label": "default", + "description": [], + "signature": [ + "unknown" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/ui_setting.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.UiSettingArguments.parameter", + "type": "string", + "tags": [], + "label": "parameter", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/ui_setting.ts", + "lineNumber": 29 + }, + "deprecated": false + } + ], + "initialIsOpen": false } ], "enums": [ @@ -34260,16 +34655,16 @@ "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionAstFunction", - "text": "ExpressionAstFunction" + "section": "def-common.ExpressionAstExpression", + "text": "ExpressionAstExpression" }, " | ", { "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionAstExpression", - "text": "ExpressionAstExpression" + "section": "def-common.ExpressionAstFunction", + "text": "ExpressionAstFunction" } ], "source": { @@ -34569,6 +34964,72 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.ExpressionFunctionOverallMetric", + "type": "Type", + "tags": [], + "label": "ExpressionFunctionOverallMetric", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"overall_metric\", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.OverallMetricArgs", + "text": "OverallMetricArgs" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 22 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.ExpressionFunctionTheme", @@ -34611,6 +35072,64 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.ExpressionFunctionUiSetting", + "type": "Type", + "tags": [], + "label": "ExpressionFunctionUiSetting", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"uiSetting\", unknown, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.UiSettingArguments", + "text": "UiSettingArguments" + }, + ", Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>>, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/ui_setting.ts", + "lineNumber": 32 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.ExpressionFunctionVar", @@ -34829,7 +35348,7 @@ ], "source": { "path": "src/plugins/expressions/common/service/expressions_services.ts", - "lineNumber": 27 + "lineNumber": 41 }, "deprecated": false, "initialIsOpen": false @@ -35055,30 +35574,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "expressions", - "id": "def-common.functionSpecs", - "type": "Array", - "tags": [], - "label": "functionSpecs", - "description": [], - "signature": [ - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.AnyExpressionFunctionDefinition", - "text": "AnyExpressionFunctionDefinition" - }, - "[]" - ], - "source": { - "path": "src/plugins/expressions/common/expression_functions/specs/index.ts", - "lineNumber": 21 - }, - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "expressions", "id": "def-common.InferFunctionDefinition", @@ -35176,6 +35671,30 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.MathColumnArguments", + "type": "Type", + "tags": [], + "label": "MathColumnArguments", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.MathArguments", + "text": "MathArguments" + }, + " & { id: string; name?: string | undefined; copyMetaFrom?: string | null | undefined; }" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 14 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.MathInput", @@ -35572,7 +36091,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_types/specs/index.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false, "initialIsOpen": false @@ -35659,6 +36178,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.UiSetting", + "type": "Type", + "tags": [], + "label": "UiSetting", + "description": [], + "signature": [ + "{ type: \"ui_setting\"; } & { key: string; value: unknown; }" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 31 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.UnmappedTypeStrings", @@ -39324,7 +39860,9 @@ "section": "def-common.MapColumnArguments", "text": "MapColumnArguments" }, - ") => Promise<", + ") => ", + "Observable", + "<", { "pluginId": "expressions", "scope": "common", @@ -39685,6 +40223,466 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn", + "type": "Object", + "tags": [], + "label": "mathColumn", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 20 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "\"mathColumn\"" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"datatable\"" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.inputTypes", + "type": "Array", + "tags": [], + "label": "inputTypes", + "description": [], + "signature": [ + "\"datatable\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 39 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.id", + "type": "Object", + "tags": [], + "label": "id", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 41 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.id.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.id.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.id.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 46 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.name", + "type": "Object", + "tags": [], + "label": "name", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 48 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.name.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 49 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.name.aliases", + "type": "Array", + "tags": [], + "label": "aliases", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.name.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.name.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 54 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.copyMetaFrom", + "type": "Object", + "tags": [], + "label": "copyMetaFrom", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 56 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.copyMetaFrom.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "(\"string\" | \"null\")[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.copyMetaFrom.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.copyMetaFrom.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 62 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.args.copyMetaFrom.default", + "type": "Uncategorized", + "tags": [], + "label": "default", + "description": [], + "signature": [ + "null" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 63 + }, + "deprecated": false + } + ] + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.fn", + "type": "Function", + "tags": [], + "label": "fn", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", args: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.MathColumnArguments", + "text": "MathColumnArguments" + }, + ", context: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 66 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.fn.$1", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 66 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.fn.$2", + "type": "CompoundType", + "tags": [], + "label": "args", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.MathColumnArguments", + "text": "MathColumnArguments" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 66 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "expressions", + "id": "def-common.mathColumn.fn.$3", + "type": "Object", + "tags": [], + "label": "context", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/math_column.ts", + "lineNumber": 66 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.movingAverage", @@ -40840,6 +41838,504 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric", + "type": "Object", + "tags": [], + "label": "overallMetric", + "description": [ + "\nCalculates the overall metric of a specified column in the data table.\n\nAlso supports multiple series in a single data table - use the `by` argument\nto specify the columns to split the calculation by.\nFor each unique combination of all `by` columns a separate overall metric will be calculated.\nThe order of rows won't be changed - this function is not modifying any existing columns, it's only\nadding the specified `outputColumnId` column to every row of the table without adding or removing rows.\n\nBehavior:\n* Will write the overall metric of `inputColumnId` into `outputColumnId`\n* If provided will use `outputColumnName` as name for the newly created column. Otherwise falls back to `outputColumnId`\n* Each cell will contain the calculated metric based on the values of all cells belonging to the current series.\n\nEdge cases:\n* Will return the input table if `inputColumnId` does not exist\n* Will throw an error if `outputColumnId` exists already in provided data table\n* If the row value contains `null` or `undefined`, it will be ignored and overwritten with the overall metric of\n all cells of the same series.\n* For all values besides `null` and `undefined`, the value will be cast to a number before it's added to the\n overall metric of the current series - if this results in `NaN` (like in case of objects), all cells of the\n current series will be set to `NaN`.\n* To determine separate series defined by the `by` columns, the values of these columns will be cast to strings\n before comparison. If the values are objects, the return value of their `toString` method will be used for comparison.\n Missing values (`null` and `undefined`) will be treated as empty strings." + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 63 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "\"overall_metric\"" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 64 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"datatable\"" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.inputTypes", + "type": "Array", + "tags": [], + "label": "inputTypes", + "description": [], + "signature": [ + "\"datatable\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 73 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.by", + "type": "Object", + "tags": [], + "label": "by", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 74 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.by.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 75 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.by.multi", + "type": "boolean", + "tags": [], + "label": "multi", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 78 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.by.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 79 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.by.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 80 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.metric", + "type": "Object", + "tags": [], + "label": "metric", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 82 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.metric.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.metric.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 86 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.metric.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "(\"min\" | \"max\" | \"sum\" | \"average\")[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 87 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.inputColumnId", + "type": "Object", + "tags": [], + "label": "inputColumnId", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 89 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.inputColumnId.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 90 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.inputColumnId.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 93 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.inputColumnId.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 94 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnId", + "type": "Object", + "tags": [], + "label": "outputColumnId", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 96 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnId.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 97 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnId.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 100 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnId.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 101 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnName", + "type": "Object", + "tags": [], + "label": "outputColumnName", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 103 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnName.help", + "type": "string", + "tags": [], + "label": "help", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 104 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnName.types", + "type": "Array", + "tags": [], + "label": "types", + "description": [], + "signature": [ + "\"string\"[]" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 107 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.args.outputColumnName.required", + "type": "boolean", + "tags": [], + "label": "required", + "description": [], + "signature": [ + "false" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 108 + }, + "deprecated": false + } + ] + } + ] + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.fn", + "type": "Function", + "tags": [], + "label": "fn", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + ", { by, inputColumnId, outputColumnId, outputColumnName, metric }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.OverallMetricArgs", + "text": "OverallMetricArgs" + }, + ") => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 112 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.fn.$1", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 112 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "expressions", + "id": "def-common.overallMetric.fn.$2", + "type": "Object", + "tags": [], + "label": "{ by, inputColumnId, outputColumnId, outputColumnName, metric }", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.OverallMetricArgs", + "text": "OverallMetricArgs" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/overall_metric.ts", + "lineNumber": 112 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.palatino", @@ -42400,6 +43896,323 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting", + "type": "Object", + "tags": [], + "label": "uiSetting", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 33 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "\"ui_setting\"" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to", + "type": "Object", + "tags": [], + "label": "to", + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.boolean", + "type": "Function", + "tags": [], + "label": "boolean", + "description": [], + "signature": [ + "({ value }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>) => boolean" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 36 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.boolean.$1", + "type": "CompoundType", + "tags": [], + "label": "{ value }", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 36 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.number", + "type": "Function", + "tags": [], + "label": "number", + "description": [], + "signature": [ + "({ value }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>) => number" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 39 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.number.$1", + "type": "CompoundType", + "tags": [], + "label": "{ value }", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 39 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.string", + "type": "Function", + "tags": [], + "label": "string", + "description": [], + "signature": [ + "({ value }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>) => string" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 42 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.string.$1", + "type": "CompoundType", + "tags": [], + "label": "{ value }", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 42 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.render", + "type": "Function", + "tags": [], + "label": "render", + "description": [], + "signature": [ + "({ value }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"render\", { as: string; value: { text: string; }; }>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 45 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.render.$1", + "type": "CompoundType", + "tags": [], + "label": "{ value }", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 45 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.datatable", + "type": "Function", + "tags": [], + "label": "datatable", + "description": [], + "signature": [ + "({ key, value }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + } + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 57 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.uiSetting.to.datatable.$1", + "type": "CompoundType", + "tags": [], + "label": "{ key, value }", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"ui_setting\", { key: string; value: unknown; }>" + ], + "source": { + "path": "src/plugins/expressions/common/expression_types/specs/ui_setting.ts", + "lineNumber": 57 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "expressions", "id": "def-common.variable", @@ -42757,6 +44570,22 @@ }, "deprecated": false }, + { + "parentPluginId": "expressions", + "id": "def-common.variableSet.args.name.multi", + "type": "boolean", + "tags": [], + "label": "multi", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", + "lineNumber": 34 + }, + "deprecated": false + }, { "parentPluginId": "expressions", "id": "def-common.variableSet.args.name.help", @@ -42766,7 +44595,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false } @@ -42781,7 +44610,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 38 + "lineNumber": 39 }, "deprecated": false, "children": [ @@ -42797,7 +44626,23 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 39 + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.variableSet.args.value.multi", + "type": "boolean", + "tags": [], + "label": "multi", + "description": [], + "signature": [ + "true" + ], + "source": { + "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", + "lineNumber": 41 }, "deprecated": false }, @@ -42810,7 +44655,7 @@ "description": [], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 40 + "lineNumber": 42 }, "deprecated": false } @@ -42848,7 +44693,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 46 + "lineNumber": 48 }, "deprecated": false, "children": [ @@ -42864,7 +44709,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 46 + "lineNumber": 48 }, "deprecated": false, "isRequired": true @@ -42881,7 +44726,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 46 + "lineNumber": 48 }, "deprecated": false, "isRequired": true @@ -42915,7 +44760,7 @@ ], "source": { "path": "src/plugins/expressions/common/expression_functions/specs/var_set.ts", - "lineNumber": 46 + "lineNumber": 48 }, "deprecated": false, "isRequired": true diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index e0544d866766ed..3d9640a85709a0 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import expressionsObj from './expressions.json'; @@ -19,7 +18,7 @@ import expressionsObj from './expressions.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1871 | 57 | 1444 | 5 | +| 1962 | 58 | 1534 | 5 | ## Client diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 377945d852ddd6..6bead616a2913a 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import featuresObj from './features.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index acd0ed52e41826..1905e3f2b9e2ee 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,12 +8,11 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import fileUploadObj from './file_upload.json'; +The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. - - +Contact [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/fleet.json b/api_docs/fleet.json index bb7e8990626400..3d6ebe953944c7 100644 --- a/api_docs/fleet.json +++ b/api_docs/fleet.json @@ -234,6 +234,37 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-public.IntegrationsAppBrowseRouteState", + "type": "Interface", + "tags": [], + "label": "IntegrationsAppBrowseRouteState", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/public/types/intra_app_route_state.ts", + "lineNumber": 42 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-public.IntegrationsAppBrowseRouteState.forAgentPolicyId", + "type": "string", + "tags": [], + "label": "forAgentPolicyId", + "description": [ + "The agent policy that we are browsing integrations for" + ], + "source": { + "path": "x-pack/plugins/fleet/public/types/intra_app_route_state.ts", + "lineNumber": 44 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-public.NewPackagePolicy", @@ -243,7 +274,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 52 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -256,7 +287,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 53 + "lineNumber": 54 }, "deprecated": false }, @@ -272,7 +303,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false }, @@ -285,7 +316,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 55 + "lineNumber": 56 }, "deprecated": false }, @@ -298,7 +329,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 56 + "lineNumber": 57 }, "deprecated": false }, @@ -311,7 +342,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 57 + "lineNumber": 58 }, "deprecated": false }, @@ -324,7 +355,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 58 + "lineNumber": 59 }, "deprecated": false }, @@ -347,7 +378,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 59 + "lineNumber": 60 }, "deprecated": false }, @@ -370,7 +401,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false }, @@ -394,7 +425,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 61 + "lineNumber": 62 }, "deprecated": false } @@ -1168,7 +1199,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/types/intra_app_route_state.ts", - "lineNumber": 45 + "lineNumber": 50 }, "deprecated": false, "initialIsOpen": false @@ -1357,7 +1388,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 73 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -1373,7 +1404,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 79 + "lineNumber": 85 }, "deprecated": false, "children": [], @@ -1391,7 +1422,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 80 + "lineNumber": 86 }, "deprecated": false, "children": [], @@ -1409,7 +1440,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 81 + "lineNumber": 87 }, "deprecated": false, "children": [], @@ -1427,7 +1458,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 82 + "lineNumber": 88 }, "deprecated": false, "children": [], @@ -1445,7 +1476,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 83 + "lineNumber": 89 }, "deprecated": false, "children": [], @@ -1465,7 +1496,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 84 + "lineNumber": 90 }, "deprecated": false, "children": [ @@ -1481,7 +1512,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 84 + "lineNumber": 90 }, "deprecated": false, "isRequired": true @@ -1497,13 +1528,13 @@ "label": "integration_details_policies", "description": [], "signature": [ - "({ pkgkey, integration }: ", + "({ pkgkey, integration, addAgentToPolicyId }: ", "DynamicPagePathValues", ") => [string, string]" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 88 + "lineNumber": 94 }, "deprecated": false, "children": [ @@ -1512,6 +1543,44 @@ "id": "def-public.pagePathGetters.integration_details_policies.$1", "type": "Object", "tags": [], + "label": "{ pkgkey, integration, addAgentToPolicyId }", + "description": [], + "signature": [ + "DynamicPagePathValues" + ], + "source": { + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "lineNumber": 94 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.integration_details_assets", + "type": "Function", + "tags": [], + "label": "integration_details_assets", + "description": [], + "signature": [ + "({ pkgkey, integration }: ", + "DynamicPagePathValues", + ") => [string, string]" + ], + "source": { + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "lineNumber": 98 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.integration_details_assets.$1", + "type": "Object", + "tags": [], "label": "{ pkgkey, integration }", "description": [], "signature": [ @@ -1519,7 +1588,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 88 + "lineNumber": 98 }, "deprecated": false, "isRequired": true @@ -1541,7 +1610,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 92 + "lineNumber": 102 }, "deprecated": false, "children": [ @@ -1557,7 +1626,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 92 + "lineNumber": 102 }, "deprecated": false, "isRequired": true @@ -1579,7 +1648,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 96 + "lineNumber": 106 }, "deprecated": false, "children": [ @@ -1595,7 +1664,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 96 + "lineNumber": 106 }, "deprecated": false, "isRequired": true @@ -1617,7 +1686,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 100 + "lineNumber": 110 }, "deprecated": false, "children": [ @@ -1633,7 +1702,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 100 + "lineNumber": 110 }, "deprecated": false, "isRequired": true @@ -1653,7 +1722,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 104 + "lineNumber": 114 }, "deprecated": false, "children": [], @@ -1671,7 +1740,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 105 + "lineNumber": 115 }, "deprecated": false, "children": [], @@ -1691,7 +1760,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 106 + "lineNumber": 116 }, "deprecated": false, "children": [ @@ -1707,7 +1776,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 106 + "lineNumber": 116 }, "deprecated": false, "isRequired": true @@ -1721,7 +1790,9 @@ "type": "Function", "tags": [], "label": "add_integration_from_policy", - "description": [], + "description": [ + "// TODO: This might need to be removed because we do not have a way to pick an integration in line anymore" + ], "signature": [ "({ policyId }: ", "DynamicPagePathValues", @@ -1729,7 +1800,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 110 + "lineNumber": 121 }, "deprecated": false, "children": [ @@ -1745,7 +1816,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 110 + "lineNumber": 121 }, "deprecated": false, "isRequired": true @@ -1761,13 +1832,13 @@ "label": "add_integration_to_policy", "description": [], "signature": [ - "({ pkgkey, integration }: ", + "({ pkgkey, integration, agentPolicyId }: ", "DynamicPagePathValues", ") => [string, string]" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 114 + "lineNumber": 125 }, "deprecated": false, "children": [ @@ -1776,14 +1847,14 @@ "id": "def-public.pagePathGetters.add_integration_to_policy.$1", "type": "Object", "tags": [], - "label": "{ pkgkey, integration }", + "label": "{ pkgkey, integration, agentPolicyId }", "description": [], "signature": [ "DynamicPagePathValues" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 114 + "lineNumber": 125 }, "deprecated": false, "isRequired": true @@ -1805,7 +1876,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 118 + "lineNumber": 130 }, "deprecated": false, "children": [ @@ -1821,7 +1892,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 118 + "lineNumber": 130 }, "deprecated": false, "isRequired": true @@ -1831,53 +1902,73 @@ }, { "parentPluginId": "fleet", - "id": "def-public.pagePathGetters.fleet", + "id": "def-public.pagePathGetters.agent_list", "type": "Function", "tags": [], - "label": "fleet", + "label": "agent_list", "description": [], "signature": [ - "() => [string, string]" + "({ kuery }: ", + "DynamicPagePathValues", + ") => [string, string]" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 122 + "lineNumber": 134 }, "deprecated": false, - "children": [], + "children": [ + { + "parentPluginId": "fleet", + "id": "def-public.pagePathGetters.agent_list.$1", + "type": "Object", + "tags": [], + "label": "{ kuery }", + "description": [], + "signature": [ + "DynamicPagePathValues" + ], + "source": { + "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", + "lineNumber": 134 + }, + "deprecated": false, + "isRequired": true + } + ], "returnComment": [] }, { "parentPluginId": "fleet", - "id": "def-public.pagePathGetters.fleet_agent_list", + "id": "def-public.pagePathGetters.agent_details", "type": "Function", "tags": [], - "label": "fleet_agent_list", + "label": "agent_details", "description": [], "signature": [ - "({ kuery }: ", + "({ agentId, tabId, logQuery }: ", "DynamicPagePathValues", ") => [string, string]" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 123 + "lineNumber": 135 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-public.pagePathGetters.fleet_agent_list.$1", + "id": "def-public.pagePathGetters.agent_details.$1", "type": "Object", "tags": [], - "label": "{ kuery }", + "label": "{ agentId, tabId, logQuery }", "description": [], "signature": [ "DynamicPagePathValues" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 123 + "lineNumber": 135 }, "deprecated": false, "isRequired": true @@ -1887,35 +1978,35 @@ }, { "parentPluginId": "fleet", - "id": "def-public.pagePathGetters.fleet_agent_details", + "id": "def-public.pagePathGetters.agent_details_logs", "type": "Function", "tags": [], - "label": "fleet_agent_details", + "label": "agent_details_logs", "description": [], "signature": [ - "({ agentId, tabId, logQuery }: ", + "({ agentId }: ", "DynamicPagePathValues", ") => [string, string]" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 127 + "lineNumber": 139 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-public.pagePathGetters.fleet_agent_details.$1", + "id": "def-public.pagePathGetters.agent_details_logs.$1", "type": "Object", "tags": [], - "label": "{ agentId, tabId, logQuery }", + "label": "{ agentId }", "description": [], "signature": [ "DynamicPagePathValues" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 127 + "lineNumber": 139 }, "deprecated": false, "isRequired": true @@ -1925,17 +2016,17 @@ }, { "parentPluginId": "fleet", - "id": "def-public.pagePathGetters.fleet_enrollment_tokens", + "id": "def-public.pagePathGetters.enrollment_tokens", "type": "Function", "tags": [], - "label": "fleet_enrollment_tokens", + "label": "enrollment_tokens", "description": [], "signature": [ "() => [string, string]" ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 131 + "lineNumber": 140 }, "deprecated": false, "children": [], @@ -1953,7 +2044,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/constants/page_paths.ts", - "lineNumber": 132 + "lineNumber": 141 }, "deprecated": false, "children": [], @@ -1972,7 +2063,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/public/plugin.ts", - "lineNumber": 48 + "lineNumber": 52 }, "deprecated": false, "children": [], @@ -1990,7 +2081,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/plugin.ts", - "lineNumber": 53 + "lineNumber": 57 }, "deprecated": false, "children": [ @@ -2014,7 +2105,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/plugin.ts", - "lineNumber": 54 + "lineNumber": 58 }, "deprecated": false, "returnComment": [], @@ -2071,7 +2162,7 @@ ], "source": { "path": "x-pack/plugins/fleet/public/plugin.ts", - "lineNumber": 55 + "lineNumber": 59 }, "deprecated": false, "returnComment": [], @@ -2147,7 +2238,7 @@ "section": "def-server.Artifact", "text": "Artifact" }, - ", \"identifier\" | \"decodedSha256\">>({ identifier, decodedSha256, }: T) => string" + ", \"decodedSha256\" | \"identifier\">>({ identifier, decodedSha256, }: T) => string" ], "source": { "path": "x-pack/plugins/fleet/server/services/artifacts/mappings.ts", @@ -2536,7 +2627,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 263 + "lineNumber": 267 }, "deprecated": false }, @@ -2549,7 +2640,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 264 + "lineNumber": 268 }, "deprecated": false }, @@ -2562,7 +2653,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 265 + "lineNumber": 269 }, "deprecated": false } @@ -2913,7 +3004,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 305 + "lineNumber": 309 }, "deprecated": false }, @@ -2929,7 +3020,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 306 + "lineNumber": 310 }, "deprecated": false } @@ -3272,7 +3363,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 537 + "lineNumber": 541 }, "deprecated": false } @@ -3623,7 +3714,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 675 + "lineNumber": 680 }, "deprecated": false }, @@ -3636,7 +3727,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 676 + "lineNumber": 681 }, "deprecated": false }, @@ -3652,120 +3743,503 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", - "lineNumber": 677 + "lineNumber": 682 }, "deprecated": false } ] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "fleet", - "id": "def-server.AgentService", - "type": "Interface", - "tags": [], - "label": "AgentService", - "description": [ - "\nA service that provides exported functions that return information about an Agent" - ], - "source": { - "path": "x-pack/plugins/fleet/server/services/index.ts", - "lineNumber": 45 - }, - "deprecated": false, - "children": [ + }, { "parentPluginId": "fleet", - "id": "def-server.AgentService.getAgent", + "id": "def-server.AgentPolicyServiceInterface.getByIds", "type": "Function", "tags": [], - "label": "getAgent", - "description": [ - "\nGet an Agent by id" - ], + "label": "getByIds", + "description": [], "signature": [ - "(esClient: ", + "(soClient: Pick<", { "pluginId": "core", "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.ElasticsearchClient", - "text": "ElasticsearchClient" + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClient", + "text": "SavedObjectsClient" }, - ", agentId: string) => Promise<", + ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"checkConflicts\" | \"find\" | \"bulkGet\" | \"resolve\" | \"update\" | \"collectMultiNamespaceReferences\" | \"updateObjectsSpaces\" | \"bulkUpdate\" | \"removeReferencesTo\" | \"openPointInTimeForType\" | \"closePointInTime\" | \"createPointInTimeFinder\" | \"errors\">, ids: string[], options?: { fields?: string[] | undefined; }) => Promise<", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.Agent", - "text": "Agent" + "section": "def-common.AgentPolicy", + "text": "AgentPolicy" }, - ">" + "[]>" ], "source": { "path": "x-pack/plugins/fleet/server/services/index.ts", - "lineNumber": 49 + "lineNumber": 72 }, "deprecated": false, "returnComment": [], "children": [ { "parentPluginId": "fleet", - "id": "def-server.esClient", - "type": "CompoundType", + "id": "def-server.soClient", + "type": "Object", "tags": [], - "label": "esClient", + "label": "soClient", "description": [], "signature": [ - "Pick<", - "KibanaClient", - ", \"get\" | \"delete\" | \"create\" | \"index\" | \"update\" | \"closePointInTime\" | \"helpers\" | \"count\" | \"search\" | \"security\" | \"eql\" | \"on\" | \"off\" | \"transform\" | \"emit\" | \"once\" | \"asyncSearch\" | \"autoscaling\" | \"bulk\" | \"cat\" | \"ccr\" | \"clearScroll\" | \"cluster\" | \"danglingIndices\" | \"dataFrameTransformDeprecated\" | \"deleteByQuery\" | \"deleteByQueryRethrottle\" | \"deleteScript\" | \"enrich\" | \"exists\" | \"existsSource\" | \"explain\" | \"features\" | \"fieldCaps\" | \"fleet\" | \"getScript\" | \"getScriptContext\" | \"getScriptLanguages\" | \"getSource\" | \"graph\" | \"ilm\" | \"indices\" | \"info\" | \"ingest\" | \"license\" | \"logstash\" | \"mget\" | \"migration\" | \"ml\" | \"monitoring\" | \"msearch\" | \"msearchTemplate\" | \"mtermvectors\" | \"nodes\" | \"openPointInTime\" | \"ping\" | \"putScript\" | \"rankEval\" | \"reindex\" | \"reindexRethrottle\" | \"renderSearchTemplate\" | \"rollup\" | \"scriptsPainlessExecute\" | \"scroll\" | \"searchShards\" | \"searchTemplate\" | \"searchableSnapshots\" | \"shutdown\" | \"slm\" | \"snapshot\" | \"sql\" | \"ssl\" | \"tasks\" | \"termsEnum\" | \"termvectors\" | \"textStructure\" | \"updateByQuery\" | \"updateByQueryRethrottle\" | \"watcher\" | \"xpack\"> & { transport: { request(params: ", - "TransportRequestParams", - ", options?: ", - "TransportRequestOptions", - " | undefined): ", - "TransportRequestPromise", - "<", - "ApiResponse", - "<Record<string, any>, unknown>>; }; }" - ], - "source": { - "path": "x-pack/plugins/fleet/server/services/agents/crud.ts", - "lineNumber": 191 - }, - "deprecated": false - }, - { - "parentPluginId": "fleet", - "id": "def-server.agentId", - "type": "string", - "tags": [], - "label": "agentId", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/server/services/agents/crud.ts", - "lineNumber": 191 - }, - "deprecated": false - } - ] - }, - { - "parentPluginId": "fleet", - "id": "def-server.AgentService.authenticateAgentWithAccessToken", - "type": "Function", - "tags": [], - "label": "authenticateAgentWithAccessToken", - "description": [ - "\nAuthenticate an agent with access toekn" - ], - "signature": [ - "(esClient: ", - { - "pluginId": "core", - "scope": "server", + "{ get: <T = unknown>(type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + "SavedObject", + "<T>>; delete: (type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsDeleteOptions", + "text": "SavedObjectsDeleteOptions" + }, + ") => Promise<{}>; create: <T = unknown>(type: string, attributes: T, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreateOptions", + "text": "SavedObjectsCreateOptions" + }, + " | undefined) => Promise<", + "SavedObject", + "<T>>; bulkCreate: <T = unknown>(objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkCreateObject", + "text": "SavedObjectsBulkCreateObject" + }, + "<T>[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreateOptions", + "text": "SavedObjectsCreateOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkResponse", + "text": "SavedObjectsBulkResponse" + }, + "<T>>; checkConflicts: (objects?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCheckConflictsObject", + "text": "SavedObjectsCheckConflictsObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCheckConflictsResponse", + "text": "SavedObjectsCheckConflictsResponse" + }, + ">; find: <T = unknown, A = unknown>(options: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsFindOptions", + "text": "SavedObjectsFindOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsFindResponse", + "text": "SavedObjectsFindResponse" + }, + "<T, A>>; bulkGet: <T = unknown>(objects?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkGetObject", + "text": "SavedObjectsBulkGetObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkResponse", + "text": "SavedObjectsBulkResponse" + }, + "<T>>; resolve: <T = unknown>(type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsResolveResponse", + "text": "SavedObjectsResolveResponse" + }, + "<T>>; update: <T = unknown>(type: string, id: string, attributes: Partial<T>, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateOptions", + "text": "SavedObjectsUpdateOptions" + }, + "<T>) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateResponse", + "text": "SavedObjectsUpdateResponse" + }, + "<T>>; collectMultiNamespaceReferences: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCollectMultiNamespaceReferencesObject", + "text": "SavedObjectsCollectMultiNamespaceReferencesObject" + }, + "[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCollectMultiNamespaceReferencesOptions", + "text": "SavedObjectsCollectMultiNamespaceReferencesOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCollectMultiNamespaceReferencesResponse", + "text": "SavedObjectsCollectMultiNamespaceReferencesResponse" + }, + ">; updateObjectsSpaces: (objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateObjectsSpacesObject", + "text": "SavedObjectsUpdateObjectsSpacesObject" + }, + "[], spacesToAdd: string[], spacesToRemove: string[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateObjectsSpacesOptions", + "text": "SavedObjectsUpdateObjectsSpacesOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsUpdateObjectsSpacesResponse", + "text": "SavedObjectsUpdateObjectsSpacesResponse" + }, + ">; bulkUpdate: <T = unknown>(objects: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkUpdateObject", + "text": "SavedObjectsBulkUpdateObject" + }, + "<T>[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkUpdateOptions", + "text": "SavedObjectsBulkUpdateOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBulkUpdateResponse", + "text": "SavedObjectsBulkUpdateResponse" + }, + "<T>>; removeReferencesTo: (type: string, id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsRemoveReferencesToOptions", + "text": "SavedObjectsRemoveReferencesToOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsRemoveReferencesToResponse", + "text": "SavedObjectsRemoveReferencesToResponse" + }, + ">; openPointInTimeForType: (type: string | string[], options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsOpenPointInTimeOptions", + "text": "SavedObjectsOpenPointInTimeOptions" + }, + ") => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsOpenPointInTimeResponse", + "text": "SavedObjectsOpenPointInTimeResponse" + }, + ">; closePointInTime: (id: string, options?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsBaseOptions", + "text": "SavedObjectsBaseOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsClosePointInTimeResponse", + "text": "SavedObjectsClosePointInTimeResponse" + }, + ">; createPointInTimeFinder: <T = unknown, A = unknown>(findOptions: Pick<", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsFindOptions", + "text": "SavedObjectsFindOptions" + }, + ", \"type\" | \"filter\" | \"aggs\" | \"fields\" | \"perPage\" | \"sortField\" | \"sortOrder\" | \"search\" | \"searchFields\" | \"rootSearchFields\" | \"hasReference\" | \"hasReferenceOperator\" | \"defaultSearchOperator\" | \"namespaces\" | \"typeToNamespacesMap\" | \"preference\">, dependencies?: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsCreatePointInTimeFinderDependencies", + "text": "SavedObjectsCreatePointInTimeFinderDependencies" + }, + " | undefined) => ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.ISavedObjectsPointInTimeFinder", + "text": "ISavedObjectsPointInTimeFinder" + }, + "<T, A>; errors: typeof ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-server.SavedObjectsErrorHelpers", + "text": "SavedObjectsErrorHelpers" + }, + "; }" + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", + "lineNumber": 294 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.ids", + "type": "Array", + "tags": [], + "label": "ids", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", + "lineNumber": 295 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ fields?: string[] | undefined; }" + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/agent_policy.ts", + "lineNumber": 296 + }, + "deprecated": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.AgentService", + "type": "Interface", + "tags": [], + "label": "AgentService", + "description": [ + "\nA service that provides exported functions that return information about an Agent" + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/index.ts", + "lineNumber": 45 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.AgentService.getAgent", + "type": "Function", + "tags": [], + "label": "getAgent", + "description": [ + "\nGet an Agent by id" + ], + "signature": [ + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", agentId: string) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Agent", + "text": "Agent" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/index.ts", + "lineNumber": 49 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.esClient", + "type": "CompoundType", + "tags": [], + "label": "esClient", + "description": [], + "signature": [ + "Pick<", + "KibanaClient", + ", \"get\" | \"delete\" | \"create\" | \"index\" | \"update\" | \"closePointInTime\" | \"helpers\" | \"count\" | \"search\" | \"security\" | \"eql\" | \"on\" | \"off\" | \"transform\" | \"emit\" | \"once\" | \"asyncSearch\" | \"autoscaling\" | \"bulk\" | \"cat\" | \"ccr\" | \"clearScroll\" | \"cluster\" | \"danglingIndices\" | \"dataFrameTransformDeprecated\" | \"deleteByQuery\" | \"deleteByQueryRethrottle\" | \"deleteScript\" | \"enrich\" | \"exists\" | \"existsSource\" | \"explain\" | \"features\" | \"fieldCaps\" | \"fleet\" | \"getScript\" | \"getScriptContext\" | \"getScriptLanguages\" | \"getSource\" | \"graph\" | \"ilm\" | \"indices\" | \"info\" | \"ingest\" | \"license\" | \"logstash\" | \"mget\" | \"migration\" | \"ml\" | \"monitoring\" | \"msearch\" | \"msearchTemplate\" | \"mtermvectors\" | \"nodes\" | \"openPointInTime\" | \"ping\" | \"putScript\" | \"rankEval\" | \"reindex\" | \"reindexRethrottle\" | \"renderSearchTemplate\" | \"rollup\" | \"scriptsPainlessExecute\" | \"scroll\" | \"searchShards\" | \"searchTemplate\" | \"searchableSnapshots\" | \"shutdown\" | \"slm\" | \"snapshot\" | \"sql\" | \"ssl\" | \"tasks\" | \"termsEnum\" | \"termvectors\" | \"textStructure\" | \"updateByQuery\" | \"updateByQueryRethrottle\" | \"watcher\" | \"xpack\"> & { transport: { request(params: ", + "TransportRequestParams", + ", options?: ", + "TransportRequestOptions", + " | undefined): ", + "TransportRequestPromise", + "<", + "ApiResponse", + "<Record<string, any>, unknown>>; }; }" + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/agents/crud.ts", + "lineNumber": 191 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.agentId", + "type": "string", + "tags": [], + "label": "agentId", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/agents/crud.ts", + "lineNumber": 191 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "fleet", + "id": "def-server.AgentService.authenticateAgentWithAccessToken", + "type": "Function", + "tags": [], + "label": "authenticateAgentWithAccessToken", + "description": [ + "\nAuthenticate an agent with access toekn" + ], + "signature": [ + "(esClient: ", + { + "pluginId": "core", + "scope": "server", "docId": "kibCorePluginApi", "section": "def-server.ElasticsearchClient", "text": "ElasticsearchClient" @@ -4268,7 +4742,7 @@ "section": "def-server.Artifact", "text": "Artifact" }, - ", \"body\" | \"decodedSha256\" | \"decodedSize\" | \"encodedSha256\" | \"encodedSize\" | \"compressionAlgorithm\">>" + ", \"body\" | \"compressionAlgorithm\" | \"decodedSha256\" | \"decodedSize\" | \"encodedSha256\" | \"encodedSize\">>" ], "source": { "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", @@ -4784,7 +5258,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/index.ts", - "lineNumber": 83 + "lineNumber": 84 }, "deprecated": false, "initialIsOpen": false @@ -4801,7 +5275,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/services/package_policy.ts", - "lineNumber": 656 + "lineNumber": 667 }, "deprecated": false, "initialIsOpen": false @@ -5125,203 +5599,721 @@ "path": "x-pack/plugins/fleet/server/plugin.ts", "lineNumber": 186 }, - "deprecated": false - } - ] - } - ], - "lifecycle": "start", - "initialIsOpen": true - } - }, - "common": { - "classes": [ + "deprecated": false + } + ] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [ + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService", + "type": "Class", + "tags": [], + "label": "LicenseService", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "(license$: ", + "Observable", + "<", + "ILicense", + ">) => void" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 23 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.start.$1", + "type": "Object", + "tags": [], + "label": "license$", + "description": [], + "signature": [ + "Observable", + "<", + "ILicense", + ">" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 23 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.stop", + "type": "Function", + "tags": [], + "label": "stop", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 28 + }, + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.getLicenseInformation", + "type": "Function", + "tags": [], + "label": "getLicenseInformation", + "description": [], + "signature": [ + "() => ", + "ILicense", + " | null" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 34 + }, + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.getLicenseInformation$", + "type": "Function", + "tags": [], + "label": "getLicenseInformation$", + "description": [], + "signature": [ + "() => ", + "Observable", + "<", + "ILicense", + "> | null" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.isGoldPlus", + "type": "Function", + "tags": [], + "label": "isGoldPlus", + "description": [], + "signature": [ + "() => boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 42 + }, + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.LicenseService.isEnterprise", + "type": "Function", + "tags": [], + "label": "isEnterprise", + "description": [], + "signature": [ + "() => boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/license.ts", + "lineNumber": 49 + }, + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [ + { + "parentPluginId": "fleet", + "id": "def-common.countValidationErrors", + "type": "Function", + "tags": [], + "label": "countValidationErrors", + "description": [], + "signature": [ + "(validationResults: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" + }, + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyValidationResults", + "text": "PackagePolicyValidationResults" + }, + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyInputValidationResults", + "text": "PackagePolicyInputValidationResults" + }, + ") => number" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 272 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.countValidationErrors.$1", + "type": "CompoundType", + "tags": [], + "label": "validationResults", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" + }, + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyValidationResults", + "text": "PackagePolicyValidationResults" + }, + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyInputValidationResults", + "text": "PackagePolicyInputValidationResults" + } + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 273 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "fleet", - "id": "def-common.LicenseService", - "type": "Class", + "id": "def-common.decodeCloudId", + "type": "Function", "tags": [], - "label": "LicenseService", + "label": "decodeCloudId", "description": [], + "signature": [ + "(cid: string) => { host: string; defaultPort: string; elasticsearchUrl: string; kibanaUrl: string; } | undefined" + ], "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 14 + "path": "x-pack/plugins/fleet/common/services/decode_cloud_id.ts", + "lineNumber": 9 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.LicenseService.start", - "type": "Function", + "id": "def-common.decodeCloudId.$1", + "type": "string", "tags": [], - "label": "start", + "label": "cid", "description": [], "signature": [ - "(license$: ", - "Observable", - "<", - "ILicense", - ">) => void" + "string" ], "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 23 + "path": "x-pack/plugins/fleet/common/services/decode_cloud_id.ts", + "lineNumber": 10 }, "deprecated": false, - "children": [ + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.doesAgentPolicyAlreadyIncludePackage", + "type": "Function", + "tags": [], + "label": "doesAgentPolicyAlreadyIncludePackage", + "description": [], + "signature": [ + "(agentPolicy: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.AgentPolicy", + "text": "AgentPolicy" + }, + ", packageName: string) => boolean" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/limited_package.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.doesAgentPolicyAlreadyIncludePackage.$1", + "type": "Object", + "tags": [], + "label": "agentPolicy", + "description": [], + "signature": [ { - "parentPluginId": "fleet", - "id": "def-common.LicenseService.start.$1", - "type": "Object", - "tags": [], - "label": "license$", - "description": [], - "signature": [ - "Observable", - "<", - "ILicense", - ">" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 23 - }, - "deprecated": false, - "isRequired": true + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.AgentPolicy", + "text": "AgentPolicy" } ], - "returnComment": [] + "source": { + "path": "x-pack/plugins/fleet/common/services/limited_package.ts", + "lineNumber": 17 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.doesAgentPolicyAlreadyIncludePackage.$2", + "type": "string", + "tags": [], + "label": "packageName", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/limited_package.ts", + "lineNumber": 18 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.doesPackageHaveIntegrations", + "type": "Function", + "tags": [], + "label": "doesPackageHaveIntegrations", + "description": [], + "signature": [ + "(pkgInfo: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Installed", + "text": "Installed" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NotInstalled", + "text": "NotInstalled" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Installed", + "text": "Installed" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ArchivePackage", + "text": "ArchivePackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NotInstalled", + "text": "NotInstalled" }, + "<Merge<", { - "parentPluginId": "fleet", - "id": "def-common.LicenseService.stop", - "type": "Function", - "tags": [], - "label": "stop", - "description": [], - "signature": [ - "() => void" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 28 - }, - "deprecated": false, - "children": [], - "returnComment": [] + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ArchivePackage", + "text": "ArchivePackage" }, + ", ", { - "parentPluginId": "fleet", - "id": "def-common.LicenseService.getLicenseInformation", - "type": "Function", - "tags": [], - "label": "getLicenseInformation", - "description": [], - "signature": [ - "() => ", - "ILicense", - " | null" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 34 - }, - "deprecated": false, - "children": [], - "returnComment": [] + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" }, + ">> | (Pick<", { - "parentPluginId": "fleet", - "id": "def-common.LicenseService.getLicenseInformation$", - "type": "Function", - "tags": [], - "label": "getLicenseInformation$", - "description": [], - "signature": [ - "() => ", - "Observable", - "<", - "ILicense", - "> | null" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 38 - }, - "deprecated": false, - "children": [], - "returnComment": [] + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"installed\"; savedObject: ", + "SavedObject", + "<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Installation", + "text": "Installation" + }, + ">; } & { integration?: string | undefined; id: string; }) | (Pick<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" }, + ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"not_installed\"; } & { integration?: string | undefined; id: string; })) => boolean" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/packages_with_integrations.ts", + "lineNumber": 9 + }, + "deprecated": false, + "children": [ { "parentPluginId": "fleet", - "id": "def-common.LicenseService.isGoldPlus", - "type": "Function", + "id": "def-common.doesPackageHaveIntegrations.$1", + "type": "CompoundType", "tags": [], - "label": "isGoldPlus", + "label": "pkgInfo", "description": [], "signature": [ - "() => boolean | undefined" + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Installed", + "text": "Installed" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NotInstalled", + "text": "NotInstalled" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Installed", + "text": "Installed" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ArchivePackage", + "text": "ArchivePackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NotInstalled", + "text": "NotInstalled" + }, + "<Merge<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ArchivePackage", + "text": "ArchivePackage" + }, + ", ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.EpmPackageAdditions", + "text": "EpmPackageAdditions" + }, + ">> | (Pick<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"installed\"; savedObject: ", + "SavedObject", + "<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Installation", + "text": "Installation" + }, + ">; } & { integration?: string | undefined; id: string; }) | (Pick<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryPackage", + "text": "RegistryPackage" + }, + ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"not_installed\"; } & { integration?: string | undefined; id: string; })" ], "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 42 + "path": "x-pack/plugins/fleet/common/services/packages_with_integrations.ts", + "lineNumber": 9 }, "deprecated": false, - "children": [], - "returnComment": [] - }, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.entries", + "type": "Function", + "tags": [], + "label": "entries", + "description": [], + "signature": [ + "<T>(o: T) => [keyof T, T[keyof T]][]" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "returnComment": [], + "children": [ { "parentPluginId": "fleet", - "id": "def-common.LicenseService.isEnterprise", - "type": "Function", + "id": "def-common.o", + "type": "Uncategorized", "tags": [], - "label": "isEnterprise", + "label": "o", "description": [], "signature": [ - "() => boolean | undefined" + "T" ], "source": { - "path": "x-pack/plugins/fleet/common/services/license.ts", - "lineNumber": 49 + "path": "x-pack/plugins/fleet/common/types/index.ts", + "lineNumber": 36 }, - "deprecated": false, - "children": [], - "returnComment": [] + "deprecated": false } ], "initialIsOpen": false - } - ], - "functions": [ + }, { "parentPluginId": "fleet", - "id": "def-common.decodeCloudId", + "id": "def-common.fullAgentPolicyToYaml", "type": "Function", "tags": [], - "label": "decodeCloudId", + "label": "fullAgentPolicyToYaml", "description": [], "signature": [ - "(cid: string) => { host: string; defaultPort: string; elasticsearchUrl: string; kibanaUrl: string; } | undefined" + "(policy: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.FullAgentPolicy", + "text": "FullAgentPolicy" + }, + ") => string" ], "source": { - "path": "x-pack/plugins/fleet/common/services/decode_cloud_id.ts", - "lineNumber": 9 + "path": "x-pack/plugins/fleet/common/services/full_agent_policy_to_yaml.ts", + "lineNumber": 28 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.decodeCloudId.$1", - "type": "string", + "id": "def-common.fullAgentPolicyToYaml.$1", + "type": "Object", "tags": [], - "label": "cid", + "label": "policy", "description": [], "signature": [ - "string" + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.FullAgentPolicy", + "text": "FullAgentPolicy" + } ], "source": { - "path": "x-pack/plugins/fleet/common/services/decode_cloud_id.ts", - "lineNumber": 10 + "path": "x-pack/plugins/fleet/common/services/full_agent_policy_to_yaml.ts", + "lineNumber": 28 }, "deprecated": false, "isRequired": true @@ -5332,64 +6324,89 @@ }, { "parentPluginId": "fleet", - "id": "def-common.doesAgentPolicyAlreadyIncludePackage", + "id": "def-common.getStreamsForInputType", "type": "Function", "tags": [], - "label": "doesAgentPolicyAlreadyIncludePackage", + "label": "getStreamsForInputType", "description": [], "signature": [ - "(agentPolicy: ", + "(inputType: string, packageInfo: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.AgentPolicy", - "text": "AgentPolicy" + "section": "def-common.PackageInfo", + "text": "PackageInfo" }, - ", packageName: string) => boolean" + ", dataStreamPaths?: string[]) => (", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryStream", + "text": "RegistryStream" + }, + " & { data_stream: { type: string; dataset: string; }; })[]" ], "source": { - "path": "x-pack/plugins/fleet/common/services/limited_package.ts", - "lineNumber": 15 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 22 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.doesAgentPolicyAlreadyIncludePackage.$1", - "type": "Object", + "id": "def-common.getStreamsForInputType.$1", + "type": "string", "tags": [], - "label": "agentPolicy", + "label": "inputType", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 23 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.getStreamsForInputType.$2", + "type": "CompoundType", + "tags": [], + "label": "packageInfo", "description": [], "signature": [ { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.AgentPolicy", - "text": "AgentPolicy" + "section": "def-common.PackageInfo", + "text": "PackageInfo" } ], "source": { - "path": "x-pack/plugins/fleet/common/services/limited_package.ts", - "lineNumber": 16 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 24 }, "deprecated": false, "isRequired": true }, { "parentPluginId": "fleet", - "id": "def-common.doesAgentPolicyAlreadyIncludePackage.$2", - "type": "string", + "id": "def-common.getStreamsForInputType.$3", + "type": "Array", "tags": [], - "label": "packageName", + "label": "dataStreamPaths", "description": [], "signature": [ - "string" + "string[]" ], "source": { - "path": "x-pack/plugins/fleet/common/services/limited_package.ts", - "lineNumber": 17 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 25 }, "deprecated": false, "isRequired": true @@ -5400,275 +6417,100 @@ }, { "parentPluginId": "fleet", - "id": "def-common.doesPackageHaveIntegrations", + "id": "def-common.isAgentUpgradeable", "type": "Function", "tags": [], - "label": "doesPackageHaveIntegrations", + "label": "isAgentUpgradeable", "description": [], "signature": [ - "(pkgInfo: ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.Installed", - "text": "Installed" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.NotInstalled", - "text": "NotInstalled" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.Installed", - "text": "Installed" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.ArchivePackage", - "text": "ArchivePackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.NotInstalled", - "text": "NotInstalled" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.ArchivePackage", - "text": "ArchivePackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | (Pick<", + "(agent: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" + "section": "def-common.Agent", + "text": "Agent" }, - ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"installed\"; savedObject: ", - "SavedObject", - "<", + ", kibanaVersion: string) => boolean" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.Installation", - "text": "Installation" + "parentPluginId": "fleet", + "id": "def-common.isAgentUpgradeable.$1", + "type": "Object", + "tags": [], + "label": "agent", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.Agent", + "text": "Agent" + } + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts", + "lineNumber": 13 + }, + "deprecated": false, + "isRequired": true }, - ">; } & { integration?: string | undefined; id: string; }) | (Pick<", { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"not_installed\"; } & { integration?: string | undefined; id: string; })) => boolean" + "parentPluginId": "fleet", + "id": "def-common.isAgentUpgradeable.$2", + "type": "string", + "tags": [], + "label": "kibanaVersion", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts", + "lineNumber": 13 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.isDiffPathProtocol", + "type": "Function", + "tags": [], + "label": "isDiffPathProtocol", + "description": [], + "signature": [ + "(kibanaUrls: string[]) => boolean" ], "source": { - "path": "x-pack/plugins/fleet/common/services/packages_with_integrations.ts", + "path": "x-pack/plugins/fleet/common/services/is_diff_path_protocol.ts", "lineNumber": 9 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.doesPackageHaveIntegrations.$1", - "type": "CompoundType", + "id": "def-common.isDiffPathProtocol.$1", + "type": "Array", "tags": [], - "label": "pkgInfo", + "label": "kibanaUrls", "description": [], "signature": [ - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.Installed", - "text": "Installed" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.NotInstalled", - "text": "NotInstalled" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.Installed", - "text": "Installed" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.ArchivePackage", - "text": "ArchivePackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.NotInstalled", - "text": "NotInstalled" - }, - "<Merge<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.ArchivePackage", - "text": "ArchivePackage" - }, - ", ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.EpmPackageAdditions", - "text": "EpmPackageAdditions" - }, - ">> | (Pick<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"installed\"; savedObject: ", - "SavedObject", - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.Installation", - "text": "Installation" - }, - ">; } & { integration?: string | undefined; id: string; }) | (Pick<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.RegistryPackage", - "text": "RegistryPackage" - }, - ", \"type\" | \"description\" | \"title\" | \"name\" | \"version\" | \"download\" | \"path\" | \"internal\" | \"data_streams\" | \"release\" | \"icons\" | \"policy_templates\"> & { status: \"not_installed\"; } & { integration?: string | undefined; id: string; })" + "string[]" ], "source": { - "path": "x-pack/plugins/fleet/common/services/packages_with_integrations.ts", + "path": "x-pack/plugins/fleet/common/services/is_diff_path_protocol.ts", "lineNumber": 9 }, "deprecated": false, @@ -5680,83 +6522,121 @@ }, { "parentPluginId": "fleet", - "id": "def-common.entries", + "id": "def-common.isPackageLimited", "type": "Function", "tags": [], - "label": "entries", + "label": "isPackageLimited", "description": [], "signature": [ - "<T>(o: T) => [keyof T, T[keyof T]][]" + "(packageInfo: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackageInfo", + "text": "PackageInfo" + }, + ") => boolean" ], "source": { - "path": "x-pack/plugins/fleet/common/types/index.ts", - "lineNumber": 35 + "path": "x-pack/plugins/fleet/common/services/limited_package.ts", + "lineNumber": 10 }, "deprecated": false, - "returnComment": [], "children": [ { "parentPluginId": "fleet", - "id": "def-common.o", - "type": "Uncategorized", + "id": "def-common.isPackageLimited.$1", + "type": "CompoundType", "tags": [], - "label": "o", + "label": "packageInfo", "description": [], "signature": [ - "T" + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackageInfo", + "text": "PackageInfo" + } ], "source": { - "path": "x-pack/plugins/fleet/common/types/index.ts", - "lineNumber": 35 + "path": "x-pack/plugins/fleet/common/services/limited_package.ts", + "lineNumber": 10 }, - "deprecated": false + "deprecated": false, + "isRequired": true } ], + "returnComment": [], "initialIsOpen": false }, { "parentPluginId": "fleet", - "id": "def-common.fullAgentPolicyToYaml", + "id": "def-common.isValidNamespace", "type": "Function", "tags": [], - "label": "fullAgentPolicyToYaml", + "label": "isValidNamespace", "description": [], "signature": [ - "(policy: ", + "(namespace: string) => { valid: boolean; error?: string | undefined; }" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/is_valid_namespace.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.FullAgentPolicy", - "text": "FullAgentPolicy" - }, - ") => string" + "parentPluginId": "fleet", + "id": "def-common.isValidNamespace.$1", + "type": "string", + "tags": [], + "label": "namespace", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/is_valid_namespace.ts", + "lineNumber": 13 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.normalizeHostsForAgents", + "type": "Function", + "tags": [], + "label": "normalizeHostsForAgents", + "description": [], + "signature": [ + "(host: string) => string" ], "source": { - "path": "x-pack/plugins/fleet/common/services/full_agent_policy_to_yaml.ts", - "lineNumber": 28 + "path": "x-pack/plugins/fleet/common/services/hosts_utils.ts", + "lineNumber": 22 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.fullAgentPolicyToYaml.$1", - "type": "Object", + "id": "def-common.normalizeHostsForAgents.$1", + "type": "string", "tags": [], - "label": "policy", + "label": "host", "description": [], "signature": [ - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.FullAgentPolicy", - "text": "FullAgentPolicy" - } + "string" ], "source": { - "path": "x-pack/plugins/fleet/common/services/full_agent_policy_to_yaml.ts", - "lineNumber": 28 + "path": "x-pack/plugins/fleet/common/services/hosts_utils.ts", + "lineNumber": 22 }, "deprecated": false, "isRequired": true @@ -5767,104 +6647,161 @@ }, { "parentPluginId": "fleet", - "id": "def-common.isAgentUpgradeable", + "id": "def-common.packageToPackagePolicy", "type": "Function", "tags": [], - "label": "isAgentUpgradeable", - "description": [], + "label": "packageToPackagePolicy", + "description": [ + "\nBuilds a `NewPackagePolicy` structure based on a package\n" + ], "signature": [ - "(agent: ", + "(packageInfo: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.Agent", - "text": "Agent" + "section": "def-common.PackageInfo", + "text": "PackageInfo" }, - ", kibanaVersion: string) => boolean" + ", agentPolicyId: string, outputId: string, namespace?: string, packagePolicyName?: string | undefined, description?: string | undefined, integrationToEnable?: string | undefined) => ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + } ], "source": { - "path": "x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts", - "lineNumber": 13 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 162 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.isAgentUpgradeable.$1", - "type": "Object", + "id": "def-common.packageToPackagePolicy.$1", + "type": "CompoundType", "tags": [], - "label": "agent", + "label": "packageInfo", "description": [], "signature": [ { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.Agent", - "text": "Agent" + "section": "def-common.PackageInfo", + "text": "PackageInfo" } ], "source": { - "path": "x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts", - "lineNumber": 13 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 163 }, "deprecated": false, "isRequired": true }, { "parentPluginId": "fleet", - "id": "def-common.isAgentUpgradeable.$2", + "id": "def-common.packageToPackagePolicy.$2", "type": "string", "tags": [], - "label": "kibanaVersion", + "label": "agentPolicyId", "description": [], "signature": [ "string" ], "source": { - "path": "x-pack/plugins/fleet/common/services/is_agent_upgradeable.ts", - "lineNumber": 13 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 164 }, "deprecated": false, "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "fleet", - "id": "def-common.isDiffPathProtocol", - "type": "Function", - "tags": [], - "label": "isDiffPathProtocol", - "description": [], - "signature": [ - "(kibanaUrls: string[]) => boolean" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/is_diff_path_protocol.ts", - "lineNumber": 9 - }, - "deprecated": false, - "children": [ + }, { "parentPluginId": "fleet", - "id": "def-common.isDiffPathProtocol.$1", - "type": "Array", + "id": "def-common.packageToPackagePolicy.$3", + "type": "string", "tags": [], - "label": "kibanaUrls", + "label": "outputId", "description": [], "signature": [ - "string[]" + "string" ], "source": { - "path": "x-pack/plugins/fleet/common/services/is_diff_path_protocol.ts", - "lineNumber": 9 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 165 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.packageToPackagePolicy.$4", + "type": "string", + "tags": [], + "label": "namespace", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 166 }, "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.packageToPackagePolicy.$5", + "type": "string", + "tags": [], + "label": "packagePolicyName", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 167 + }, + "deprecated": false, + "isRequired": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.packageToPackagePolicy.$6", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 168 + }, + "deprecated": false, + "isRequired": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.packageToPackagePolicy.$7", + "type": "string", + "tags": [], + "label": "integrationToEnable", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 169 + }, + "deprecated": false, + "isRequired": false } ], "returnComment": [], @@ -5872,10 +6809,10 @@ }, { "parentPluginId": "fleet", - "id": "def-common.isPackageLimited", + "id": "def-common.packageToPackagePolicyInputs", "type": "Function", "tags": [], - "label": "isPackageLimited", + "label": "packageToPackagePolicyInputs", "description": [], "signature": [ "(packageInfo: ", @@ -5886,17 +6823,25 @@ "section": "def-common.PackageInfo", "text": "PackageInfo" }, - ") => boolean" + ", integrationToEnable?: string | undefined) => ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicyInput", + "text": "NewPackagePolicyInput" + }, + "[]" ], "source": { - "path": "x-pack/plugins/fleet/common/services/limited_package.ts", - "lineNumber": 11 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 68 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.isPackageLimited.$1", + "id": "def-common.packageToPackagePolicyInputs.$1", "type": "CompoundType", "tags": [], "label": "packageInfo", @@ -5911,11 +6856,28 @@ } ], "source": { - "path": "x-pack/plugins/fleet/common/services/limited_package.ts", - "lineNumber": 11 + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 69 }, "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.packageToPackagePolicyInputs.$2", + "type": "string", + "tags": [], + "label": "integrationToEnable", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", + "lineNumber": 70 + }, + "deprecated": false, + "isRequired": false } ], "returnComment": [], @@ -5923,33 +6885,56 @@ }, { "parentPluginId": "fleet", - "id": "def-common.isValidNamespace", + "id": "def-common.storedPackagePoliciesToAgentInputs", "type": "Function", "tags": [], - "label": "isValidNamespace", + "label": "storedPackagePoliciesToAgentInputs", "description": [], "signature": [ - "(namespace: string) => { valid: boolean; error?: string | undefined; }" + "(packagePolicies: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + "[]) => ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.FullAgentPolicyInput", + "text": "FullAgentPolicyInput" + }, + "[]" ], "source": { - "path": "x-pack/plugins/fleet/common/services/is_valid_namespace.ts", + "path": "x-pack/plugins/fleet/common/services/package_policies_to_agent_inputs.ts", "lineNumber": 13 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.isValidNamespace.$1", - "type": "string", + "id": "def-common.storedPackagePoliciesToAgentInputs.$1", + "type": "Array", "tags": [], - "label": "namespace", + "label": "packagePolicies", "description": [], "signature": [ - "string" + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicy", + "text": "PackagePolicy" + }, + "[]" ], "source": { - "path": "x-pack/plugins/fleet/common/services/is_valid_namespace.ts", - "lineNumber": 13 + "path": "x-pack/plugins/fleet/common/services/package_policies_to_agent_inputs.ts", + "lineNumber": 14 }, "deprecated": false, "isRequired": true @@ -5960,15 +6945,21 @@ }, { "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy", - "type": "Function", - "tags": [], - "label": "packageToPackagePolicy", - "description": [ - "\nBuilds a `NewPackagePolicy` structure based on a package\n" - ], + "id": "def-common.validatePackagePolicy", + "type": "Function", + "tags": [], + "label": "validatePackagePolicy", + "description": [], "signature": [ - "(packageInfo: ", + "(packagePolicy: ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" + }, + ", packageInfo: ", { "pluginId": "fleet", "scope": "common", @@ -5976,128 +6967,66 @@ "section": "def-common.PackageInfo", "text": "PackageInfo" }, - ", agentPolicyId: string, outputId: string, namespace?: string, packagePolicyName?: string | undefined, description?: string | undefined) => ", + ") => ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.NewPackagePolicy", - "text": "NewPackagePolicy" + "section": "def-common.PackagePolicyValidationResults", + "text": "PackagePolicyValidationResults" } ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 116 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 48 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy.$1", - "type": "CompoundType", + "id": "def-common.validatePackagePolicy.$1", + "type": "Object", "tags": [], - "label": "packageInfo", + "label": "packagePolicy", "description": [], "signature": [ { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.PackageInfo", - "text": "PackageInfo" + "section": "def-common.NewPackagePolicy", + "text": "NewPackagePolicy" } ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 117 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy.$2", - "type": "string", - "tags": [], - "label": "agentPolicyId", - "description": [], - "signature": [ - "string" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 118 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy.$3", - "type": "string", - "tags": [], - "label": "outputId", - "description": [], - "signature": [ - "string" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 119 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 49 }, "deprecated": false, "isRequired": true }, { "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy.$4", - "type": "string", + "id": "def-common.validatePackagePolicy.$2", + "type": "CompoundType", "tags": [], - "label": "namespace", + "label": "packageInfo", "description": [], "signature": [ - "string" + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackageInfo", + "text": "PackageInfo" + } ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 120 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 50 }, "deprecated": false, "isRequired": true - }, - { - "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy.$5", - "type": "string", - "tags": [], - "label": "packagePolicyName", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 121 - }, - "deprecated": false, - "isRequired": false - }, - { - "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicy.$6", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 122 - }, - "deprecated": false, - "isRequired": false } ], "returnComment": [], @@ -6105,55 +7034,78 @@ }, { "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicyInputs", + "id": "def-common.validatePackagePolicyConfig", "type": "Function", "tags": [], - "label": "packageToPackagePolicyInputs", + "label": "validatePackagePolicyConfig", "description": [], "signature": [ - "(packageInfo: ", + "(configEntry: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.PackageInfo", - "text": "PackageInfo" + "section": "def-common.PackagePolicyConfigRecordEntry", + "text": "PackagePolicyConfigRecordEntry" }, - ") => ", + ", varDef: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.NewPackagePolicyInput", - "text": "NewPackagePolicyInput" + "section": "def-common.RegistryVarsEntry", + "text": "RegistryVarsEntry" }, - "[]" + ") => string[] | null" ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 61 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 186 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.packageToPackagePolicyInputs.$1", - "type": "CompoundType", + "id": "def-common.validatePackagePolicyConfig.$1", + "type": "Object", "tags": [], - "label": "packageInfo", + "label": "configEntry", "description": [], "signature": [ { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.PackageInfo", - "text": "PackageInfo" + "section": "def-common.PackagePolicyConfigRecordEntry", + "text": "PackagePolicyConfigRecordEntry" } ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_to_package_policy.ts", - "lineNumber": 62 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 187 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-common.validatePackagePolicyConfig.$2", + "type": "Object", + "tags": [], + "label": "varDef", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryVarsEntry", + "text": "RegistryVarsEntry" + } + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 188 }, "deprecated": false, "isRequired": true @@ -6164,56 +7116,79 @@ }, { "parentPluginId": "fleet", - "id": "def-common.storedPackagePoliciesToAgentInputs", + "id": "def-common.validationHasErrors", "type": "Function", "tags": [], - "label": "storedPackagePoliciesToAgentInputs", + "label": "validationHasErrors", "description": [], "signature": [ - "(packagePolicies: ", + "(validationResults: ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" }, - "[]) => ", + " | ", { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.FullAgentPolicyInput", - "text": "FullAgentPolicyInput" + "section": "def-common.PackagePolicyValidationResults", + "text": "PackagePolicyValidationResults" }, - "[]" + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyInputValidationResults", + "text": "PackagePolicyInputValidationResults" + }, + ") => boolean" ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_policies_to_agent_inputs.ts", - "lineNumber": 11 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 283 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", - "id": "def-common.storedPackagePoliciesToAgentInputs.$1", - "type": "Array", + "id": "def-common.validationHasErrors.$1", + "type": "CompoundType", "tags": [], - "label": "packagePolicies", + "label": "validationResults", "description": [], "signature": [ { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" }, - "[]" + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyValidationResults", + "text": "PackagePolicyValidationResults" + }, + " | ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyInputValidationResults", + "text": "PackagePolicyInputValidationResults" + } ], "source": { - "path": "x-pack/plugins/fleet/common/services/package_policies_to_agent_inputs.ts", - "lineNumber": 12 + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 284 }, "deprecated": false, "isRequired": true @@ -6505,7 +7480,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false, "children": [ @@ -6518,7 +7493,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 28 + "lineNumber": 29 }, "deprecated": false }, @@ -6534,7 +7509,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 29 + "lineNumber": 30 }, "deprecated": false }, @@ -6558,7 +7533,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 30 + "lineNumber": 31 }, "deprecated": false }, @@ -6571,7 +7546,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 31 + "lineNumber": 32 }, "deprecated": false }, @@ -6584,7 +7559,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 32 + "lineNumber": 33 }, "deprecated": false }, @@ -6597,7 +7572,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 33 + "lineNumber": 34 }, "deprecated": false }, @@ -6610,7 +7585,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 34 + "lineNumber": 35 }, "deprecated": false } @@ -6809,7 +7784,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 236 + "lineNumber": 241 }, "deprecated": false, "children": [ @@ -6822,7 +7797,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 237 + "lineNumber": 242 }, "deprecated": false }, @@ -6838,7 +7813,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 238 + "lineNumber": 243 }, "deprecated": false }, @@ -6854,7 +7829,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 239 + "lineNumber": 244 }, "deprecated": false }, @@ -6866,7 +7841,7 @@ "label": "type", "description": [], "signature": [ - "\"input\" | ", + "\"input\" | \"doc\" | \"notice\" | ", { "pluginId": "fleet", "scope": "common", @@ -6885,7 +7860,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 240 + "lineNumber": 245 }, "deprecated": false }, @@ -6898,7 +7873,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 241 + "lineNumber": 246 }, "deprecated": false } @@ -7122,7 +8097,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 229 + "lineNumber": 234 }, "deprecated": false, "children": [ @@ -7135,7 +8110,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 230 + "lineNumber": 235 }, "deprecated": false }, @@ -7148,7 +8123,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 231 + "lineNumber": 236 }, "deprecated": false }, @@ -7161,7 +8136,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 232 + "lineNumber": 237 }, "deprecated": false } @@ -8040,7 +9015,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 335 + "lineNumber": 347 }, "deprecated": false, "children": [ @@ -8053,7 +9028,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 336 + "lineNumber": 348 }, "deprecated": false }, @@ -8066,7 +9041,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 337 + "lineNumber": 349 }, "deprecated": false }, @@ -8114,7 +9089,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 338 + "lineNumber": 350 }, "deprecated": false }, @@ -8130,7 +9105,23 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 339 + "lineNumber": 351 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.EpmPackageAdditions.notice", + "type": "string", + "tags": [], + "label": "notice", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 352 }, "deprecated": false } @@ -8239,22 +9230,38 @@ "id": "def-common.FleetConfigType.packages", "type": "Array", "tags": [], - "label": "packages", + "label": "packages", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyPackage", + "text": "PackagePolicyPackage" + }, + ", \"name\" | \"version\">[] | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.FleetConfigType.agentIdVerificationEnabled", + "type": "CompoundType", + "tags": [], + "label": "agentIdVerificationEnabled", "description": [], "signature": [ - "Pick<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicyPackage", - "text": "PackagePolicyPackage" - }, - ", \"name\" | \"version\">[] | undefined" + "boolean | undefined" ], "source": { "path": "x-pack/plugins/fleet/common/types/index.ts", - "lineNumber": 27 + "lineNumber": 28 }, "deprecated": false } @@ -9141,7 +10148,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 114 + "lineNumber": 115 }, "deprecated": false, "children": [ @@ -9159,7 +10166,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 118 + "lineNumber": 119 }, "deprecated": false }, @@ -9174,7 +10181,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 122 + "lineNumber": 123 }, "deprecated": false }, @@ -9189,7 +10196,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 126 + "lineNumber": 127 }, "deprecated": false }, @@ -9204,7 +10211,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 130 + "lineNumber": 131 }, "deprecated": false }, @@ -9222,7 +10229,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 134 + "lineNumber": 135 }, "deprecated": false }, @@ -9237,7 +10244,25 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 140 + "lineNumber": 141 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.FleetServerPolicy.unenroll_timeout", + "type": "number", + "tags": [], + "label": "unenroll_timeout", + "description": [ + "\nAuto unenroll any Elastic Agents which have not checked in for this many seconds" + ], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "lineNumber": 145 }, "deprecated": false } @@ -9253,7 +10278,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 73 + "lineNumber": 74 }, "deprecated": false, "children": [ @@ -9266,7 +10291,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 74 + "lineNumber": 75 }, "deprecated": false }, @@ -9290,7 +10315,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 75 + "lineNumber": 76 }, "deprecated": false }, @@ -9314,7 +10339,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 80 + "lineNumber": 81 }, "deprecated": false }, @@ -9338,7 +10363,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 83 + "lineNumber": 84 }, "deprecated": false }, @@ -9361,7 +10386,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 90 + "lineNumber": 91 }, "deprecated": false }, @@ -9377,7 +10402,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 91 + "lineNumber": 92 }, "deprecated": false }, @@ -9393,7 +10418,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 92 + "lineNumber": 93 }, "deprecated": false } @@ -9409,7 +10434,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 48 + "lineNumber": 49 }, "deprecated": false, "children": [ @@ -9422,7 +10447,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false }, @@ -9435,7 +10460,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 50 + "lineNumber": 51 }, "deprecated": false }, @@ -9448,7 +10473,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 51 + "lineNumber": 52 }, "deprecated": false }, @@ -9461,7 +10486,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 52 + "lineNumber": 53 }, "deprecated": false }, @@ -9477,7 +10502,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 53 + "lineNumber": 54 }, "deprecated": false }, @@ -9490,7 +10515,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false }, @@ -9514,7 +10539,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 55 + "lineNumber": 56 }, "deprecated": false }, @@ -9537,7 +10562,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 59 + "lineNumber": 60 }, "deprecated": false }, @@ -9553,7 +10578,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false } @@ -9569,7 +10594,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 39 + "lineNumber": 40 }, "deprecated": false, "children": [ @@ -9582,7 +10607,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false }, @@ -9598,7 +10623,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false }, @@ -9614,7 +10639,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 45 + "lineNumber": 46 }, "deprecated": false } @@ -9630,7 +10655,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 103 + "lineNumber": 104 }, "deprecated": false, "children": [ @@ -9646,7 +10671,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 104 + "lineNumber": 105 }, "deprecated": false }, @@ -9659,7 +10684,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 105 + "lineNumber": 106 }, "deprecated": false }, @@ -9675,7 +10700,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 106 + "lineNumber": 107 }, "deprecated": false } @@ -9691,7 +10716,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 63 + "lineNumber": 64 }, "deprecated": false, "children": [ @@ -9707,7 +10732,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 64 + "lineNumber": 65 }, "deprecated": false } @@ -11403,7 +12428,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 409 + "lineNumber": 418 }, "deprecated": false, "children": [ @@ -11416,7 +12441,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 410 + "lineNumber": 419 }, "deprecated": false }, @@ -11432,7 +12457,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 411 + "lineNumber": 420 }, "deprecated": false }, @@ -11448,7 +12473,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 412 + "lineNumber": 421 }, "deprecated": false }, @@ -11464,7 +12489,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 416 + "lineNumber": 425 }, "deprecated": false }, @@ -11480,7 +12505,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 417 + "lineNumber": 426 }, "deprecated": false }, @@ -11496,7 +12521,58 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 418 + "lineNumber": 427 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.IndexTemplateEntry", + "type": "Interface", + "tags": [], + "label": "IndexTemplateEntry", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 430 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.IndexTemplateEntry.templateName", + "type": "string", + "tags": [], + "label": "templateName", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 431 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.IndexTemplateEntry.indexTemplate", + "type": "Object", + "tags": [], + "label": "indexTemplate", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.IndexTemplate", + "text": "IndexTemplate" + } + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 432 }, "deprecated": false } @@ -11512,7 +12588,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 402 + "lineNumber": 411 }, "deprecated": false, "children": [ @@ -11528,7 +12604,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 403 + "lineNumber": 412 }, "deprecated": false } @@ -11555,7 +12631,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 357 + "lineNumber": 370 }, "deprecated": false, "children": [ @@ -11578,7 +12654,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 358 + "lineNumber": 371 }, "deprecated": false }, @@ -11601,7 +12677,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 359 + "lineNumber": 372 }, "deprecated": false }, @@ -11624,7 +12700,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 360 + "lineNumber": 373 }, "deprecated": false }, @@ -11640,7 +12716,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 361 + "lineNumber": 374 }, "deprecated": false }, @@ -11653,7 +12729,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 362 + "lineNumber": 375 }, "deprecated": false }, @@ -11666,7 +12742,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 363 + "lineNumber": 376 }, "deprecated": false }, @@ -11682,7 +12758,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 364 + "lineNumber": 377 }, "deprecated": false }, @@ -11695,7 +12771,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 365 + "lineNumber": 378 }, "deprecated": false }, @@ -11708,7 +12784,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 366 + "lineNumber": 379 }, "deprecated": false }, @@ -11724,7 +12800,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 367 + "lineNumber": 380 }, "deprecated": false } @@ -12327,6 +13403,22 @@ }, "deprecated": false }, + { + "parentPluginId": "fleet", + "id": "def-common.NewAgentPolicy.unenroll_timeout", + "type": "number", + "tags": [], + "label": "unenroll_timeout", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "lineNumber": 24 + }, + "deprecated": false + }, { "parentPluginId": "fleet", "id": "def-common.NewAgentPolicy.is_preconfigured", @@ -12339,7 +13431,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 24 + "lineNumber": 25 }, "deprecated": false } @@ -12493,7 +13585,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 52 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -12506,7 +13598,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 53 + "lineNumber": 54 }, "deprecated": false }, @@ -12522,7 +13614,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false }, @@ -12535,7 +13627,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 55 + "lineNumber": 56 }, "deprecated": false }, @@ -12548,7 +13640,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 56 + "lineNumber": 57 }, "deprecated": false }, @@ -12561,7 +13653,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 57 + "lineNumber": 58 }, "deprecated": false }, @@ -12574,7 +13666,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 58 + "lineNumber": 59 }, "deprecated": false }, @@ -12597,7 +13689,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 59 + "lineNumber": 60 }, "deprecated": false }, @@ -12620,7 +13712,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 60 + "lineNumber": 61 }, "deprecated": false }, @@ -12644,7 +13736,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 61 + "lineNumber": 62 }, "deprecated": false } @@ -12677,6 +13769,22 @@ }, "deprecated": false }, + { + "parentPluginId": "fleet", + "id": "def-common.NewPackagePolicyInput.policy_template", + "type": "string", + "tags": [], + "label": "policy_template", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", + "lineNumber": 40 + }, + "deprecated": false + }, { "parentPluginId": "fleet", "id": "def-common.NewPackagePolicyInput.enabled", @@ -12686,7 +13794,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false }, @@ -12702,7 +13810,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false }, @@ -12726,7 +13834,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 42 + "lineNumber": 43 }, "deprecated": false }, @@ -12750,7 +13858,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 43 + "lineNumber": 44 }, "deprecated": false }, @@ -12773,7 +13881,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 44 + "lineNumber": 45 }, "deprecated": false } @@ -12912,11 +14020,11 @@ "section": "def-common.NewPackagePolicy", "text": "NewPackagePolicy" }, - ", \"enabled\" | \"description\" | \"name\" | \"package\" | \"namespace\" | \"policy_id\" | \"output_id\" | \"vars\">" + ", \"enabled\" | \"description\" | \"name\" | \"package\" | \"policy_id\" | \"namespace\" | \"output_id\" | \"vars\">" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 68 + "lineNumber": 69 }, "deprecated": false, "children": [ @@ -12929,7 +14037,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 69 + "lineNumber": 70 }, "deprecated": false }, @@ -12952,7 +14060,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 70 + "lineNumber": 71 }, "deprecated": false }, @@ -12968,7 +14076,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 71 + "lineNumber": 72 }, "deprecated": false }, @@ -12981,7 +14089,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 72 + "lineNumber": 73 }, "deprecated": false }, @@ -12994,7 +14102,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 73 + "lineNumber": 74 }, "deprecated": false }, @@ -13007,7 +14115,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 74 + "lineNumber": 75 }, "deprecated": false }, @@ -13020,7 +14128,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 75 + "lineNumber": 76 }, "deprecated": false }, @@ -13033,7 +14141,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 76 + "lineNumber": 77 }, "deprecated": false } @@ -13104,6 +14212,38 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.PackagePolicyConfigValidationResults", + "type": "Interface", + "tags": [], + "label": "PackagePolicyConfigValidationResults", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.PackagePolicyConfigValidationResults.vars", + "type": "Object", + "tags": [], + "label": "vars", + "description": [], + "signature": [ + "Record<string, string[] | null> | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 30 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.PackagePolicyInput", @@ -13127,11 +14267,11 @@ "section": "def-common.NewPackagePolicyInput", "text": "NewPackagePolicyInput" }, - ", \"type\" | \"enabled\" | \"config\" | \"vars\" | \"keep_enabled\">" + ", \"type\" | \"enabled\" | \"config\" | \"vars\" | \"policy_template\" | \"keep_enabled\">" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 47 + "lineNumber": 48 }, "deprecated": false, "children": [ @@ -13154,7 +14294,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 48 + "lineNumber": 49 }, "deprecated": false }, @@ -13170,7 +14310,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false } @@ -13723,7 +14863,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 370 + "lineNumber": 383 }, "deprecated": false, "children": [ @@ -13736,7 +14876,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 371 + "lineNumber": 384 }, "deprecated": false } @@ -14196,7 +15336,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 67 + "lineNumber": 75 }, "deprecated": false, "children": [ @@ -14212,7 +15352,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 68 + "lineNumber": 76 }, "deprecated": false }, @@ -14228,7 +15368,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 69 + "lineNumber": 77 }, "deprecated": false }, @@ -14244,7 +15384,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 70 + "lineNumber": 78 }, "deprecated": false } @@ -14274,7 +15414,7 @@ "section": "def-common.NewAgentPolicy", "text": "NewAgentPolicy" }, - ", \"description\" | \"name\" | \"is_default\" | \"is_default_fleet_server\" | \"is_managed\" | \"monitoring_enabled\" | \"is_preconfigured\">" + ", \"description\" | \"name\" | \"is_default\" | \"is_default_fleet_server\" | \"is_managed\" | \"monitoring_enabled\" | \"unenroll_timeout\" | \"is_preconfigured\">" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/preconfiguration.ts", @@ -14330,7 +15470,7 @@ "section": "def-common.NewPackagePolicy", "text": "NewPackagePolicy" }, - ", \"enabled\" | \"description\" | \"name\" | \"namespace\" | \"policy_id\" | \"output_id\" | \"vars\">> & { name: string; package: Partial<", + ", \"enabled\" | \"description\" | \"name\" | \"policy_id\" | \"namespace\" | \"output_id\" | \"vars\">> & { name: string; package: Partial<", { "pluginId": "fleet", "scope": "common", @@ -14586,7 +15726,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 281 + "lineNumber": 287 }, "deprecated": false, "children": [ @@ -14599,7 +15739,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 282 + "lineNumber": 288 }, "deprecated": false }, @@ -14615,7 +15755,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 283 + "lineNumber": 289 }, "deprecated": false }, @@ -14631,7 +15771,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 284 + "lineNumber": 290 }, "deprecated": false }, @@ -14644,7 +15784,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 285 + "lineNumber": 291 }, "deprecated": false }, @@ -14657,7 +15797,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 286 + "lineNumber": 292 }, "deprecated": false }, @@ -14670,7 +15810,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 287 + "lineNumber": 293 }, "deprecated": false }, @@ -14693,7 +15833,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 288 + "lineNumber": 294 }, "deprecated": false }, @@ -14706,7 +15846,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 289 + "lineNumber": 295 }, "deprecated": false }, @@ -14719,7 +15859,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 290 + "lineNumber": 296 }, "deprecated": false }, @@ -14735,7 +15875,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 291 + "lineNumber": 297 }, "deprecated": false }, @@ -14758,7 +15898,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 292 + "lineNumber": 298 }, "deprecated": false }, @@ -14774,7 +15914,78 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 293 + "lineNumber": 299 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.RegistryDataStream.RegistryDataStreamKeys.permissions", + "type": "Object", + "tags": [], + "label": "[RegistryDataStreamKeys.permissions]", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.RegistryDataStreamPermissions", + "text": "RegistryDataStreamPermissions" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 300 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.RegistryDataStreamPermissions", + "type": "Interface", + "tags": [], + "label": "RegistryDataStreamPermissions", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 308 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.RegistryDataStreamPermissions.cluster", + "type": "Array", + "tags": [], + "label": "cluster", + "description": [], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 309 + }, + "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.RegistryDataStreamPermissions.indices", + "type": "Array", + "tags": [], + "label": "indices", + "description": [], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 310 }, "deprecated": false } @@ -14790,39 +16001,41 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 296 + "lineNumber": 303 }, "deprecated": false, "children": [ { "parentPluginId": "fleet", "id": "def-common.RegistryElasticsearch.index_template.settings", - "type": "Uncategorized", + "type": "Object", "tags": [], "label": "'index_template.settings'", "description": [], "signature": [ - "object | undefined" + "IndicesIndexSettings", + " | undefined" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 297 + "lineNumber": 304 }, "deprecated": false }, { "parentPluginId": "fleet", "id": "def-common.RegistryElasticsearch.index_template.mappings", - "type": "Uncategorized", + "type": "Object", "tags": [], "label": "'index_template.mappings'", "description": [], "signature": [ - "object | undefined" + "MappingTypeMapping", + " | undefined" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 298 + "lineNumber": 305 }, "deprecated": false } @@ -14855,7 +16068,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 126 + "lineNumber": 131 }, "deprecated": false, "children": [ @@ -14868,7 +16081,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 127 + "lineNumber": 132 }, "deprecated": false } @@ -14884,7 +16097,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 168 + "lineNumber": 173 }, "deprecated": false, "children": [ @@ -14897,7 +16110,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 169 + "lineNumber": 174 }, "deprecated": false }, @@ -14910,7 +16123,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 170 + "lineNumber": 175 }, "deprecated": false }, @@ -14923,7 +16136,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 171 + "lineNumber": 176 }, "deprecated": false }, @@ -14939,7 +16152,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 172 + "lineNumber": 177 }, "deprecated": false }, @@ -14955,7 +16168,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 173 + "lineNumber": 178 }, "deprecated": false }, @@ -14971,7 +16184,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 174 + "lineNumber": 179 }, "deprecated": false }, @@ -14994,7 +16207,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 175 + "lineNumber": 180 }, "deprecated": false } @@ -15010,7 +16223,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 143 + "lineNumber": 148 }, "deprecated": false, "children": [ @@ -15023,7 +16236,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 144 + "lineNumber": 149 }, "deprecated": false }, @@ -15036,7 +16249,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 145 + "lineNumber": 150 }, "deprecated": false }, @@ -15049,7 +16262,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 146 + "lineNumber": 151 }, "deprecated": false }, @@ -15072,7 +16285,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 147 + "lineNumber": 152 }, "deprecated": false }, @@ -15095,7 +16308,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 148 + "lineNumber": 153 }, "deprecated": false }, @@ -15111,7 +16324,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 149 + "lineNumber": 154 }, "deprecated": false }, @@ -15127,7 +16340,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 150 + "lineNumber": 155 }, "deprecated": false }, @@ -15150,7 +16363,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 151 + "lineNumber": 156 }, "deprecated": false }, @@ -15166,7 +16379,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 152 + "lineNumber": 157 }, "deprecated": false }, @@ -15182,7 +16395,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 153 + "lineNumber": 158 }, "deprecated": false } @@ -15198,7 +16411,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 187 + "lineNumber": 192 }, "deprecated": false, "children": [ @@ -15211,7 +16424,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 188 + "lineNumber": 193 }, "deprecated": false }, @@ -15224,7 +16437,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 189 + "lineNumber": 194 }, "deprecated": false }, @@ -15240,7 +16453,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 190 + "lineNumber": 195 }, "deprecated": false }, @@ -15256,7 +16469,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 191 + "lineNumber": 196 }, "deprecated": false }, @@ -15279,7 +16492,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 192 + "lineNumber": 197 }, "deprecated": false }, @@ -15292,7 +16505,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 193 + "lineNumber": 198 }, "deprecated": false } @@ -15308,7 +16521,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 317 + "lineNumber": 329 }, "deprecated": false, "children": [ @@ -15321,7 +16534,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 318 + "lineNumber": 330 }, "deprecated": false }, @@ -15337,7 +16550,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 319 + "lineNumber": 331 }, "deprecated": false }, @@ -15353,7 +16566,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 320 + "lineNumber": 332 }, "deprecated": false }, @@ -15369,7 +16582,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 321 + "lineNumber": 333 }, "deprecated": false }, @@ -15385,7 +16598,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 322 + "lineNumber": 334 }, "deprecated": false }, @@ -15401,7 +16614,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 323 + "lineNumber": 335 }, "deprecated": false }, @@ -15417,7 +16630,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 324 + "lineNumber": 336 }, "deprecated": false }, @@ -15433,7 +16646,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 325 + "lineNumber": 337 }, "deprecated": false }, @@ -15449,7 +16662,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 326 + "lineNumber": 338 }, "deprecated": false } @@ -15465,7 +16678,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 198 + "lineNumber": 203 }, "deprecated": false, "children": [ @@ -15478,7 +16691,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 199 + "lineNumber": 204 }, "deprecated": false } @@ -15565,57 +16778,6 @@ "children": [], "initialIsOpen": false }, - { - "parentPluginId": "fleet", - "id": "def-common.TemplateRef", - "type": "Interface", - "tags": [], - "label": "TemplateRef", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 421 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "fleet", - "id": "def-common.TemplateRef.templateName", - "type": "string", - "tags": [], - "label": "templateName", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 422 - }, - "deprecated": false - }, - { - "parentPluginId": "fleet", - "id": "def-common.TemplateRef.indexTemplate", - "type": "Object", - "tags": [], - "label": "indexTemplate", - "description": [], - "signature": [ - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.IndexTemplate", - "text": "IndexTemplate" - } - ], - "source": { - "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 423 - }, - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "fleet", "id": "def-common.UpdateAgentPolicyResponse", @@ -15728,7 +16890,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 64 + "lineNumber": 65 }, "deprecated": false, "children": [ @@ -15744,7 +16906,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 65 + "lineNumber": 66 }, "deprecated": false } @@ -15762,7 +16924,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 81 + "lineNumber": 86 }, "deprecated": false, "initialIsOpen": false @@ -15790,7 +16952,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 56 + "lineNumber": 61 }, "deprecated": false, "initialIsOpen": false @@ -15804,7 +16966,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 70 + "lineNumber": 75 }, "deprecated": false, "initialIsOpen": false @@ -15818,7 +16980,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 266 + "lineNumber": 271 }, "deprecated": false, "initialIsOpen": false @@ -15832,7 +16994,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 156 + "lineNumber": 161 }, "deprecated": false, "initialIsOpen": false @@ -15846,7 +17008,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 130 + "lineNumber": 135 }, "deprecated": false, "initialIsOpen": false @@ -15860,7 +17022,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 178 + "lineNumber": 183 }, "deprecated": false, "initialIsOpen": false @@ -15874,7 +17036,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 302 + "lineNumber": 314 }, "deprecated": false, "initialIsOpen": false @@ -15915,6 +17077,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_ACTIONS_RESULTS_INDEX", + "type": "string", + "tags": [], + "label": "AGENT_ACTIONS_RESULTS_INDEX", + "description": [], + "signature": [ + "\".fleet-actions-results\"" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/agent.ts", + "lineNumber": 28 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.AGENT_POLICY_API_ROOT", @@ -16251,7 +17430,7 @@ "section": "def-common.AgentPolicyAction", "text": "AgentPolicyAction" }, - ", \"id\" | \"created_at\" | \"policy_id\" | \"policy_revision\" | \"ack_data\" | \"sent_at\"> & { type: \"CONFIG_CHANGE\"; data: { config: ", + ", \"id\" | \"policy_id\" | \"created_at\" | \"policy_revision\" | \"ack_data\" | \"sent_at\"> & { type: \"CONFIG_CHANGE\"; data: { config: ", { "pluginId": "fleet", "scope": "common", @@ -16284,7 +17463,7 @@ "section": "def-common.ValueOf", "text": "ValueOf" }, - "<{ readonly Active: \"active\"; readonly Inactive: \"inactive\"; }>; description?: string | undefined; name: string; updated_at: string; updated_by: string; namespace: string; is_default?: boolean | undefined; package_policies: string[] | ", + "<{ readonly Active: \"active\"; readonly Inactive: \"inactive\"; }>; description?: string | undefined; name: string; updated_at: string; namespace: string; updated_by: string; is_default?: boolean | undefined; package_policies: string[] | ", { "pluginId": "fleet", "scope": "common", @@ -16292,11 +17471,11 @@ "section": "def-common.PackagePolicy", "text": "PackagePolicy" }, - "[]; is_default_fleet_server?: boolean | undefined; is_managed: boolean; monitoring_enabled?: (\"metrics\" | \"logs\")[] | undefined; is_preconfigured?: boolean | undefined; revision: number; }" + "[]; is_default_fleet_server?: boolean | undefined; is_managed: boolean; monitoring_enabled?: (\"metrics\" | \"logs\")[] | undefined; unenroll_timeout?: number | undefined; is_preconfigured?: boolean | undefined; revision: number; }" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false, "initialIsOpen": false @@ -16413,7 +17592,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 94 + "lineNumber": 99 }, "deprecated": false, "initialIsOpen": false @@ -16444,7 +17623,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 385 + "lineNumber": 398 }, "deprecated": false, "initialIsOpen": false @@ -16510,7 +17689,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 244 + "lineNumber": 249 }, "deprecated": false, "initialIsOpen": false @@ -16523,7 +17702,7 @@ "label": "AssetType", "description": [], "signature": [ - "\"input\" | ", + "\"input\" | \"doc\" | \"notice\" | ", { "pluginId": "fleet", "scope": "common", @@ -16542,7 +17721,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 51 + "lineNumber": 52 }, "deprecated": false, "initialIsOpen": false @@ -16591,7 +17770,41 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 243 + "lineNumber": 248 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AUTO_UPDATE_PACKAGES", + "type": "Array", + "tags": [], + "label": "AUTO_UPDATE_PACKAGES", + "description": [], + "signature": [ + "{ name: string; version: string; }[]" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", + "lineNumber": 70 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.autoUpdatePackages", + "type": "Array", + "tags": [], + "label": "autoUpdatePackages", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 40 }, "deprecated": false, "initialIsOpen": false @@ -16639,7 +17852,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 228 + "lineNumber": 233 }, "deprecated": false, "initialIsOpen": false @@ -16663,7 +17876,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 227 + "lineNumber": 232 }, "deprecated": false, "initialIsOpen": false @@ -16694,7 +17907,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 90 + "lineNumber": 95 }, "deprecated": false, "initialIsOpen": false @@ -16707,28 +17920,28 @@ "label": "DEFAULT_PACKAGES", "description": [], "signature": [ - "{ name: \"endpoint\" | \"fleet_server\" | \"system\" | \"elastic_agent\"; version: string; }[]" + "{ name: string; version: string; }[]" ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 59 + "lineNumber": 65 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "fleet", - "id": "def-common.DefaultPackages", - "type": "Type", + "id": "def-common.defaultPackages", + "type": "Array", "tags": [], - "label": "DefaultPackages", + "label": "defaultPackages", "description": [], "signature": [ - "{ readonly System: \"system\"; readonly Endpoint: \"endpoint\"; readonly ElasticAgent: \"elastic_agent\"; readonly FleetServer: \"fleet_server\"; }" + "string[]" ], "source": { - "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 400 + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 38 }, "deprecated": false, "initialIsOpen": false @@ -16758,7 +17971,7 @@ "label": "DetailViewPanelName", "description": [], "signature": [ - "\"custom\" | \"settings\" | \"overview\" | \"policies\"" + "\"custom\" | \"settings\" | \"overview\" | \"policies\" | \"assets\"" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", @@ -16767,6 +17980,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.DocAssetType", + "type": "Type", + "tags": [], + "label": "DocAssetType", + "description": [], + "signature": [ + "\"doc\" | \"notice\"" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 51 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.ElasticsearchAssetParts", @@ -16794,7 +18024,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 255 + "lineNumber": 260 }, "deprecated": false, "initialIsOpen": false @@ -16859,7 +18089,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 261 + "lineNumber": 266 }, "deprecated": false, "initialIsOpen": false @@ -16906,7 +18136,7 @@ "label": "EnrollmentAPIKeySOAttributes", "description": [], "signature": [ - "{ name?: string | undefined; active: boolean; created_at: string; policy_id?: string | undefined; api_key: string; api_key_id: string; }" + "{ name?: string | undefined; active: boolean; policy_id?: string | undefined; created_at: string; api_key: string; api_key_id: string; }" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/enrollment_api_key.ts", @@ -16968,7 +18198,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 390 + "lineNumber": 403 }, "deprecated": false, "initialIsOpen": false @@ -16990,6 +18220,40 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_ELASTIC_AGENT_PACKAGE", + "type": "string", + "tags": [], + "label": "FLEET_ELASTIC_AGENT_PACKAGE", + "description": [], + "signature": [ + "\"elastic_agent\"" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_ENDPOINT_PACKAGE", + "type": "string", + "tags": [], + "label": "FLEET_ENDPOINT_PACKAGE", + "description": [], + "signature": [ + "\"endpoint\"" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 15 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.FLEET_SERVER_ARTIFACTS_INDEX", @@ -17053,7 +18317,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 12 + "lineNumber": 14 }, "deprecated": false, "initialIsOpen": false @@ -17075,6 +18339,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_SYSTEM_PACKAGE", + "type": "string", + "tags": [], + "label": "FLEET_SYSTEM_PACKAGE", + "description": [], + "signature": [ + "\"system\"" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.GetAgentPoliciesResponseItem", @@ -17190,7 +18471,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 374 + "lineNumber": 387 }, "deprecated": false, "initialIsOpen": false @@ -17221,7 +18502,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 92 + "lineNumber": 97 }, "deprecated": false, "initialIsOpen": false @@ -17265,7 +18546,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 376 + "lineNumber": 389 }, "deprecated": false, "initialIsOpen": false @@ -17348,7 +18629,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 250 + "lineNumber": 255 }, "deprecated": false, "initialIsOpen": false @@ -17375,7 +18656,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 387 + "lineNumber": 400 }, "deprecated": false, "initialIsOpen": false @@ -17456,7 +18737,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 260 + "lineNumber": 265 }, "deprecated": false, "initialIsOpen": false @@ -17495,6 +18776,40 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.MonitoringType", + "type": "Type", + "tags": [], + "label": "MonitoringType", + "description": [], + "signature": [ + "(\"metrics\" | \"logs\")[]" + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "lineNumber": 96 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.monitoringTypes", + "type": "Array", + "tags": [], + "label": "monitoringTypes", + "description": [], + "signature": [ + "(\"metrics\" | \"logs\")[]" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 52 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.NotInstalled", @@ -17507,7 +18822,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 381 + "lineNumber": 394 }, "deprecated": false, "initialIsOpen": false @@ -17638,7 +18953,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 394 + "lineNumber": 407 }, "deprecated": false, "initialIsOpen": false @@ -17750,7 +19065,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 353 + "lineNumber": 366 }, "deprecated": false, "initialIsOpen": false @@ -17774,7 +19089,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 346 + "lineNumber": 359 }, "deprecated": false, "initialIsOpen": false @@ -17817,7 +19132,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 347 + "lineNumber": 360 }, "deprecated": false, "initialIsOpen": false @@ -17847,6 +19162,38 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.PackagePolicyInputValidationResults", + "type": "Type", + "tags": [], + "label": "PackagePolicyInputValidationResults", + "description": [], + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" + }, + " & { streams?: Record<string, ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" + }, + "> | undefined; }" + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 33 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.PackagePolicySOAttributes", @@ -17863,7 +19210,7 @@ "section": "def-common.PackagePolicyPackage", "text": "PackagePolicyPackage" }, - " | undefined; updated_at: string; created_at: string; created_by: string; updated_by: string; namespace: string; inputs: ", + " | undefined; updated_at: string; policy_id: string; inputs: ", { "pluginId": "fleet", "scope": "common", @@ -17871,7 +19218,7 @@ "section": "def-common.PackagePolicyInput", "text": "PackagePolicyInput" }, - "[]; policy_id: string; output_id: string; vars?: Record<string, ", + "[]; namespace: string; output_id: string; vars?: Record<string, ", { "pluginId": "fleet", "scope": "common", @@ -17879,11 +19226,43 @@ "section": "def-common.PackagePolicyConfigRecordEntry", "text": "PackagePolicyConfigRecordEntry" }, - "> | undefined; revision: number; }" + "> | undefined; created_at: string; created_by: string; updated_by: string; revision: number; }" ], "source": { "path": "x-pack/plugins/fleet/common/types/models/package_policy.ts", - "lineNumber": 79 + "lineNumber": 80 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.PackagePolicyValidationResults", + "type": "Type", + "tags": [], + "label": "PackagePolicyValidationResults", + "description": [], + "signature": [ + "{ name: string[] | null; description: string[] | null; namespace: string[] | null; inputs: Record<string, ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyInputValidationResults", + "text": "PackagePolicyInputValidationResults" + }, + "> | null; } & ", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.PackagePolicyConfigValidationResults", + "text": "PackagePolicyConfigValidationResults" + } + ], + "source": { + "path": "x-pack/plugins/fleet/common/services/validate_package_policy.ts", + "lineNumber": 37 }, "deprecated": false, "initialIsOpen": false @@ -17933,7 +19312,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 352 + "lineNumber": 365 }, "deprecated": false, "initialIsOpen": false @@ -18052,7 +19431,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 12 + "lineNumber": 18 }, "deprecated": false, "initialIsOpen": false @@ -18069,7 +19448,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 15 + "lineNumber": 21 }, "deprecated": false, "initialIsOpen": false @@ -18103,7 +19482,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 166 + "lineNumber": 171 }, "deprecated": false, "initialIsOpen": false @@ -18135,7 +19514,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 98 + "lineNumber": 103 }, "deprecated": false, "initialIsOpen": false @@ -18152,7 +19531,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 125 + "lineNumber": 130 }, "deprecated": false, "initialIsOpen": false @@ -18201,7 +19580,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 207 + "lineNumber": 212 }, "deprecated": false, "initialIsOpen": false @@ -18226,7 +19605,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 205 + "lineNumber": 210 }, "deprecated": false, "initialIsOpen": false @@ -18243,41 +19622,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 301 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "fleet", - "id": "def-common.REQUIRED_PACKAGES", - "type": "Array", - "tags": [], - "label": "REQUIRED_PACKAGES", - "description": [], - "signature": [ - "{ name: \"endpoint\" | \"fleet_server\" | \"system\" | \"elastic_agent\"; version: string; }[]" - ], - "source": { - "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 65 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "fleet", - "id": "def-common.RequiredPackage", - "type": "Type", - "tags": [], - "label": "RequiredPackage", - "description": [], - "signature": [ - "{ readonly System: \"system\"; readonly Endpoint: \"endpoint\"; readonly ElasticAgent: \"elastic_agent\"; readonly FleetServer: \"fleet_server\"; }" - ], - "source": { - "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 398 + "lineNumber": 313 }, "deprecated": false, "initialIsOpen": false @@ -18294,7 +19639,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 235 + "lineNumber": 240 }, "deprecated": false, "initialIsOpen": false @@ -18311,7 +19656,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 196 + "lineNumber": 201 }, "deprecated": false, "initialIsOpen": false @@ -18328,7 +19673,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 197 + "lineNumber": 202 }, "deprecated": false, "initialIsOpen": false @@ -18359,7 +19704,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 223 + "lineNumber": 228 }, "deprecated": false, "initialIsOpen": false @@ -18429,6 +19774,23 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.unremovablePackages", + "type": "Array", + "tags": [], + "label": "unremovablePackages", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "lineNumber": 31 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.UpdateAgentPolicyRequest", @@ -18530,7 +19892,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/index.ts", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false, "initialIsOpen": false @@ -18880,7 +20242,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 24 + "lineNumber": 42 }, "deprecated": false, "initialIsOpen": false @@ -19703,7 +21065,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 28 + "lineNumber": 46 }, "deprecated": false, "initialIsOpen": false @@ -19717,7 +21079,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 24 + "lineNumber": 30 }, "deprecated": false, "children": [ @@ -19730,7 +21092,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 25 + "lineNumber": 31 }, "deprecated": false }, @@ -19743,7 +21105,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 26 + "lineNumber": 32 }, "deprecated": false }, @@ -19756,7 +21118,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 27 + "lineNumber": 33 }, "deprecated": false }, @@ -19768,11 +21130,11 @@ "label": "package_policies", "description": [], "signature": [ - "{ name: string; package: { name: \"system\"; }; }[]" + "{ name: string; package: { name: string; }; }[]" ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 28 + "lineNumber": 34 }, "deprecated": false }, @@ -19788,7 +21150,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 36 + "lineNumber": 42 }, "deprecated": false }, @@ -19804,7 +21166,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 37 + "lineNumber": 43 }, "deprecated": false }, @@ -19820,7 +21182,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 38 + "lineNumber": 44 }, "deprecated": false } @@ -19836,7 +21198,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 41 + "lineNumber": 47 }, "deprecated": false, "children": [ @@ -19849,7 +21211,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 42 + "lineNumber": 48 }, "deprecated": false }, @@ -19862,7 +21224,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 43 + "lineNumber": 49 }, "deprecated": false }, @@ -19875,7 +21237,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 44 + "lineNumber": 50 }, "deprecated": false }, @@ -19887,11 +21249,11 @@ "label": "package_policies", "description": [], "signature": [ - "{ name: string; package: { name: \"fleet_server\"; }; }[]" + "{ name: string; package: { name: string; }; }[]" ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 45 + "lineNumber": 51 }, "deprecated": false }, @@ -19907,7 +21269,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 53 + "lineNumber": 59 }, "deprecated": false }, @@ -19923,7 +21285,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 54 + "lineNumber": 60 }, "deprecated": false }, @@ -19939,7 +21301,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 55 + "lineNumber": 61 }, "deprecated": false }, @@ -19955,7 +21317,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/preconfiguration.ts", - "lineNumber": 56 + "lineNumber": 62 }, "deprecated": false } @@ -20039,23 +21401,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "fleet", - "id": "def-common.defaultPackages", - "type": "Object", - "tags": [], - "label": "defaultPackages", - "description": [], - "signature": [ - "{ readonly System: \"system\"; readonly Endpoint: \"endpoint\"; readonly ElasticAgent: \"elastic_agent\"; readonly FleetServer: \"fleet_server\"; }" - ], - "source": { - "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 22 - }, - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "fleet", "id": "def-common.ENROLLMENT_API_KEY_ROUTES", @@ -20726,7 +22071,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 33 + "lineNumber": 54 }, "deprecated": false, "initialIsOpen": false @@ -21147,10 +22492,10 @@ "children": [ { "parentPluginId": "fleet", - "id": "def-common.PRECONFIGURATION_API_ROUTES.PUT_PRECONFIG", + "id": "def-common.PRECONFIGURATION_API_ROUTES.UPDATE_PATTERN", "type": "string", "tags": [], - "label": "PUT_PRECONFIG", + "label": "UPDATE_PATTERN", "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/routes.ts", @@ -21161,23 +22506,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "fleet", - "id": "def-common.requiredPackages", - "type": "Object", - "tags": [], - "label": "requiredPackages", - "description": [], - "signature": [ - "{ readonly System: \"system\"; readonly Endpoint: \"endpoint\"; readonly ElasticAgent: \"elastic_agent\"; readonly FleetServer: \"fleet_server\"; }" - ], - "source": { - "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 14 - }, - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "fleet", "id": "def-common.SETTINGS_API_ROUTES", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 2113069fe47e07..0306b3114be7a6 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import fleetObj from './fleet.json'; @@ -19,7 +18,7 @@ import fleetObj from './fleet.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1071 | 15 | 981 | 8 | +| 1117 | 15 | 1024 | 8 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 041b9aba8ec7c8..df91a7e7f0e0fc 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import globalSearchObj from './global_search.json'; diff --git a/api_docs/home.json b/api_docs/home.json index c11d02dfed9de1..f9b41f86a7a5ff 100644 --- a/api_docs/home.json +++ b/api_docs/home.json @@ -16,11 +16,11 @@ "\nConvert instruction variant id into display text.\n" ], "signature": [ - "(id: \"ESC\" | \"OSX\" | \"DEB\" | \"RPM\" | \"DOCKER\" | \"WINDOWS\" | \"NODE\" | \"DJANGO\" | \"FLASK\" | \"RAILS\" | \"RACK\" | \"JS\" | \"GO\" | \"JAVA\" | \"DOTNET\" | \"LINUX\" | \"PHP\") => string" + "(id: \"ESC\" | \"OSX\" | \"DEB\" | \"RPM\" | \"DOCKER\" | \"WINDOWS\" | \"NODE\" | \"DJANGO\" | \"FLASK\" | \"RAILS\" | \"RACK\" | \"JS\" | \"GO\" | \"JAVA\" | \"DOTNET\" | \"LINUX\" | \"PHP\" | \"FLEET\") => string" ], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 55 + "lineNumber": 61 }, "deprecated": false, "children": [ @@ -32,11 +32,11 @@ "label": "id", "description": [], "signature": [ - "\"ESC\" | \"OSX\" | \"DEB\" | \"RPM\" | \"DOCKER\" | \"WINDOWS\" | \"NODE\" | \"DJANGO\" | \"FLASK\" | \"RAILS\" | \"RACK\" | \"JS\" | \"GO\" | \"JAVA\" | \"DOTNET\" | \"LINUX\" | \"PHP\"" + "\"ESC\" | \"OSX\" | \"DEB\" | \"RPM\" | \"DOCKER\" | \"WINDOWS\" | \"NODE\" | \"DJANGO\" | \"FLASK\" | \"RAILS\" | \"RACK\" | \"JS\" | \"GO\" | \"JAVA\" | \"DOTNET\" | \"LINUX\" | \"PHP\" | \"FLEET\"" ], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 55 + "lineNumber": 61 }, "deprecated": false, "isRequired": true @@ -598,7 +598,7 @@ "label": "TutorialSetup", "description": [], "signature": [ - "{ setVariable: (key: string, value: unknown) => void; registerDirectoryNotice: (id: string, component: React.FC<{}>) => void; registerDirectoryHeaderLink: (id: string, component: React.FC<{}>) => void; registerModuleNotice: (id: string, component: React.FC<{ moduleName: string; }>) => void; }" + "{ setVariable: (key: string, value: unknown) => void; registerDirectoryNotice: (id: string, component: React.FC<{}>) => void; registerDirectoryHeaderLink: (id: string, component: React.FC<{}>) => void; registerModuleNotice: (id: string, component: React.FC<{ moduleName: string; }>) => void; registerCustomStatusCheck: (name: string, fnCallback: CustomStatusCheckCallback) => void; registerCustomComponent: (name: string, component: CustomComponent) => void; }" ], "source": { "path": "src/plugins/home/public/plugin.ts", @@ -635,7 +635,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 9 + "lineNumber": 11 }, "deprecated": false, "children": [ @@ -648,7 +648,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 10 + "lineNumber": 12 }, "deprecated": false }, @@ -661,7 +661,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 11 + "lineNumber": 13 }, "deprecated": false }, @@ -674,7 +674,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 12 + "lineNumber": 14 }, "deprecated": false }, @@ -687,7 +687,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 13 + "lineNumber": 15 }, "deprecated": false }, @@ -700,7 +700,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 14 + "lineNumber": 16 }, "deprecated": false }, @@ -713,7 +713,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 15 + "lineNumber": 17 }, "deprecated": false }, @@ -726,7 +726,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 16 + "lineNumber": 18 }, "deprecated": false }, @@ -739,7 +739,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 17 + "lineNumber": 19 }, "deprecated": false }, @@ -752,7 +752,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 18 + "lineNumber": 20 }, "deprecated": false }, @@ -765,7 +765,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 19 + "lineNumber": 21 }, "deprecated": false }, @@ -778,7 +778,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 20 + "lineNumber": 22 }, "deprecated": false }, @@ -791,7 +791,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 21 + "lineNumber": 23 }, "deprecated": false }, @@ -804,7 +804,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 22 + "lineNumber": 24 }, "deprecated": false }, @@ -817,7 +817,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 23 + "lineNumber": 25 }, "deprecated": false }, @@ -830,7 +830,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 24 + "lineNumber": 26 }, "deprecated": false }, @@ -843,7 +843,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 25 + "lineNumber": 27 }, "deprecated": false }, @@ -856,7 +856,20 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 26 + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "home", + "id": "def-public.INSTRUCTION_VARIANT.FLEET", + "type": "string", + "tags": [], + "label": "FLEET", + "description": [], + "source": { + "path": "src/plugins/home/common/instruction_variant.ts", + "lineNumber": 29 }, "deprecated": false } @@ -885,7 +898,7 @@ "label": "tutorials", "description": [], "signature": [ - "{ setVariable: (key: string, value: unknown) => void; registerDirectoryNotice: (id: string, component: React.FC<{}>) => void; registerDirectoryHeaderLink: (id: string, component: React.FC<{}>) => void; registerModuleNotice: (id: string, component: React.FC<{ moduleName: string; }>) => void; }" + "{ setVariable: (key: string, value: unknown) => void; registerDirectoryNotice: (id: string, component: React.FC<{}>) => void; registerDirectoryHeaderLink: (id: string, component: React.FC<{}>) => void; registerModuleNotice: (id: string, component: React.FC<{ moduleName: string; }>) => void; registerCustomStatusCheck: (name: string, fnCallback: CustomStatusCheckCallback) => void; registerCustomComponent: (name: string, component: CustomComponent) => void; }" ], "source": { "path": "src/plugins/home/public/plugin.ts", @@ -971,13 +984,6 @@ }, "deprecated": true, "references": [ - { - "plugin": "ml", - "link": { - "path": "x-pack/plugins/ml/public/register_feature.ts", - "lineNumber": 18 - } - }, { "plugin": "apm", "link": { @@ -989,7 +995,7 @@ "plugin": "cloud", "link": { "path": "x-pack/plugins/cloud/public/plugin.ts", - "lineNumber": 66 + "lineNumber": 86 } } ] @@ -1070,6 +1076,40 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "home", + "id": "def-server.InstructionSetSchema", + "type": "Type", + "tags": [], + "label": "InstructionSetSchema", + "description": [], + "signature": [ + "{ readonly title?: string | undefined; readonly callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; readonly statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; readonly instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }" + ], + "source": { + "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", + "lineNumber": 83 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "home", + "id": "def-server.InstructionsSchema", + "type": "Type", + "tags": [], + "label": "InstructionsSchema", + "description": [], + "signature": [ + "{ readonly params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; readonly instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }" + ], + "source": { + "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", + "lineNumber": 104 + }, + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "home", "id": "def-server.SampleDataRegistrySetup", @@ -1130,7 +1170,7 @@ "signature": [ "(context: ", "TutorialContext", - ") => Readonly<{ savedObjects?: any[] | undefined; euiIconType?: string | undefined; previewImagePath?: string | undefined; moduleName?: string | undefined; isBeta?: boolean | undefined; completionTimeMinutes?: number | undefined; elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; savedObjectsInstallMsg?: string | undefined; } & { id: string; name: string; category: \"metrics\" | \"security\" | \"other\" | \"logging\"; shortDescription: string; longDescription: string; onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }>" + ") => Readonly<{ savedObjects?: any[] | undefined; euiIconType?: string | undefined; previewImagePath?: string | undefined; moduleName?: string | undefined; isBeta?: boolean | undefined; completionTimeMinutes?: number | undefined; elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; savedObjectsInstallMsg?: string | undefined; customStatusCheckName?: string | undefined; } & { id: string; name: string; category: \"metrics\" | \"security\" | \"other\" | \"logging\"; shortDescription: string; longDescription: string; onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }>" ], "source": { "path": "src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts", @@ -1138,6 +1178,23 @@ }, "deprecated": false, "initialIsOpen": false + }, + { + "parentPluginId": "home", + "id": "def-server.TutorialSchema", + "type": "Type", + "tags": [], + "label": "TutorialSchema", + "description": [], + "signature": [ + "{ readonly savedObjects?: any[] | undefined; readonly euiIconType?: string | undefined; readonly previewImagePath?: string | undefined; readonly moduleName?: string | undefined; readonly isBeta?: boolean | undefined; readonly completionTimeMinutes?: number | undefined; readonly elasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly onPremElasticCloud?: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }> | undefined; readonly artifacts?: Readonly<{ application?: Readonly<{} & { label: string; path: string; }> | undefined; exportedFields?: Readonly<{} & { documentationUrl: string; }> | undefined; } & { dashboards: Readonly<{ linkLabel?: string | undefined; } & { id: string; isOverview: boolean; }>[]; }> | undefined; readonly savedObjectsInstallMsg?: string | undefined; readonly customStatusCheckName?: string | undefined; readonly id: string; readonly name: string; readonly category: \"metrics\" | \"security\" | \"other\" | \"logging\"; readonly shortDescription: string; readonly longDescription: string; readonly onPrem: Readonly<{ params?: Readonly<{ defaultValue?: any; } & { type: \"string\" | \"number\"; label: string; id: string; }>[] | undefined; } & { instructionSets: Readonly<{ title?: string | undefined; callOut?: Readonly<{ iconType?: string | undefined; message?: string | undefined; } & { title: string; }> | undefined; statusCheck?: Readonly<{ title?: string | undefined; text?: string | undefined; success?: string | undefined; error?: string | undefined; btnLabel?: string | undefined; } & { esHitsCheck: Readonly<{} & { query: Record<string, any>; index: string | string[]; }>; }> | undefined; } & { instructionVariants: Readonly<{} & { id: string; instructions: Readonly<{ title?: string | undefined; textPre?: string | undefined; commands?: string[] | undefined; textPost?: string | undefined; customComponentName?: string | undefined; } & {}>[]; }>[]; }>[]; }>; }" + ], + "source": { + "path": "src/plugins/home/server/services/tutorials/lib/tutorial_schema.ts", + "lineNumber": 159 + }, + "deprecated": false, + "initialIsOpen": false } ], "objects": [ @@ -1150,7 +1207,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 9 + "lineNumber": 11 }, "deprecated": false, "children": [ @@ -1163,7 +1220,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 10 + "lineNumber": 12 }, "deprecated": false }, @@ -1176,7 +1233,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 11 + "lineNumber": 13 }, "deprecated": false }, @@ -1189,7 +1246,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 12 + "lineNumber": 14 }, "deprecated": false }, @@ -1202,7 +1259,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 13 + "lineNumber": 15 }, "deprecated": false }, @@ -1215,7 +1272,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 14 + "lineNumber": 16 }, "deprecated": false }, @@ -1228,7 +1285,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 15 + "lineNumber": 17 }, "deprecated": false }, @@ -1241,7 +1298,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 16 + "lineNumber": 18 }, "deprecated": false }, @@ -1254,7 +1311,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 17 + "lineNumber": 19 }, "deprecated": false }, @@ -1267,7 +1324,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 18 + "lineNumber": 20 }, "deprecated": false }, @@ -1280,7 +1337,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 19 + "lineNumber": 21 }, "deprecated": false }, @@ -1293,7 +1350,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 20 + "lineNumber": 22 }, "deprecated": false }, @@ -1306,7 +1363,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 21 + "lineNumber": 23 }, "deprecated": false }, @@ -1319,7 +1376,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 22 + "lineNumber": 24 }, "deprecated": false }, @@ -1332,7 +1389,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 23 + "lineNumber": 25 }, "deprecated": false }, @@ -1345,7 +1402,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 24 + "lineNumber": 26 }, "deprecated": false }, @@ -1358,7 +1415,7 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 25 + "lineNumber": 27 }, "deprecated": false }, @@ -1371,7 +1428,20 @@ "description": [], "source": { "path": "src/plugins/home/common/instruction_variant.ts", - "lineNumber": 26 + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "home", + "id": "def-server.INSTRUCTION_VARIANT.FLEET", + "type": "string", + "tags": [], + "label": "FLEET", + "description": [], + "source": { + "path": "src/plugins/home/common/instruction_variant.ts", + "lineNumber": 29 }, "deprecated": false } diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 23c58467b6a986..e6ddbfa5c95aa7 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import homeObj from './home.json'; @@ -19,7 +18,7 @@ import homeObj from './home.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 89 | 0 | 65 | 5 | +| 94 | 0 | 70 | 5 | ## Client diff --git a/api_docs/index_lifecycle_management.json b/api_docs/index_lifecycle_management.json index b38b0a13b90446..8f703b3fe87c70 100644 --- a/api_docs/index_lifecycle_management.json +++ b/api_docs/index_lifecycle_management.json @@ -6,20 +6,37 @@ "interfaces": [ { "parentPluginId": "indexLifecycleManagement", - "id": "def-public.IlmUrlGeneratorState", + "id": "def-public.IlmLocatorParams", "type": "Interface", "tags": [], - "label": "IlmUrlGeneratorState", + "label": "IlmLocatorParams", "description": [], + "signature": [ + { + "pluginId": "indexLifecycleManagement", + "scope": "public", + "docId": "kibIndexLifecycleManagementPluginApi", + "section": "def-public.IlmLocatorParams", + "text": "IlmLocatorParams" + }, + " extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + } + ], "source": { - "path": "x-pack/plugins/index_lifecycle_management/public/url_generator.ts", - "lineNumber": 21 + "path": "x-pack/plugins/index_lifecycle_management/public/locator.ts", + "lineNumber": 20 }, "deprecated": false, "children": [ { "parentPluginId": "indexLifecycleManagement", - "id": "def-public.IlmUrlGeneratorState.page", + "id": "def-public.IlmLocatorParams.page", "type": "CompoundType", "tags": [], "label": "page", @@ -28,14 +45,14 @@ "\"policies_list\" | \"policy_edit\" | \"policy_create\"" ], "source": { - "path": "x-pack/plugins/index_lifecycle_management/public/url_generator.ts", - "lineNumber": 22 + "path": "x-pack/plugins/index_lifecycle_management/public/locator.ts", + "lineNumber": 21 }, "deprecated": false }, { "parentPluginId": "indexLifecycleManagement", - "id": "def-public.IlmUrlGeneratorState.policyName", + "id": "def-public.IlmLocatorParams.policyName", "type": "string", "tags": [], "label": "policyName", @@ -44,24 +61,8 @@ "string | undefined" ], "source": { - "path": "x-pack/plugins/index_lifecycle_management/public/url_generator.ts", - "lineNumber": 23 - }, - "deprecated": false - }, - { - "parentPluginId": "indexLifecycleManagement", - "id": "def-public.IlmUrlGeneratorState.absolute", - "type": "CompoundType", - "tags": [], - "label": "absolute", - "description": [], - "signature": [ - "boolean | undefined" - ], - "source": { - "path": "x-pack/plugins/index_lifecycle_management/public/url_generator.ts", - "lineNumber": 24 + "path": "x-pack/plugins/index_lifecycle_management/public/locator.ts", + "lineNumber": 22 }, "deprecated": false } @@ -73,17 +74,17 @@ "misc": [ { "parentPluginId": "indexLifecycleManagement", - "id": "def-public.ILM_URL_GENERATOR_ID", + "id": "def-public.ILM_LOCATOR_ID", "type": "string", "tags": [], - "label": "ILM_URL_GENERATOR_ID", + "label": "ILM_LOCATOR_ID", "description": [], "signature": [ - "\"ILM_URL_GENERATOR_ID\"" + "\"ILM_LOCATOR_ID\"" ], "source": { - "path": "x-pack/plugins/index_lifecycle_management/public/url_generator.ts", - "lineNumber": 19 + "path": "x-pack/plugins/index_lifecycle_management/public/locator.ts", + "lineNumber": 18 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index a16206ad3d3610..54b1b1fa5d80bf 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import indexLifecycleManagementObj from './index_lifecycle_management.json'; @@ -19,7 +18,7 @@ import indexLifecycleManagementObj from './index_lifecycle_management.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 5 | 0 | 5 | 0 | +| 4 | 0 | 4 | 0 | ## Client diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 9190012ac0b293..42414651d4d4b8 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import indexManagementObj from './index_management.json'; diff --git a/api_docs/index_pattern_field_editor.mdx b/api_docs/index_pattern_field_editor.mdx index 1627a18e66724a..d21bfaefc674b4 100644 --- a/api_docs/index_pattern_field_editor.mdx +++ b/api_docs/index_pattern_field_editor.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexPatternFieldEditor'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import indexPatternFieldEditorObj from './index_pattern_field_editor.json'; diff --git a/api_docs/index_pattern_management.json b/api_docs/index_pattern_management.json deleted file mode 100644 index 77ca8b9505d990..00000000000000 --- a/api_docs/index_pattern_management.json +++ /dev/null @@ -1,983 +0,0 @@ -{ - "id": "indexPatternManagement", - "client": { - "classes": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig", - "type": "Class", - "tags": [], - "label": "IndexPatternCreationConfig", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 37 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.key", - "type": "string", - "tags": [], - "label": "key", - "description": [], - "signature": [ - "\"default\"" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 38 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 40 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 41 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.showSystemIndices", - "type": "boolean", - "tags": [], - "label": "showSystemIndices", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 42 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.httpClient", - "type": "CompoundType", - "tags": [], - "label": "httpClient", - "description": [], - "signature": [ - "object | null" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 43 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.isBeta", - "type": "boolean", - "tags": [], - "label": "isBeta", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 44 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed", - "type": "Function", - "tags": [], - "label": "Constructor", - "description": [], - "signature": [ - "any" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 46 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed.$1.typeundefinednameindexPatternTypeNameshowSystemIndicestruehttpClientnullisBetafalse", - "type": "Object", - "tags": [], - "label": "{\n type = undefined,\n name = indexPatternTypeName,\n showSystemIndices = true,\n httpClient = null,\n isBeta = false,\n }", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 52 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed.$1.typeundefinednameindexPatternTypeNameshowSystemIndicestruehttpClientnullisBetafalse.type", - "type": "string", - "tags": [], - "label": "type", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 53 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed.$1.typeundefinednameindexPatternTypeNameshowSystemIndicestruehttpClientnullisBetafalse.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "signature": [ - "string | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 54 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed.$1.typeundefinednameindexPatternTypeNameshowSystemIndicestruehttpClientnullisBetafalse.showSystemIndices", - "type": "CompoundType", - "tags": [], - "label": "showSystemIndices", - "description": [], - "signature": [ - "boolean | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 55 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed.$1.typeundefinednameindexPatternTypeNameshowSystemIndicestruehttpClientnullisBetafalse.httpClient", - "type": "CompoundType", - "tags": [], - "label": "httpClient", - "description": [], - "signature": [ - "object | null | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 56 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.Unnamed.$1.typeundefinednameindexPatternTypeNameshowSystemIndicestruehttpClientnullisBetafalse.isBeta", - "type": "CompoundType", - "tags": [], - "label": "isBeta", - "description": [], - "signature": [ - "boolean | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 57 - }, - "deprecated": false - } - ] - } - ], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexPatternCreationOption", - "type": "Function", - "tags": [], - "label": "getIndexPatternCreationOption", - "description": [], - "signature": [ - "(urlHandler: ", - "UrlHandler", - ") => ", - { - "pluginId": "indexPatternManagement", - "scope": "public", - "docId": "kibIndexPatternManagementPluginApi", - "section": "def-public.IndexPatternCreationOption", - "text": "IndexPatternCreationOption" - } - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 66 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexPatternCreationOption.$1", - "type": "Function", - "tags": [], - "label": "urlHandler", - "description": [], - "signature": [ - "UrlHandler" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 66 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexPatternType", - "type": "Function", - "tags": [], - "label": "getIndexPatternType", - "description": [], - "signature": [ - "() => string | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 77 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexPatternName", - "type": "Function", - "tags": [], - "label": "getIndexPatternName", - "description": [], - "signature": [ - "() => string" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 81 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIsBeta", - "type": "Function", - "tags": [], - "label": "getIsBeta", - "description": [], - "signature": [ - "() => boolean" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 85 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getShowSystemIndices", - "type": "Function", - "tags": [], - "label": "getShowSystemIndices", - "description": [], - "signature": [ - "() => boolean" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 89 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexTags", - "type": "Function", - "tags": [], - "label": "getIndexTags", - "description": [], - "signature": [ - "(indexName: string) => never[]" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 93 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexTags.$1", - "type": "string", - "tags": [], - "label": "indexName", - "description": [], - "signature": [ - "string" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 93 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.checkIndicesForErrors", - "type": "Function", - "tags": [], - "label": "checkIndicesForErrors", - "description": [], - "signature": [ - "(indices: ", - "MatchedItem", - "[]) => undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 97 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.checkIndicesForErrors.$1", - "type": "Array", - "tags": [], - "label": "indices", - "description": [], - "signature": [ - "MatchedItem", - "[]" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 97 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getIndexPatternMappings", - "type": "Function", - "tags": [], - "label": "getIndexPatternMappings", - "description": [], - "signature": [ - "() => {}" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 101 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.renderPrompt", - "type": "Function", - "tags": [], - "label": "renderPrompt", - "description": [], - "signature": [ - "() => null" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 105 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationConfig.getFetchForWildcardOptions", - "type": "Function", - "tags": [], - "label": "getFetchForWildcardOptions", - "description": [], - "signature": [ - "() => {}" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 109 - }, - "deprecated": false, - "children": [], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig", - "type": "Class", - "tags": [], - "label": "IndexPatternListConfig", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 25 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.key", - "type": "string", - "tags": [], - "label": "key", - "description": [], - "signature": [ - "\"default\"" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 26 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.getIndexPatternTags", - "type": "Function", - "tags": [], - "label": "getIndexPatternTags", - "description": [], - "signature": [ - "(indexPattern: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - " | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-public.SimpleSavedObject", - "text": "SimpleSavedObject" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ">, isDefault: boolean) => ", - "IndexPatternTag", - "[]" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 28 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.getIndexPatternTags.$1", - "type": "CompoundType", - "tags": [], - "label": "indexPattern", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - " | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-public.SimpleSavedObject", - "text": "SimpleSavedObject" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ">" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 29 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.getIndexPatternTags.$2", - "type": "boolean", - "tags": [], - "label": "isDefault", - "description": [], - "signature": [ - "boolean" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 30 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.getFieldInfo", - "type": "Function", - "tags": [], - "label": "getFieldInfo", - "description": [], - "signature": [ - "(indexPattern: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ", field: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IFieldType", - "text": "IFieldType" - }, - ") => string[]" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.getFieldInfo.$1", - "type": "Object", - "tags": [], - "label": "indexPattern", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - } - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.getFieldInfo.$2", - "type": "Object", - "tags": [], - "label": "field", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IFieldType", - "text": "IFieldType" - } - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 42 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.areScriptedFieldsEnabled", - "type": "Function", - "tags": [], - "label": "areScriptedFieldsEnabled", - "description": [], - "signature": [ - "(indexPattern: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ") => boolean" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 46 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternListConfig.areScriptedFieldsEnabled.$1", - "type": "Object", - "tags": [], - "label": "indexPattern", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - } - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/list/config.ts", - "lineNumber": 46 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - } - ], - "functions": [], - "interfaces": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationOption", - "type": "Interface", - "tags": [], - "label": "IndexPatternCreationOption", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 29 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationOption.text", - "type": "string", - "tags": [], - "label": "text", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 30 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationOption.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 31 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationOption.testSubj", - "type": "string", - "tags": [], - "label": "testSubj", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 32 - }, - "deprecated": false - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationOption.onClick", - "type": "Function", - "tags": [], - "label": "onClick", - "description": [], - "signature": [ - "() => void" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 33 - }, - "deprecated": false, - "returnComment": [], - "children": [] - }, - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternCreationOption.isBeta", - "type": "CompoundType", - "tags": [], - "label": "isBeta", - "description": [], - "signature": [ - "boolean | undefined" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/service/creation/config.ts", - "lineNumber": 34 - }, - "deprecated": false - } - ], - "initialIsOpen": false - } - ], - "enums": [ - { - "parentPluginId": "indexPatternManagement", - "id": "def-public.MlCardState", - "type": "Enum", - "tags": [], - "label": "MlCardState", - "description": [], - "source": { - "path": "src/plugins/index_pattern_management/public/types.ts", - "lineNumber": 42 - }, - "deprecated": false, - "initialIsOpen": false - } - ], - "misc": [], - "objects": [], - "setup": { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternManagementSetup", - "type": "Type", - "tags": [], - "label": "IndexPatternManagementSetup", - "description": [], - "signature": [ - "{ creation: { addCreationConfig: (Config: typeof ", - { - "pluginId": "indexPatternManagement", - "scope": "public", - "docId": "kibIndexPatternManagementPluginApi", - "section": "def-public.IndexPatternCreationConfig", - "text": "IndexPatternCreationConfig" - }, - ") => void; }; list: { addListConfig: (Config: typeof ", - { - "pluginId": "indexPatternManagement", - "scope": "public", - "docId": "kibIndexPatternManagementPluginApi", - "section": "def-public.IndexPatternListConfig", - "text": "IndexPatternListConfig" - }, - ") => void; }; environment: { update: (update: Partial<", - "Environment", - ">) => void; }; }" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/plugin.ts", - "lineNumber": 32 - }, - "deprecated": false, - "lifecycle": "setup", - "initialIsOpen": true - }, - "start": { - "parentPluginId": "indexPatternManagement", - "id": "def-public.IndexPatternManagementStart", - "type": "Type", - "tags": [], - "label": "IndexPatternManagementStart", - "description": [], - "signature": [ - "{ creation: { getType: (key: string | undefined) => ", - { - "pluginId": "indexPatternManagement", - "scope": "public", - "docId": "kibIndexPatternManagementPluginApi", - "section": "def-public.IndexPatternCreationConfig", - "text": "IndexPatternCreationConfig" - }, - "; getIndexPatternCreationOptions: (urlHandler: ", - "UrlHandler", - ") => Promise<", - { - "pluginId": "indexPatternManagement", - "scope": "public", - "docId": "kibIndexPatternManagementPluginApi", - "section": "def-public.IndexPatternCreationOption", - "text": "IndexPatternCreationOption" - }, - "[]>; }; list: { getIndexPatternTags: (indexPattern: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - " | ", - { - "pluginId": "core", - "scope": "public", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-public.SimpleSavedObject", - "text": "SimpleSavedObject" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ">, isDefault: boolean) => ", - "IndexPatternTag", - "[]; getFieldInfo: (indexPattern: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ", field: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IFieldType", - "text": "IFieldType" - }, - ") => string[]; areScriptedFieldsEnabled: (indexPattern: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IIndexPattern", - "text": "IIndexPattern" - }, - ") => boolean; }; }" - ], - "source": { - "path": "src/plugins/index_pattern_management/public/plugin.ts", - "lineNumber": 34 - }, - "deprecated": false, - "lifecycle": "start", - "initialIsOpen": true - } - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - } -} \ No newline at end of file diff --git a/api_docs/index_pattern_management.mdx b/api_docs/index_pattern_management.mdx deleted file mode 100644 index 7d82efb213ff1c..00000000000000 --- a/api_docs/index_pattern_management.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -id: kibIndexPatternManagementPluginApi -slug: /kibana-dev-docs/indexPatternManagementPluginApi -title: indexPatternManagement -image: https://source.unsplash.com/400x175/?github -summary: API docs for the indexPatternManagement plugin -date: 2020-11-16 -tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexPatternManagement'] -warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. ---- - -import indexPatternManagementObj from './index_pattern_management.json'; - - - - - -**Code health stats** - -| Public API count | Any count | Items lacking comments | Missing exports | -|-------------------|-----------|------------------------|-----------------| -| 46 | 0 | 46 | 4 | - -## Client - -### Setup -<DocDefinitionList data={[indexPatternManagementObj.client.setup]}/> - -### Start -<DocDefinitionList data={[indexPatternManagementObj.client.start]}/> - -### Classes -<DocDefinitionList data={indexPatternManagementObj.client.classes}/> - -### Interfaces -<DocDefinitionList data={indexPatternManagementObj.client.interfaces}/> - -### Enums -<DocDefinitionList data={indexPatternManagementObj.client.enums}/> - diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 0a13dcdfb5bcca..5622f3bed6736e 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import infraObj from './infra.json'; diff --git a/api_docs/ingest_pipelines.json b/api_docs/ingest_pipelines.json deleted file mode 100644 index 3f8817a04ff3ae..00000000000000 --- a/api_docs/ingest_pipelines.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "id": "ingestPipelines", - "client": { - "classes": [ - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGenerator", - "type": "Class", - "tags": [], - "label": "IngestPipelinesUrlGenerator", - "description": [], - "signature": [ - { - "pluginId": "ingestPipelines", - "scope": "public", - "docId": "kibIngestPipelinesPluginApi", - "section": "def-public.IngestPipelinesUrlGenerator", - "text": "IngestPipelinesUrlGenerator" - }, - " implements ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorsDefinition", - "text": "UrlGeneratorsDefinition" - }, - "<\"INGEST_PIPELINES_APP_URL_GENERATOR\">" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 55 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGenerator.Unnamed", - "type": "Function", - "tags": [], - "label": "Constructor", - "description": [], - "signature": [ - "any" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 57 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGenerator.Unnamed.$1", - "type": "Function", - "tags": [], - "label": "getAppBasePath", - "description": [], - "signature": [ - "(absolute: boolean) => Promise<string>" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 57 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGenerator.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "\"INGEST_PIPELINES_APP_URL_GENERATOR\"" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 59 - }, - "deprecated": false - }, - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGenerator.createUrl", - "type": "Function", - "tags": [], - "label": "createUrl", - "description": [], - "signature": [ - "(state: ", - { - "pluginId": "ingestPipelines", - "scope": "public", - "docId": "kibIngestPipelinesPluginApi", - "section": "def-public.IngestPipelinesUrlGeneratorState", - "text": "IngestPipelinesUrlGeneratorState" - }, - ") => Promise<string>" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 61 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGenerator.createUrl.$1", - "type": "CompoundType", - "tags": [], - "label": "state", - "description": [], - "signature": [ - { - "pluginId": "ingestPipelines", - "scope": "public", - "docId": "kibIngestPipelinesPluginApi", - "section": "def-public.IngestPipelinesUrlGeneratorState", - "text": "IngestPipelinesUrlGeneratorState" - } - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 61 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - } - ], - "functions": [], - "interfaces": [], - "enums": [ - { - "parentPluginId": "ingestPipelines", - "id": "def-public.INGEST_PIPELINES_PAGES", - "type": "Enum", - "tags": [], - "label": "INGEST_PIPELINES_PAGES", - "description": [], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 22 - }, - "deprecated": false, - "initialIsOpen": false - } - ], - "misc": [ - { - "parentPluginId": "ingestPipelines", - "id": "def-public.INGEST_PIPELINES_APP_ULR_GENERATOR", - "type": "string", - "tags": [], - "label": "INGEST_PIPELINES_APP_ULR_GENERATOR", - "description": [], - "signature": [ - "\"INGEST_PIPELINES_APP_URL_GENERATOR\"" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 20 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "ingestPipelines", - "id": "def-public.IngestPipelinesUrlGeneratorState", - "type": "Type", - "tags": [], - "label": "IngestPipelinesUrlGeneratorState", - "description": [], - "signature": [ - "PipelinesListUrlGeneratorState", - " | ", - "PipelineEditUrlGeneratorState", - " | ", - "PipelineCloneUrlGeneratorState", - " | ", - "PipelineCreateUrlGeneratorState" - ], - "source": { - "path": "x-pack/plugins/ingest_pipelines/public/url_generator.ts", - "lineNumber": 49 - }, - "deprecated": false, - "initialIsOpen": false - } - ], - "objects": [] - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - } -} \ No newline at end of file diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx deleted file mode 100644 index 25bdbceda4eadd..00000000000000 --- a/api_docs/ingest_pipelines.mdx +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: kibIngestPipelinesPluginApi -slug: /kibana-dev-docs/ingestPipelinesPluginApi -title: ingestPipelines -image: https://source.unsplash.com/400x175/?github -summary: API docs for the ingestPipelines plugin -date: 2020-11-16 -tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] -warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. ---- - -import ingestPipelinesObj from './ingest_pipelines.json'; - - - - - -**Code health stats** - -| Public API count | Any count | Items lacking comments | Missing exports | -|-------------------|-----------|------------------------|-----------------| -| 9 | 0 | 9 | 4 | - -## Client - -### Classes -<DocDefinitionList data={ingestPipelinesObj.client.classes}/> - -### Enums -<DocDefinitionList data={ingestPipelinesObj.client.enums}/> - -### Consts, variables and types -<DocDefinitionList data={ingestPipelinesObj.client.misc}/> - diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index d69ef22ce788ad..e89f1a98fb493c 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import inspectorObj from './inspector.json'; diff --git a/api_docs/kibana_legacy.mdx b/api_docs/kibana_legacy.mdx index 5cd9244f0ea57f..1602bfeffb69b0 100644 --- a/api_docs/kibana_legacy.mdx +++ b/api_docs/kibana_legacy.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaLegacy'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import kibanaLegacyObj from './kibana_legacy.json'; diff --git a/api_docs/kibana_react.json b/api_docs/kibana_react.json index a477de7c6512c1..ed9c5ef45c7f99 100644 --- a/api_docs/kibana_react.json +++ b/api_docs/kibana_react.json @@ -683,7 +683,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/code_editor/index.tsx", - "lineNumber": 36 + "lineNumber": 39 }, "deprecated": false, "children": [ @@ -701,7 +701,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/code_editor/index.tsx", - "lineNumber": 36 + "lineNumber": 39 }, "deprecated": false, "isRequired": true @@ -726,7 +726,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/code_editor/index.tsx", - "lineNumber": 50 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -744,7 +744,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/code_editor/index.tsx", - "lineNumber": 50 + "lineNumber": 53 }, "deprecated": false, "isRequired": true @@ -1219,33 +1219,33 @@ }, { "parentPluginId": "kibanaReact", - "id": "def-public.OverviewPageFooter", + "id": "def-public.overviewPageActions", "type": "Function", "tags": [], - "label": "OverviewPageFooter", + "label": "overviewPageActions", "description": [], "signature": [ - "({ addBasePath, path, onSetDefaultRoute, onChangeDefaultRoute, }: React.PropsWithChildren<Props>) => JSX.Element" + "({ addBasePath, application, hidden, showDevToolsLink, showManagementLink, }: Props) => (JSX.Element | null)[]" ], "source": { - "path": "src/plugins/kibana_react/public/overview_page/overview_page_footer/overview_page_footer.tsx", - "lineNumber": 28 + "path": "src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx", + "lineNumber": 23 }, "deprecated": false, "children": [ { "parentPluginId": "kibanaReact", - "id": "def-public.OverviewPageFooter.$1", - "type": "CompoundType", + "id": "def-public.overviewPageActions.$1", + "type": "Object", "tags": [], - "label": "{\n addBasePath,\n path,\n onSetDefaultRoute,\n onChangeDefaultRoute,\n}", + "label": "{\n addBasePath,\n application,\n hidden,\n showDevToolsLink,\n showManagementLink,\n}", "description": [], "signature": [ - "React.PropsWithChildren<Props>" + "Props" ], "source": { - "path": "src/plugins/kibana_react/public/overview_page/overview_page_footer/overview_page_footer.tsx", - "lineNumber": 28 + "path": "src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx", + "lineNumber": 23 }, "deprecated": false, "isRequired": true @@ -1256,33 +1256,33 @@ }, { "parentPluginId": "kibanaReact", - "id": "def-public.OverviewPageHeader", + "id": "def-public.OverviewPageFooter", "type": "Function", "tags": [], - "label": "OverviewPageHeader", + "label": "OverviewPageFooter", "description": [], "signature": [ - "({ hideToolbar, iconType, overlap, showDevToolsLink, showManagementLink, title, addBasePath, }: React.PropsWithChildren<Props>) => JSX.Element" + "({ addBasePath, path, onSetDefaultRoute, onChangeDefaultRoute, }: React.PropsWithChildren<Props>) => JSX.Element" ], "source": { - "path": "src/plugins/kibana_react/public/overview_page/overview_page_header/overview_page_header.tsx", - "lineNumber": 35 + "path": "src/plugins/kibana_react/public/overview_page/overview_page_footer/overview_page_footer.tsx", + "lineNumber": 28 }, "deprecated": false, "children": [ { "parentPluginId": "kibanaReact", - "id": "def-public.OverviewPageHeader.$1", + "id": "def-public.OverviewPageFooter.$1", "type": "CompoundType", "tags": [], - "label": "{\n hideToolbar,\n iconType,\n overlap,\n showDevToolsLink,\n showManagementLink,\n title,\n addBasePath,\n}", + "label": "{\n addBasePath,\n path,\n onSetDefaultRoute,\n onChangeDefaultRoute,\n}", "description": [], "signature": [ "React.PropsWithChildren<Props>" ], "source": { - "path": "src/plugins/kibana_react/public/overview_page/overview_page_header/overview_page_header.tsx", - "lineNumber": 35 + "path": "src/plugins/kibana_react/public/overview_page/overview_page_footer/overview_page_footer.tsx", + "lineNumber": 28 }, "deprecated": false, "isRequired": true @@ -1830,7 +1830,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 40 + "lineNumber": 32 }, "deprecated": false, "children": [ @@ -1854,7 +1854,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 40 + "lineNumber": 32 }, "deprecated": false, "isRequired": true @@ -3655,7 +3655,7 @@ "description": [], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 31 + "lineNumber": 23 }, "deprecated": false, "children": [ @@ -3668,7 +3668,7 @@ "description": [], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 32 + "lineNumber": 24 }, "deprecated": false }, @@ -3684,7 +3684,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 33 + "lineNumber": 25 }, "deprecated": false }, @@ -3707,7 +3707,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 34 + "lineNumber": 26 }, "deprecated": false }, @@ -3725,7 +3725,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 35 + "lineNumber": 27 }, "deprecated": false, "returnComment": [], @@ -3776,7 +3776,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 36 + "lineNumber": 28 }, "deprecated": false }, @@ -3796,7 +3796,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 37 + "lineNumber": 29 }, "deprecated": false } @@ -3812,7 +3812,7 @@ "description": [], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 24 + "lineNumber": 16 }, "deprecated": false, "children": [ @@ -3825,7 +3825,7 @@ "description": [], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 25 + "lineNumber": 17 }, "deprecated": false }, @@ -3841,7 +3841,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 26 + "lineNumber": 18 }, "deprecated": false }, @@ -3857,7 +3857,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 27 + "lineNumber": 19 }, "deprecated": false }, @@ -3874,7 +3874,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 28 + "lineNumber": 20 }, "deprecated": false }, @@ -3890,7 +3890,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/url_template_editor/url_template_editor.tsx", - "lineNumber": 29 + "lineNumber": 21 }, "deprecated": false } @@ -3929,7 +3929,7 @@ ], "source": { "path": "src/plugins/kibana_react/public/code_editor/index.tsx", - "lineNumber": 29 + "lineNumber": 32 }, "deprecated": false, "initialIsOpen": false @@ -3944,19 +3944,9 @@ "\nA thin wrapper around EuiPageTemplate with a few Kibana specific additions" ], "signature": [ - "(Pick<", + "Pick<", "EuiPageProps", - ", \"children\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"grow\" | \"direction\" | \"restrictWidth\"> & ", - "DisambiguateSet", - "<{ template?: \"default\" | undefined; bottomBar?: React.ReactNode; bottomBarProps?: (", - "CommonProps", - " & React.HTMLAttributes<HTMLElement> & ", - "DisambiguateSet", - "<{ position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; }, { position: \"static\" | \"sticky\"; }> & { position: \"static\" | \"sticky\"; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; bodyClassName?: string | undefined; landmarkHeading?: string | undefined; top?: string | number | undefined; right?: string | number | undefined; bottom?: string | number | undefined; left?: string | number | undefined; }) | (", - "CommonProps", - " & React.HTMLAttributes<HTMLElement> & ", - "DisambiguateSet", - "<{ position: \"static\" | \"sticky\"; }, { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; }> & { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; bodyClassName?: string | undefined; landmarkHeading?: string | undefined; top?: string | number | undefined; right?: string | number | undefined; bottom?: string | number | undefined; left?: string | number | undefined; }) | undefined; }, { template: \"default\" | \"empty\" | \"centeredBody\" | \"centeredContent\"; }> & { template: \"default\" | \"empty\" | \"centeredBody\" | \"centeredContent\"; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; pageSideBar?: React.ReactNode; pageSideBarProps?: ", + ", \"children\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"grow\" | \"direction\" | \"restrictWidth\"> & { template?: \"default\" | \"empty\" | \"centeredBody\" | \"centeredContent\" | undefined; paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; pageSideBar?: React.ReactNode; pageSideBarProps?: ", "EuiPageSideBarProps", " | undefined; pageHeader?: ", "EuiPageHeaderProps", @@ -3966,21 +3956,7 @@ "EuiPageContentProps", " | undefined; pageContentBodyProps?: ", "EuiPageContentBodyProps", - " | undefined; } & { isEmptyState?: boolean | undefined; solutionNav?: ", - "KibanaPageTemplateSolutionNavProps", - " | undefined; }) | (Pick<", - "EuiPageProps", - ", \"children\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"placeholder\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"grow\" | \"direction\" | \"restrictWidth\"> & ", - "DisambiguateSet", - "<{ template: \"default\" | \"empty\" | \"centeredBody\" | \"centeredContent\"; }, { template?: \"default\" | undefined; bottomBar?: React.ReactNode; bottomBarProps?: (", - "CommonProps", - " & React.HTMLAttributes<HTMLElement> & ", - "DisambiguateSet", - "<{ position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; }, { position: \"static\" | \"sticky\"; }> & { position: \"static\" | \"sticky\"; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; bodyClassName?: string | undefined; landmarkHeading?: string | undefined; top?: string | number | undefined; right?: string | number | undefined; bottom?: string | number | undefined; left?: string | number | undefined; }) | (", - "CommonProps", - " & React.HTMLAttributes<HTMLElement> & ", - "DisambiguateSet", - "<{ position: \"static\" | \"sticky\"; }, { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; }> & { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; bodyClassName?: string | undefined; landmarkHeading?: string | undefined; top?: string | number | undefined; right?: string | number | undefined; bottom?: string | number | undefined; left?: string | number | undefined; }) | undefined; }> & { template?: \"default\" | undefined; bottomBar?: React.ReactNode; bottomBarProps?: (", + " | undefined; bottomBar?: React.ReactNode; bottomBarProps?: (", "CommonProps", " & React.HTMLAttributes<HTMLElement> & ", "DisambiguateSet", @@ -3988,19 +3964,9 @@ "CommonProps", " & React.HTMLAttributes<HTMLElement> & ", "DisambiguateSet", - "<{ position: \"static\" | \"sticky\"; }, { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; }> & { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; bodyClassName?: string | undefined; landmarkHeading?: string | undefined; top?: string | number | undefined; right?: string | number | undefined; bottom?: string | number | undefined; left?: string | number | undefined; }) | undefined; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; pageSideBar?: React.ReactNode; pageSideBarProps?: ", - "EuiPageSideBarProps", - " | undefined; pageHeader?: ", - "EuiPageHeaderProps", - " | undefined; pageBodyProps?: ", - "EuiPageBodyProps", - "<\"main\"> | undefined; pageContentProps?: ", - "EuiPageContentProps", - " | undefined; pageContentBodyProps?: ", - "EuiPageContentBodyProps", - " | undefined; } & { isEmptyState?: boolean | undefined; solutionNav?: ", + "<{ position: \"static\" | \"sticky\"; }, { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; }> & { position?: \"fixed\" | undefined; usePortal?: boolean | undefined; affordForDisplacement?: boolean | undefined; } & { paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; bodyClassName?: string | undefined; landmarkHeading?: string | undefined; top?: string | number | undefined; right?: string | number | undefined; bottom?: string | number | undefined; left?: string | number | undefined; }) | undefined; fullHeight?: boolean | \"noscroll\" | undefined; minHeight?: string | number | undefined; } & { isEmptyState?: boolean | undefined; solutionNav?: ", "KibanaPageTemplateSolutionNavProps", - " | undefined; })" + " | undefined; }" ], "source": { "path": "src/plugins/kibana_react/public/page_template/page_template.tsx", @@ -4292,6 +4258,191 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang", + "type": "Object", + "tags": [], + "label": "Lang", + "description": [], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/css/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.ID", + "type": "string", + "tags": [], + "label": "ID", + "description": [], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/css/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.lexerRules", + "type": "Any", + "tags": [], + "label": "lexerRules", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/css/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.languageConfiguration", + "type": "Any", + "tags": [], + "label": "languageConfiguration", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/css/index.ts", + "lineNumber": 12 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang", + "type": "Object", + "tags": [], + "label": "Lang", + "description": [], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/handlebars/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.ID", + "type": "string", + "tags": [], + "label": "ID", + "description": [], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/handlebars/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.languageConfiguration", + "type": "Object", + "tags": [], + "label": "languageConfiguration", + "description": [], + "signature": [ + "languages", + ".LanguageConfiguration" + ], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/handlebars/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.lexerRules", + "type": "Object", + "tags": [], + "label": "lexerRules", + "description": [], + "signature": [ + "languages", + ".IMonarchLanguage" + ], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/handlebars/index.ts", + "lineNumber": 13 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang", + "type": "Object", + "tags": [], + "label": "Lang", + "description": [], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/markdown/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.ID", + "type": "string", + "tags": [], + "label": "ID", + "description": [], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/markdown/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.languageConfiguration", + "type": "Any", + "tags": [], + "label": "languageConfiguration", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/markdown/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Lang.lexerRules", + "type": "Any", + "tags": [], + "label": "lexerRules", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "src/plugins/kibana_react/public/code_editor/languages/markdown/index.ts", + "lineNumber": 12 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "kibanaReact", "id": "def-public.typeToEuiIconMap", @@ -5003,7 +5154,7 @@ "label": "eui", "description": [], "signature": [ - "{ paddingSizes: { xs: string; s: string; m: string; l: string; xl: string; }; avatarSizing: { s: { size: string; 'font-size': string; }; m: { size: string; 'font-size': string; }; l: { size: string; 'font-size': string; }; xl: { size: string; 'font-size': string; }; }; euiBadgeGroupGutterTypes: { gutterExtraSmall: string; gutterSmall: string; }; euiBreadcrumbSpacing: string; euiBreadcrumbTruncateWidth: string; euiButtonEmptyTypes: { primary: string; danger: string; disabled: string; ghost: string; text: string; success: string; warning: string; }; euiButtonIconTypes: { accent: string; danger: string; ghost: string; primary: string; subdued: string; success: string; text: string; warning: string; }; euiCallOutTypes: { primary: string; success: string; warning: string; danger: string; }; euiCardSpacing: string; euiCardBottomNodeHeight: string; euiCardSelectButtonBorders: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardSelectButtonBackgrounds: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiCheckableCardPadding: string; euiCollapsibleNavWidth: string; euiCollapsibleNavGroupLightBackgroundColor: string; euiCollapsibleNavGroupDarkBackgroundColor: string; euiCollapsibleNavGroupDarkHighContrastColor: string; euiColorPickerValueRange0: string; euiColorPickerValueRange1: string; euiColorPickerSaturationRange0: string; euiColorPickerSaturationRange1: string; euiColorPickerIndicatorSize: string; euiColorPickerWidth: string; euiColorPaletteDisplaySizes: { sizeExtraSmall: string; sizeSmall: string; sizeMedium: string; }; euiContextMenuWidth: string; euiControlBarBackground: string; euiControlBarText: string; euiControlBarBorderColor: string; euiControlBarInitialHeight: string; euiControlBarMaxHeight: string; euiControlBarHeights: { s: string; m: string; l: string; }; euiDataGridPrefix: string; euiDataGridStyles: string; euiDataGridColumnResizerWidth: string; euiDataGridPopoverMaxHeight: string; euiDataGridCellPaddingS: string; euiDataGridCellPaddingM: string; euiDataGridCellPaddingL: string; euiDataGridVerticalBorder: string; euiDatePickerCalendarWidth: string; euiSuperDatePickerWidth: string; euiSuperDatePickerButtonWidth: string; euiDragAndDropSpacing: { s: string; m: string; l: string; }; euiExpressionColors: { subdued: string; primary: string; secondary: string; warning: string; danger: string; accent: string; }; euiFacetGutterSizes: { gutterNone: number; gutterSmall: string; gutterMedium: string; gutterLarge: string; }; gutterTypes: { gutterExtraSmall: string; gutterSmall: string; gutterMedium: string; gutterLarge: string; gutterExtraLarge: string; }; fractions: { fourths: { percentage: string; count: number; }; thirds: { percentage: string; count: number; }; halves: { percentage: string; count: number; }; single: { percentage: string; count: number; }; }; flyoutSizes: { small: { min: string; width: string; max: string; }; medium: { min: string; width: string; max: string; }; large: { min: string; width: string; max: string; }; }; euiFlyoutBorder: string; euiFlyoutPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiFilePickerTallHeight: string; euiRangeLevelColors: { primary: string; success: string; warning: string; danger: string; }; textareaResizing: { vertical: string; horizontal: string; both: string; none: string; }; euiHeaderLinksGutterSizes: { gutterXS: string; gutterS: string; gutterM: string; gutterL: string; }; ruleMargins: { marginXSmall: string; marginSmall: string; marginMedium: string; marginLarge: string; marginXLarge: string; marginXXLarge: string; }; euiIconLoadingOpacity: number; euiIconColors: { accent: string; danger: string; ghost: string; primary: string; secondary: string; success: string; subdued: string; text: string; warning: string; inherit: string; }; euiIconSizes: { small: string; medium: string; large: string; xLarge: string; xxLarge: string; }; euiKeyPadMenuSize: string; euiKeyPadMenuItemBetaBadgeSize: string; euiLinkColors: { subdued: string; primary: string; secondary: string; accent: string; warning: string; danger: string; text: string; ghost: string; }; euiListGroupItemHoverBackground: string; euiListGroupItemHoverBackgroundGhost: string; euiListGroupGutterTypes: { gutterSmall: string; gutterMedium: string; }; euiListGroupItemColorTypes: { primary: string; text: string; subdued: string; ghost: string; }; euiListGroupItemSizeTypes: { xSmall: string; small: string; medium: string; large: string; }; euiGradientStartStop: string; euiGradientMiddle: string; browserDefaultFontSize: string; euiMarkdownEditorMinHeight: string; euiPopoverArrowSize: string; euiPopoverTranslateDistance: string; euiProgressSizes: { xs: string; s: string; m: string; l: string; }; euiProgressColors: { primary: string; secondary: string; success: string; warning: string; danger: string; accent: string; subdued: string; vis0: string; vis1: string; vis2: string; vis3: string; vis4: string; vis5: string; vis6: string; vis7: string; vis8: string; vis9: string; customColor: string; }; euiResizableButtonTransitionSpeed: string; euiResizableButtonSize: string; euiSelectableListItemBorder: string; euiSelectableListItemPadding: string; euiSelectableTemplateSitewideTypes: { application: { color: string; 'font-weight': number; }; deployment: { color: string; 'font-weight': number; }; article: { color: string; 'font-weight': number; }; case: { color: string; 'font-weight': number; }; platform: { color: string; 'font-weight': number; }; }; euiSideNavEmphasizedBackgroundColor: string; euiSideNavRootTextcolor: string; euiSideNavBranchTextcolor: string; euiSideNavSelectedTextcolor: string; spacerSizes: { xs: string; s: string; m: string; l: string; xl: string; xxl: string; }; euiStepNumberSize: string; euiStepNumberSmallSize: string; euiStepNumberMargin: string; euiStepStatusColorsToFade: { warning: string; danger: string; disabled: string; incomplete: string; }; euiSuggestItemColors: { tint0: string; tint1: string; tint2: string; tint3: string; tint4: string; tint5: string; tint6: string; tint7: string; tint8: string; tint9: string; tint10: string; }; euiTableCellContentPadding: string; euiTableCellContentPaddingCompressed: string; euiTableCellCheckboxWidth: string; euiTableActionsAreaWidth: string; euiTableHoverColor: string; euiTableSelectedColor: string; euiTableHoverSelectedColor: string; euiTableActionsBorderColor: string; euiTableHoverClickableColor: string; euiTableFocusClickableColor: string; euiTabFontSize: string; euiTabFontSizeS: string; euiTabFontSizeL: string; euiTextColors: { default: string; subdued: string; secondary: string; accent: string; warning: string; danger: string; ghost: string; }; euiTextConstrainedMaxWidth: string; euiToastWidth: string; euiToastTypes: { primary: string; success: string; warning: string; danger: string; }; euiTokenGrayColor: string; euiTokenTypes: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; gray: { graphic: string; behindText: string; }; }; euiTokenTypeKeys: string; euiAnimSlightBounce: string; euiAnimSlightResistance: string; euiAnimSpeedExtraFast: string; euiAnimSpeedFast: string; euiAnimSpeedNormal: string; euiAnimSpeedSlow: string; euiAnimSpeedExtraSlow: string; euiBorderWidthThin: string; euiBorderWidthThick: string; euiBorderColor: string; euiBorderRadius: string; euiBorderRadiusSmall: string; euiBorderThick: string; euiBorderThin: string; euiBorderEditable: string; euiButtonHeight: string; euiButtonHeightSmall: string; euiButtonHeightXSmall: string; euiButtonColorDisabled: string; euiButtonColorDisabledText: string; euiButtonColorGhostDisabled: string; euiButtonTypes: { primary: string; secondary: string; warning: string; danger: string; ghost: string; text: string; }; euiColorGhost: string; euiColorInk: string; euiColorPrimary: string; euiColorSecondary: string; euiColorAccent: string; euiColorSuccess: string; euiColorWarning: string; euiColorDanger: string; euiColorEmptyShade: string; euiColorLightestShade: string; euiColorLightShade: string; euiColorMediumShade: string; euiColorDarkShade: string; euiColorDarkestShade: string; euiColorFullShade: string; euiPageBackgroundColor: string; euiColorHighlight: string; euiTextColor: string; euiTitleColor: string; euiTextSubduedColor: string; euiColorDisabled: string; euiColorPrimaryText: string; euiColorSecondaryText: string; euiColorAccentText: string; euiColorWarningText: string; euiColorDangerText: string; euiColorDisabledText: string; euiColorSuccessText: string; euiLinkColor: string; euiPaletteColorBlind: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; }; euiPaletteColorBlindKeys: string; euiColorVis0: string; euiColorVis1: string; euiColorVis2: string; euiColorVis3: string; euiColorVis4: string; euiColorVis5: string; euiColorVis6: string; euiColorVis7: string; euiColorVis8: string; euiColorVis9: string; euiColorVis0_behindText: string; euiColorVis1_behindText: string; euiColorVis2_behindText: string; euiColorVis3_behindText: string; euiColorVis4_behindText: string; euiColorVis5_behindText: string; euiColorVis6_behindText: string; euiColorVis7_behindText: string; euiColorVis8_behindText: string; euiColorVis9_behindText: string; euiColorChartLines: string; euiColorChartBand: string; euiCodeBlockBackgroundColor: string; euiCodeBlockColor: string; euiCodeBlockSelectedBackgroundColor: string; euiCodeBlockCommentColor: string; euiCodeBlockSelectorTagColor: string; euiCodeBlockStringColor: string; euiCodeBlockTagColor: string; euiCodeBlockNameColor: string; euiCodeBlockNumberColor: string; euiCodeBlockKeywordColor: string; euiCodeBlockFunctionTitleColor: string; euiCodeBlockTypeColor: string; euiCodeBlockAttributeColor: string; euiCodeBlockSymbolColor: string; euiCodeBlockParamsColor: string; euiCodeBlockMetaColor: string; euiCodeBlockTitleColor: string; euiCodeBlockSectionColor: string; euiCodeBlockAdditionColor: string; euiCodeBlockDeletionColor: string; euiCodeBlockSelectorClassColor: string; euiCodeBlockSelectorIdColor: string; euiFormMaxWidth: string; euiFormControlHeight: string; euiFormControlCompressedHeight: string; euiFormControlPadding: string; euiFormControlCompressedPadding: string; euiFormControlBorderRadius: number; euiFormControlCompressedBorderRadius: string; euiRadioSize: string; euiCheckBoxSize: string; euiCheckboxBorderRadius: string; euiSwitchHeight: string; euiSwitchWidth: string; euiSwitchThumbSize: string; euiSwitchIconHeight: string; euiSwitchHeightCompressed: string; euiSwitchWidthCompressed: string; euiSwitchThumbSizeCompressed: string; euiSwitchHeightMini: string; euiSwitchWidthMini: string; euiSwitchThumbSizeMini: string; euiFormBackgroundColor: string; euiFormBackgroundDisabledColor: string; euiFormBackgroundReadOnlyColor: string; euiFormBorderOpaqueColor: string; euiFormBorderColor: string; euiFormBorderDisabledColor: string; euiFormCustomControlDisabledIconColor: string; euiFormCustomControlBorderColor: string; euiFormControlDisabledColor: string; euiFormControlBoxShadow: string; euiFormControlPlaceholderText: string; euiFormInputGroupLabelBackground: string; euiFormInputGroupBorder: string; euiSwitchOffColor: string; euiFormControlLayoutGroupInputHeight: string; euiFormControlLayoutGroupInputCompressedHeight: string; euiFormControlLayoutGroupInputCompressedBorderRadius: string; euiRangeTrackColor: string; euiRangeThumbRadius: string; euiRangeThumbHeight: string; euiRangeThumbWidth: string; euiRangeThumbBorderColor: string; euiRangeTrackWidth: string; euiRangeTrackHeight: string; euiRangeTrackBorderWidth: number; euiRangeTrackBorderColor: string; euiRangeTrackRadius: string; euiRangeDisabledOpacity: number; euiRangeHighlightHeight: string; euiHeaderBackgroundColor: string; euiHeaderDarkBackgroundColor: string; euiHeaderBorderColor: string; euiHeaderBreadcrumbColor: string; euiHeaderHeight: string; euiHeaderChildSize: string; euiHeaderHeightCompensation: string; euiPageDefaultMaxWidth: string; euiPageSidebarMinWidth: string; euiPanelPaddingModifiers: { paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiPanelBorderRadiusModifiers: { borderRadiusNone: number; borderRadiusMedium: string; }; euiPanelBackgroundColorModifiers: { transparent: string; plain: string; subdued: string; accent: string; primary: string; success: string; warning: string; danger: string; }; euiBreakpoints: { xs: number; s: string; m: string; l: string; xl: string; }; euiBreakpointKeys: string; euiShadowColor: string; euiShadowColorLarge: string; euiSize: string; euiSizeXS: string; euiSizeS: string; euiSizeM: string; euiSizeL: string; euiSizeXL: string; euiSizeXXL: string; euiButtonMinWidth: string; euiScrollBar: string; euiScrollBarCorner: string; euiFocusRingColor: string; euiFocusRingAnimStartColor: string; euiFocusRingAnimStartSize: string; euiFocusRingAnimStartSizeLarge: string; euiFocusRingSizeLarge: string; euiFocusRingSize: string; euiFocusTransparency: number; euiFocusBackgroundColor: string; euiTooltipBackgroundColor: string; euiTooltipAnimations: { top: string; left: string; bottom: string; right: string; }; euiFontFamily: string; euiCodeFontFamily: string; euiFontFeatureSettings: string; euiTextScale: string; euiFontSize: string; euiFontSizeXS: string; euiFontSizeS: string; euiFontSizeM: string; euiFontSizeL: string; euiFontSizeXL: string; euiFontSizeXXL: string; euiLineHeight: number; euiBodyLineHeight: number; euiFontWeightLight: number; euiFontWeightRegular: number; euiFontWeightMedium: number; euiFontWeightSemiBold: number; euiFontWeightBold: number; euiCodeFontWeightRegular: number; euiCodeFontWeightBold: number; euiTitles: { xxxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xs: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; s: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; m: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; l: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; }; euiZLevel0: number; euiZLevel1: number; euiZLevel2: number; euiZLevel3: number; euiZLevel4: number; euiZLevel5: number; euiZLevel6: number; euiZLevel7: number; euiZLevel8: number; euiZLevel9: number; euiZContent: number; euiZHeader: number; euiZContentMenu: number; euiZFlyout: number; euiZNavigation: number; euiZMask: number; euiZModal: number; euiZToastList: number; } | { paddingSizes: { xs: string; s: string; m: string; l: string; xl: string; }; avatarSizing: { s: { size: string; 'font-size': string; }; m: { size: string; 'font-size': string; }; l: { size: string; 'font-size': string; }; xl: { size: string; 'font-size': string; }; }; euiBadgeGroupGutterTypes: { gutterExtraSmall: string; gutterSmall: string; }; euiBreadcrumbSpacing: string; euiBreadcrumbTruncateWidth: string; euiButtonEmptyTypes: { primary: string; danger: string; disabled: string; ghost: string; text: string; success: string; warning: string; }; euiButtonIconTypes: { accent: string; danger: string; ghost: string; primary: string; subdued: string; success: string; text: string; warning: string; }; euiCallOutTypes: { primary: string; success: string; warning: string; danger: string; }; euiCardSpacing: string; euiCardBottomNodeHeight: string; euiCardSelectButtonBorders: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardSelectButtonBackgrounds: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiCheckableCardPadding: string; euiCollapsibleNavWidth: string; euiCollapsibleNavGroupLightBackgroundColor: string; euiCollapsibleNavGroupDarkBackgroundColor: string; euiCollapsibleNavGroupDarkHighContrastColor: string; euiColorPickerValueRange0: string; euiColorPickerValueRange1: string; euiColorPickerSaturationRange0: string; euiColorPickerSaturationRange1: string; euiColorPickerIndicatorSize: string; euiColorPickerWidth: string; euiColorPaletteDisplaySizes: { sizeExtraSmall: string; sizeSmall: string; sizeMedium: string; }; euiContextMenuWidth: string; euiControlBarBackground: string; euiControlBarText: string; euiControlBarBorderColor: string; euiControlBarInitialHeight: string; euiControlBarMaxHeight: string; euiControlBarHeights: { s: string; m: string; l: string; }; euiDataGridPrefix: string; euiDataGridStyles: string; euiDataGridColumnResizerWidth: string; euiDataGridPopoverMaxHeight: string; euiDataGridCellPaddingS: string; euiDataGridCellPaddingM: string; euiDataGridCellPaddingL: string; euiDataGridVerticalBorder: string; euiDatePickerCalendarWidth: string; euiSuperDatePickerWidth: string; euiSuperDatePickerButtonWidth: string; euiDragAndDropSpacing: { s: string; m: string; l: string; }; euiExpressionColors: { subdued: string; primary: string; secondary: string; warning: string; danger: string; accent: string; }; euiFacetGutterSizes: { gutterNone: number; gutterSmall: string; gutterMedium: string; gutterLarge: string; }; gutterTypes: { gutterExtraSmall: string; gutterSmall: string; gutterMedium: string; gutterLarge: string; gutterExtraLarge: string; }; fractions: { fourths: { percentage: string; count: number; }; thirds: { percentage: string; count: number; }; halves: { percentage: string; count: number; }; single: { percentage: string; count: number; }; }; flyoutSizes: { small: { min: string; width: string; max: string; }; medium: { min: string; width: string; max: string; }; large: { min: string; width: string; max: string; }; }; euiFlyoutBorder: string; euiFlyoutPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiFilePickerTallHeight: string; euiRangeLevelColors: { primary: string; success: string; warning: string; danger: string; }; textareaResizing: { vertical: string; horizontal: string; both: string; none: string; }; euiHeaderLinksGutterSizes: { gutterXS: string; gutterS: string; gutterM: string; gutterL: string; }; ruleMargins: { marginXSmall: string; marginSmall: string; marginMedium: string; marginLarge: string; marginXLarge: string; marginXXLarge: string; }; euiIconLoadingOpacity: number; euiIconColors: { accent: string; danger: string; ghost: string; primary: string; secondary: string; success: string; subdued: string; text: string; warning: string; inherit: string; }; euiIconSizes: { small: string; medium: string; large: string; xLarge: string; xxLarge: string; }; euiKeyPadMenuSize: string; euiKeyPadMenuItemBetaBadgeSize: string; euiLinkColors: { subdued: string; primary: string; secondary: string; accent: string; warning: string; danger: string; text: string; ghost: string; }; euiListGroupItemHoverBackground: string; euiListGroupItemHoverBackgroundGhost: string; euiListGroupGutterTypes: { gutterSmall: string; gutterMedium: string; }; euiListGroupItemColorTypes: { primary: string; text: string; subdued: string; ghost: string; }; euiListGroupItemSizeTypes: { xSmall: string; small: string; medium: string; large: string; }; euiGradientStartStop: string; euiGradientMiddle: string; browserDefaultFontSize: string; euiMarkdownEditorMinHeight: string; euiPopoverArrowSize: string; euiPopoverTranslateDistance: string; euiProgressSizes: { xs: string; s: string; m: string; l: string; }; euiProgressColors: { primary: string; secondary: string; success: string; warning: string; danger: string; accent: string; subdued: string; vis0: string; vis1: string; vis2: string; vis3: string; vis4: string; vis5: string; vis6: string; vis7: string; vis8: string; vis9: string; customColor: string; }; euiResizableButtonTransitionSpeed: string; euiResizableButtonSize: string; euiSelectableListItemBorder: string; euiSelectableListItemPadding: string; euiSelectableTemplateSitewideTypes: { application: { color: string; 'font-weight': number; }; deployment: { color: string; 'font-weight': number; }; article: { color: string; 'font-weight': number; }; case: { color: string; 'font-weight': number; }; platform: { color: string; 'font-weight': number; }; }; euiSideNavEmphasizedBackgroundColor: string; euiSideNavRootTextcolor: string; euiSideNavBranchTextcolor: string; euiSideNavSelectedTextcolor: string; spacerSizes: { xs: string; s: string; m: string; l: string; xl: string; xxl: string; }; euiStepNumberSize: string; euiStepNumberSmallSize: string; euiStepNumberMargin: string; euiStepStatusColorsToFade: { warning: string; danger: string; disabled: string; incomplete: string; }; euiSuggestItemColors: { tint0: string; tint1: string; tint2: string; tint3: string; tint4: string; tint5: string; tint6: string; tint7: string; tint8: string; tint9: string; tint10: string; }; euiTableCellContentPadding: string; euiTableCellContentPaddingCompressed: string; euiTableCellCheckboxWidth: string; euiTableActionsAreaWidth: string; euiTableHoverColor: string; euiTableSelectedColor: string; euiTableHoverSelectedColor: string; euiTableActionsBorderColor: string; euiTableHoverClickableColor: string; euiTableFocusClickableColor: string; euiTabFontSize: string; euiTabFontSizeS: string; euiTabFontSizeL: string; euiTextColors: { default: string; subdued: string; secondary: string; accent: string; warning: string; danger: string; ghost: string; }; euiTextConstrainedMaxWidth: string; euiToastWidth: string; euiToastTypes: { primary: string; success: string; warning: string; danger: string; }; euiTokenGrayColor: string; euiTokenTypes: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; gray: { graphic: string; behindText: string; }; }; euiTokenTypeKeys: string; euiAnimSlightBounce: string; euiAnimSlightResistance: string; euiAnimSpeedExtraFast: string; euiAnimSpeedFast: string; euiAnimSpeedNormal: string; euiAnimSpeedSlow: string; euiAnimSpeedExtraSlow: string; euiBorderWidthThin: string; euiBorderWidthThick: string; euiBorderColor: string; euiBorderRadius: string; euiBorderRadiusSmall: string; euiBorderThick: string; euiBorderThin: string; euiBorderEditable: string; euiButtonHeight: string; euiButtonHeightSmall: string; euiButtonHeightXSmall: string; euiButtonColorDisabled: string; euiButtonColorDisabledText: string; euiButtonColorGhostDisabled: string; euiButtonTypes: { primary: string; secondary: string; warning: string; danger: string; ghost: string; text: string; }; euiColorGhost: string; euiColorInk: string; euiColorPrimary: string; euiColorSecondary: string; euiColorAccent: string; euiColorSuccess: string; euiColorWarning: string; euiColorDanger: string; euiColorEmptyShade: string; euiColorLightestShade: string; euiColorLightShade: string; euiColorMediumShade: string; euiColorDarkShade: string; euiColorDarkestShade: string; euiColorFullShade: string; euiPageBackgroundColor: string; euiColorHighlight: string; euiTextColor: string; euiTitleColor: string; euiTextSubduedColor: string; euiColorDisabled: string; euiColorPrimaryText: string; euiColorSecondaryText: string; euiColorAccentText: string; euiColorWarningText: string; euiColorDangerText: string; euiColorDisabledText: string; euiColorSuccessText: string; euiLinkColor: string; euiPaletteColorBlind: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; }; euiPaletteColorBlindKeys: string; euiColorVis0: string; euiColorVis1: string; euiColorVis2: string; euiColorVis3: string; euiColorVis4: string; euiColorVis5: string; euiColorVis6: string; euiColorVis7: string; euiColorVis8: string; euiColorVis9: string; euiColorVis0_behindText: string; euiColorVis1_behindText: string; euiColorVis2_behindText: string; euiColorVis3_behindText: string; euiColorVis4_behindText: string; euiColorVis5_behindText: string; euiColorVis6_behindText: string; euiColorVis7_behindText: string; euiColorVis8_behindText: string; euiColorVis9_behindText: string; euiColorChartLines: string; euiColorChartBand: string; euiCodeBlockBackgroundColor: string; euiCodeBlockColor: string; euiCodeBlockSelectedBackgroundColor: string; euiCodeBlockCommentColor: string; euiCodeBlockSelectorTagColor: string; euiCodeBlockStringColor: string; euiCodeBlockTagColor: string; euiCodeBlockNameColor: string; euiCodeBlockNumberColor: string; euiCodeBlockKeywordColor: string; euiCodeBlockFunctionTitleColor: string; euiCodeBlockTypeColor: string; euiCodeBlockAttributeColor: string; euiCodeBlockSymbolColor: string; euiCodeBlockParamsColor: string; euiCodeBlockMetaColor: string; euiCodeBlockTitleColor: string; euiCodeBlockSectionColor: string; euiCodeBlockAdditionColor: string; euiCodeBlockDeletionColor: string; euiCodeBlockSelectorClassColor: string; euiCodeBlockSelectorIdColor: string; euiFormMaxWidth: string; euiFormControlHeight: string; euiFormControlCompressedHeight: string; euiFormControlPadding: string; euiFormControlCompressedPadding: string; euiFormControlBorderRadius: number; euiFormControlCompressedBorderRadius: string; euiRadioSize: string; euiCheckBoxSize: string; euiCheckboxBorderRadius: string; euiSwitchHeight: string; euiSwitchWidth: string; euiSwitchThumbSize: string; euiSwitchIconHeight: string; euiSwitchHeightCompressed: string; euiSwitchWidthCompressed: string; euiSwitchThumbSizeCompressed: string; euiSwitchHeightMini: string; euiSwitchWidthMini: string; euiSwitchThumbSizeMini: string; euiFormBackgroundColor: string; euiFormBackgroundDisabledColor: string; euiFormBackgroundReadOnlyColor: string; euiFormBorderOpaqueColor: string; euiFormBorderColor: string; euiFormBorderDisabledColor: string; euiFormCustomControlDisabledIconColor: string; euiFormCustomControlBorderColor: string; euiFormControlDisabledColor: string; euiFormControlBoxShadow: string; euiFormControlPlaceholderText: string; euiFormInputGroupLabelBackground: string; euiFormInputGroupBorder: string; euiSwitchOffColor: string; euiFormControlLayoutGroupInputHeight: string; euiFormControlLayoutGroupInputCompressedHeight: string; euiFormControlLayoutGroupInputCompressedBorderRadius: string; euiRangeTrackColor: string; euiRangeThumbRadius: string; euiRangeThumbHeight: string; euiRangeThumbWidth: string; euiRangeThumbBorderColor: string; euiRangeTrackWidth: string; euiRangeTrackHeight: string; euiRangeTrackBorderWidth: number; euiRangeTrackBorderColor: string; euiRangeTrackRadius: string; euiRangeDisabledOpacity: number; euiRangeHighlightHeight: string; euiHeaderBackgroundColor: string; euiHeaderDarkBackgroundColor: string; euiHeaderBorderColor: string; euiHeaderBreadcrumbColor: string; euiHeaderHeight: string; euiHeaderChildSize: string; euiHeaderHeightCompensation: string; euiPageDefaultMaxWidth: string; euiPageSidebarMinWidth: string; euiPanelPaddingModifiers: { paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiPanelBorderRadiusModifiers: { borderRadiusNone: number; borderRadiusMedium: string; }; euiPanelBackgroundColorModifiers: { transparent: string; plain: string; subdued: string; accent: string; primary: string; success: string; warning: string; danger: string; }; euiBreakpoints: { xs: number; s: string; m: string; l: string; xl: string; }; euiBreakpointKeys: string; euiShadowColor: string; euiShadowColorLarge: string; euiSize: string; euiSizeXS: string; euiSizeS: string; euiSizeM: string; euiSizeL: string; euiSizeXL: string; euiSizeXXL: string; euiButtonMinWidth: string; euiScrollBar: string; euiScrollBarCorner: string; euiFocusRingColor: string; euiFocusRingAnimStartColor: string; euiFocusRingAnimStartSize: string; euiFocusRingAnimStartSizeLarge: string; euiFocusRingSizeLarge: string; euiFocusRingSize: string; euiFocusTransparency: number; euiFocusBackgroundColor: string; euiTooltipBackgroundColor: string; euiTooltipAnimations: { top: string; left: string; bottom: string; right: string; }; euiFontFamily: string; euiCodeFontFamily: string; euiFontFeatureSettings: string; euiTextScale: string; euiFontSize: string; euiFontSizeXS: string; euiFontSizeS: string; euiFontSizeM: string; euiFontSizeL: string; euiFontSizeXL: string; euiFontSizeXXL: string; euiLineHeight: number; euiBodyLineHeight: number; euiFontWeightLight: number; euiFontWeightRegular: number; euiFontWeightMedium: number; euiFontWeightSemiBold: number; euiFontWeightBold: number; euiCodeFontWeightRegular: number; euiCodeFontWeightBold: number; euiTitles: { xxxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xs: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; s: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; m: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; l: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; }; euiZLevel0: number; euiZLevel1: number; euiZLevel2: number; euiZLevel3: number; euiZLevel4: number; euiZLevel5: number; euiZLevel6: number; euiZLevel7: number; euiZLevel8: number; euiZLevel9: number; euiZContent: number; euiZHeader: number; euiZContentMenu: number; euiZFlyout: number; euiZNavigation: number; euiZMask: number; euiZModal: number; euiZToastList: number; }" + "{ paddingSizes: { xs: string; s: string; m: string; l: string; xl: string; }; avatarSizing: { s: { size: string; 'font-size': string; }; m: { size: string; 'font-size': string; }; l: { size: string; 'font-size': string; }; xl: { size: string; 'font-size': string; }; }; euiBadgeGroupGutterTypes: { gutterExtraSmall: string; gutterSmall: string; }; euiBreadcrumbSpacing: string; euiBreadcrumbTruncateWidth: string; euiButtonEmptyTypes: { primary: string; danger: string; disabled: string; ghost: string; text: string; success: string; warning: string; }; euiCallOutTypes: { primary: string; success: string; warning: string; danger: string; }; euiCardSpacing: string; euiCardBottomNodeHeight: string; euiCardSelectButtonBorders: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardSelectButtonBackgrounds: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiCheckableCardPadding: string; euiCollapsibleNavGroupLightBackgroundColor: string; euiCollapsibleNavGroupDarkBackgroundColor: string; euiCollapsibleNavGroupDarkHighContrastColor: string; euiColorPickerValueRange0: string; euiColorPickerValueRange1: string; euiColorPickerSaturationRange0: string; euiColorPickerSaturationRange1: string; euiColorPickerIndicatorSize: string; euiColorPickerWidth: string; euiColorPaletteDisplaySizes: { sizeExtraSmall: string; sizeSmall: string; sizeMedium: string; }; euiContextMenuWidth: string; euiControlBarBackground: string; euiControlBarText: string; euiControlBarBorderColor: string; euiControlBarInitialHeight: string; euiControlBarMaxHeight: string; euiControlBarHeights: { s: string; m: string; l: string; }; euiDataGridPrefix: string; euiDataGridStyles: string; euiDataGridColumnResizerWidth: string; euiDataGridPopoverMaxHeight: string; euiDataGridCellPaddingS: string; euiDataGridCellPaddingM: string; euiDataGridCellPaddingL: string; euiDataGridVerticalBorder: string; euiDatePickerCalendarWidth: string; euiSuperDatePickerWidth: string; euiSuperDatePickerButtonWidth: string; euiDragAndDropSpacing: { s: string; m: string; l: string; }; euiExpressionColors: { subdued: string; primary: string; success: string; secondary: string; warning: string; danger: string; accent: string; }; euiFacetGutterSizes: { gutterNone: number; gutterSmall: string; gutterMedium: string; gutterLarge: string; }; gutterTypes: { gutterExtraSmall: string; gutterSmall: string; gutterMedium: string; gutterLarge: string; gutterExtraLarge: string; }; fractions: { fourths: { percentage: string; count: number; }; thirds: { percentage: string; count: number; }; halves: { percentage: string; count: number; }; single: { percentage: string; count: number; }; }; flyoutSizes: { small: { min: string; width: string; max: string; }; medium: { min: string; width: string; max: string; }; large: { min: string; width: string; max: string; }; }; euiFlyoutBorder: string; euiFlyoutPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiFilePickerTallHeight: string; euiRangeLevelColors: { primary: string; success: string; warning: string; danger: string; }; textareaResizing: { vertical: string; horizontal: string; both: string; none: string; }; euiHeaderLinksGutterSizes: { gutterXS: string; gutterS: string; gutterM: string; gutterL: string; }; ruleMargins: { marginXSmall: string; marginSmall: string; marginMedium: string; marginLarge: string; marginXLarge: string; marginXXLarge: string; }; euiIconLoadingOpacity: number; euiIconColors: { accent: string; danger: string; ghost: string; primary: string; secondary: string; success: string; subdued: string; text: string; warning: string; inherit: string; }; euiIconSizes: { small: string; medium: string; large: string; xLarge: string; xxLarge: string; }; euiKeyPadMenuSize: string; euiKeyPadMenuItemBetaBadgeSize: string; euiLinkColors: { subdued: string; primary: string; secondary: string; success: string; accent: string; warning: string; danger: string; text: string; ghost: string; }; euiListGroupItemHoverBackground: string; euiListGroupItemHoverBackgroundGhost: string; euiListGroupGutterTypes: { gutterSmall: string; gutterMedium: string; }; euiListGroupItemColorTypes: { primary: string; text: string; subdued: string; ghost: string; }; euiListGroupItemSizeTypes: { xSmall: string; small: string; medium: string; large: string; }; euiGradientStartStop: string; euiGradientMiddle: string; browserDefaultFontSize: string; euiMarkdownEditorMinHeight: string; euiPopoverArrowSize: string; euiPopoverTranslateDistance: string; euiProgressSizes: { xs: string; s: string; m: string; l: string; }; euiProgressColors: { primary: string; secondary: string; success: string; warning: string; danger: string; accent: string; subdued: string; vis0: string; vis1: string; vis2: string; vis3: string; vis4: string; vis5: string; vis6: string; vis7: string; vis8: string; vis9: string; customColor: string; }; euiResizableButtonTransitionSpeed: string; euiResizableButtonSize: string; euiSelectableListItemBorder: string; euiSelectableListItemPadding: string; euiSelectableTemplateSitewideTypes: { application: { color: string; 'font-weight': number; }; deployment: { color: string; 'font-weight': number; }; article: { color: string; 'font-weight': number; }; case: { color: string; 'font-weight': number; }; platform: { color: string; 'font-weight': number; }; }; euiSideNavEmphasizedBackgroundColor: string; euiSideNavRootTextcolor: string; euiSideNavBranchTextcolor: string; euiSideNavSelectedTextcolor: string; euiSideNavDisabledTextcolor: string; spacerSizes: { xs: string; s: string; m: string; l: string; xl: string; xxl: string; }; euiStepNumberSize: string; euiStepNumberSmallSize: string; euiStepNumberMargin: string; euiStepStatusColorsToFade: { warning: string; danger: string; disabled: string; incomplete: string; }; euiSuggestItemColors: { tint0: string; tint1: string; tint2: string; tint3: string; tint4: string; tint5: string; tint6: string; tint7: string; tint8: string; tint9: string; tint10: string; }; euiTableCellContentPadding: string; euiTableCellContentPaddingCompressed: string; euiTableCellCheckboxWidth: string; euiTableActionsAreaWidth: string; euiTableHoverColor: string; euiTableSelectedColor: string; euiTableHoverSelectedColor: string; euiTableActionsBorderColor: string; euiTableHoverClickableColor: string; euiTableFocusClickableColor: string; euiTabFontSize: string; euiTabFontSizeS: string; euiTabFontSizeL: string; euiTextColors: { default: string; subdued: string; secondary: string; success: string; accent: string; warning: string; danger: string; ghost: string; }; euiTextConstrainedMaxWidth: string; euiToastWidth: string; euiToastTypes: { primary: string; success: string; warning: string; danger: string; }; euiTokenGrayColor: string; euiTokenTypes: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; gray: { graphic: string; behindText: string; }; }; euiTokenTypeKeys: string; euiContrastRatioText: number; euiContrastRatioGraphic: number; euiContrastRatioDisabled: number; euiAnimSlightBounce: string; euiAnimSlightResistance: string; euiAnimSpeedExtraFast: string; euiAnimSpeedFast: string; euiAnimSpeedNormal: string; euiAnimSpeedSlow: string; euiAnimSpeedExtraSlow: string; euiBorderWidthThin: string; euiBorderWidthThick: string; euiBorderColor: string; euiBorderRadius: string; euiBorderRadiusSmall: string; euiBorderThick: string; euiBorderThin: string; euiBorderEditable: string; euiButtonHeight: string; euiButtonHeightSmall: string; euiButtonHeightXSmall: string; euiButtonColorDisabled: string; euiButtonColorDisabledText: string; euiButtonColorGhostDisabled: string; euiButtonTypes: { primary: string; accent: string; secondary: string; success: string; warning: string; danger: string; subdued: string; ghost: string; text: string; }; euiColorGhost: string; euiColorInk: string; euiColorPrimary: string; euiColorSecondary: string; euiColorAccent: string; euiColorSuccess: string; euiColorWarning: string; euiColorDanger: string; euiColorEmptyShade: string; euiColorLightestShade: string; euiColorLightShade: string; euiColorMediumShade: string; euiColorDarkShade: string; euiColorDarkestShade: string; euiColorFullShade: string; euiPageBackgroundColor: string; euiColorHighlight: string; euiTextColor: string; euiTitleColor: string; euiTextSubduedColor: string; euiColorDisabled: string; euiColorPrimaryText: string; euiColorSecondaryText: string; euiColorAccentText: string; euiColorWarningText: string; euiColorDangerText: string; euiColorDisabledText: string; euiColorSuccessText: string; euiLinkColor: string; euiPaletteColorBlind: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; }; euiPaletteColorBlindKeys: string; euiColorVis0: string; euiColorVis1: string; euiColorVis2: string; euiColorVis3: string; euiColorVis4: string; euiColorVis5: string; euiColorVis6: string; euiColorVis7: string; euiColorVis8: string; euiColorVis9: string; euiColorVis0_behindText: string; euiColorVis1_behindText: string; euiColorVis2_behindText: string; euiColorVis3_behindText: string; euiColorVis4_behindText: string; euiColorVis5_behindText: string; euiColorVis6_behindText: string; euiColorVis7_behindText: string; euiColorVis8_behindText: string; euiColorVis9_behindText: string; euiColorChartLines: string; euiColorChartBand: string; euiCodeBlockBackgroundColor: string; euiCodeBlockColor: string; euiCodeBlockSelectedBackgroundColor: string; euiCodeBlockCommentColor: string; euiCodeBlockSelectorTagColor: string; euiCodeBlockStringColor: string; euiCodeBlockTagColor: string; euiCodeBlockNameColor: string; euiCodeBlockNumberColor: string; euiCodeBlockKeywordColor: string; euiCodeBlockFunctionTitleColor: string; euiCodeBlockTypeColor: string; euiCodeBlockAttributeColor: string; euiCodeBlockSymbolColor: string; euiCodeBlockParamsColor: string; euiCodeBlockMetaColor: string; euiCodeBlockTitleColor: string; euiCodeBlockSectionColor: string; euiCodeBlockAdditionColor: string; euiCodeBlockDeletionColor: string; euiCodeBlockSelectorClassColor: string; euiCodeBlockSelectorIdColor: string; euiFormMaxWidth: string; euiFormControlHeight: string; euiFormControlCompressedHeight: string; euiFormControlPadding: string; euiFormControlCompressedPadding: string; euiFormControlBorderRadius: number; euiFormControlCompressedBorderRadius: string; euiRadioSize: string; euiCheckBoxSize: string; euiCheckboxBorderRadius: string; euiSwitchHeight: string; euiSwitchWidth: string; euiSwitchThumbSize: string; euiSwitchIconHeight: string; euiSwitchHeightCompressed: string; euiSwitchWidthCompressed: string; euiSwitchThumbSizeCompressed: string; euiSwitchHeightMini: string; euiSwitchWidthMini: string; euiSwitchThumbSizeMini: string; euiFormBackgroundColor: string; euiFormBackgroundDisabledColor: string; euiFormBackgroundReadOnlyColor: string; euiFormBorderOpaqueColor: string; euiFormBorderColor: string; euiFormBorderDisabledColor: string; euiFormCustomControlDisabledIconColor: string; euiFormCustomControlBorderColor: string; euiFormControlDisabledColor: string; euiFormControlBoxShadow: string; euiFormControlPlaceholderText: string; euiFormInputGroupLabelBackground: string; euiFormInputGroupBorder: string; euiSwitchOffColor: string; euiFormControlLayoutGroupInputHeight: string; euiFormControlLayoutGroupInputCompressedHeight: string; euiFormControlLayoutGroupInputCompressedBorderRadius: string; euiRangeTrackColor: string; euiRangeThumbRadius: string; euiRangeThumbHeight: string; euiRangeThumbWidth: string; euiRangeThumbBorderColor: string; euiRangeTrackWidth: string; euiRangeTrackHeight: string; euiRangeTrackBorderWidth: number; euiRangeTrackBorderColor: string; euiRangeTrackRadius: string; euiRangeDisabledOpacity: number; euiRangeHighlightHeight: string; euiHeaderBackgroundColor: string; euiHeaderDarkBackgroundColor: string; euiHeaderBorderColor: string; euiHeaderBreadcrumbColor: string; euiHeaderHeight: string; euiHeaderChildSize: string; euiHeaderHeightCompensation: string; euiPageDefaultMaxWidth: string; euiPageSidebarMinWidth: string; euiPanelPaddingModifiers: { paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiPanelBorderRadiusModifiers: { borderRadiusNone: number; borderRadiusMedium: string; }; euiPanelBackgroundColorModifiers: { transparent: string; plain: string; subdued: string; accent: string; primary: string; success: string; warning: string; danger: string; }; euiBreakpoints: { xs: number; s: string; m: string; l: string; xl: string; }; euiBreakpointKeys: string; euiShadowColor: string; euiShadowColorLarge: string; euiSize: string; euiSizeXS: string; euiSizeS: string; euiSizeM: string; euiSizeL: string; euiSizeXL: string; euiSizeXXL: string; euiButtonMinWidth: string; euiScrollBar: string; euiScrollBarCorner: string; euiFocusRingColor: string; euiFocusRingAnimStartColor: string; euiFocusRingAnimStartSize: string; euiFocusRingAnimStartSizeLarge: string; euiFocusRingSizeLarge: string; euiFocusRingSize: string; euiFocusTransparency: number; euiFocusBackgroundColor: string; euiTooltipBackgroundColor: string; euiTooltipAnimations: { top: string; left: string; bottom: string; right: string; }; euiFontFamily: string; euiCodeFontFamily: string; euiFontFeatureSettings: string; euiTextScale: string; euiFontSize: string; euiFontSizeXS: string; euiFontSizeS: string; euiFontSizeM: string; euiFontSizeL: string; euiFontSizeXL: string; euiFontSizeXXL: string; euiLineHeight: number; euiBodyLineHeight: number; euiFontWeightLight: number; euiFontWeightRegular: number; euiFontWeightMedium: number; euiFontWeightSemiBold: number; euiFontWeightBold: number; euiCodeFontWeightRegular: number; euiCodeFontWeightBold: number; euiTitles: { xxxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xs: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; s: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; m: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; l: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; }; euiZLevel0: number; euiZLevel1: number; euiZLevel2: number; euiZLevel3: number; euiZLevel4: number; euiZLevel5: number; euiZLevel6: number; euiZLevel7: number; euiZLevel8: number; euiZLevel9: number; euiZToastList: number; euiZModal: number; euiZMask: number; euiZNavigation: number; euiZContentMenu: number; euiZHeader: number; euiZFlyout: number; euiZMaskBelowHeader: number; euiZContent: number; } | { paddingSizes: { xs: string; s: string; m: string; l: string; xl: string; }; avatarSizing: { s: { size: string; 'font-size': string; }; m: { size: string; 'font-size': string; }; l: { size: string; 'font-size': string; }; xl: { size: string; 'font-size': string; }; }; euiBadgeGroupGutterTypes: { gutterExtraSmall: string; gutterSmall: string; }; euiBreadcrumbSpacing: string; euiBreadcrumbTruncateWidth: string; euiButtonEmptyTypes: { primary: string; danger: string; disabled: string; ghost: string; text: string; success: string; warning: string; }; euiCallOutTypes: { primary: string; success: string; warning: string; danger: string; }; euiCardSpacing: string; euiCardBottomNodeHeight: string; euiCardSelectButtonBorders: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardSelectButtonBackgrounds: { text: string; primary: string; success: string; danger: string; ghost: string; }; euiCardPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiCheckableCardPadding: string; euiCollapsibleNavGroupLightBackgroundColor: string; euiCollapsibleNavGroupDarkBackgroundColor: string; euiCollapsibleNavGroupDarkHighContrastColor: string; euiColorPickerValueRange0: string; euiColorPickerValueRange1: string; euiColorPickerSaturationRange0: string; euiColorPickerSaturationRange1: string; euiColorPickerIndicatorSize: string; euiColorPickerWidth: string; euiColorPaletteDisplaySizes: { sizeExtraSmall: string; sizeSmall: string; sizeMedium: string; }; euiContextMenuWidth: string; euiControlBarBackground: string; euiControlBarText: string; euiControlBarBorderColor: string; euiControlBarInitialHeight: string; euiControlBarMaxHeight: string; euiControlBarHeights: { s: string; m: string; l: string; }; euiDataGridPrefix: string; euiDataGridStyles: string; euiDataGridColumnResizerWidth: string; euiDataGridPopoverMaxHeight: string; euiDataGridCellPaddingS: string; euiDataGridCellPaddingM: string; euiDataGridCellPaddingL: string; euiDataGridVerticalBorder: string; euiDatePickerCalendarWidth: string; euiSuperDatePickerWidth: string; euiSuperDatePickerButtonWidth: string; euiDragAndDropSpacing: { s: string; m: string; l: string; }; euiExpressionColors: { subdued: string; primary: string; success: string; secondary: string; warning: string; danger: string; accent: string; }; euiFacetGutterSizes: { gutterNone: number; gutterSmall: string; gutterMedium: string; gutterLarge: string; }; gutterTypes: { gutterExtraSmall: string; gutterSmall: string; gutterMedium: string; gutterLarge: string; gutterExtraLarge: string; }; fractions: { fourths: { percentage: string; count: number; }; thirds: { percentage: string; count: number; }; halves: { percentage: string; count: number; }; single: { percentage: string; count: number; }; }; flyoutSizes: { small: { min: string; width: string; max: string; }; medium: { min: string; width: string; max: string; }; large: { min: string; width: string; max: string; }; }; euiFlyoutBorder: string; euiFlyoutPaddingModifiers: { paddingNone: number; paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiFilePickerTallHeight: string; euiRangeLevelColors: { primary: string; success: string; warning: string; danger: string; }; textareaResizing: { vertical: string; horizontal: string; both: string; none: string; }; euiHeaderLinksGutterSizes: { gutterXS: string; gutterS: string; gutterM: string; gutterL: string; }; ruleMargins: { marginXSmall: string; marginSmall: string; marginMedium: string; marginLarge: string; marginXLarge: string; marginXXLarge: string; }; euiIconLoadingOpacity: number; euiIconColors: { accent: string; danger: string; ghost: string; primary: string; secondary: string; success: string; subdued: string; text: string; warning: string; inherit: string; }; euiIconSizes: { small: string; medium: string; large: string; xLarge: string; xxLarge: string; }; euiKeyPadMenuSize: string; euiKeyPadMenuItemBetaBadgeSize: string; euiLinkColors: { subdued: string; primary: string; secondary: string; success: string; accent: string; warning: string; danger: string; text: string; ghost: string; }; euiListGroupItemHoverBackground: string; euiListGroupItemHoverBackgroundGhost: string; euiListGroupGutterTypes: { gutterSmall: string; gutterMedium: string; }; euiListGroupItemColorTypes: { primary: string; text: string; subdued: string; ghost: string; }; euiListGroupItemSizeTypes: { xSmall: string; small: string; medium: string; large: string; }; euiGradientStartStop: string; euiGradientMiddle: string; browserDefaultFontSize: string; euiMarkdownEditorMinHeight: string; euiPopoverArrowSize: string; euiPopoverTranslateDistance: string; euiProgressSizes: { xs: string; s: string; m: string; l: string; }; euiProgressColors: { primary: string; secondary: string; success: string; warning: string; danger: string; accent: string; subdued: string; vis0: string; vis1: string; vis2: string; vis3: string; vis4: string; vis5: string; vis6: string; vis7: string; vis8: string; vis9: string; customColor: string; }; euiResizableButtonTransitionSpeed: string; euiResizableButtonSize: string; euiSelectableListItemBorder: string; euiSelectableListItemPadding: string; euiSelectableTemplateSitewideTypes: { application: { color: string; 'font-weight': number; }; deployment: { color: string; 'font-weight': number; }; article: { color: string; 'font-weight': number; }; case: { color: string; 'font-weight': number; }; platform: { color: string; 'font-weight': number; }; }; euiSideNavEmphasizedBackgroundColor: string; euiSideNavRootTextcolor: string; euiSideNavBranchTextcolor: string; euiSideNavSelectedTextcolor: string; euiSideNavDisabledTextcolor: string; spacerSizes: { xs: string; s: string; m: string; l: string; xl: string; xxl: string; }; euiStepNumberSize: string; euiStepNumberSmallSize: string; euiStepNumberMargin: string; euiStepStatusColorsToFade: { warning: string; danger: string; disabled: string; incomplete: string; }; euiSuggestItemColors: { tint0: string; tint1: string; tint2: string; tint3: string; tint4: string; tint5: string; tint6: string; tint7: string; tint8: string; tint9: string; tint10: string; }; euiTableCellContentPadding: string; euiTableCellContentPaddingCompressed: string; euiTableCellCheckboxWidth: string; euiTableActionsAreaWidth: string; euiTableHoverColor: string; euiTableSelectedColor: string; euiTableHoverSelectedColor: string; euiTableActionsBorderColor: string; euiTableHoverClickableColor: string; euiTableFocusClickableColor: string; euiTabFontSize: string; euiTabFontSizeS: string; euiTabFontSizeL: string; euiTextColors: { default: string; subdued: string; secondary: string; success: string; accent: string; warning: string; danger: string; ghost: string; }; euiTextConstrainedMaxWidth: string; euiToastWidth: string; euiToastTypes: { primary: string; success: string; warning: string; danger: string; }; euiTokenGrayColor: string; euiTokenTypes: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; gray: { graphic: string; behindText: string; }; }; euiTokenTypeKeys: string; euiContrastRatioText: number; euiContrastRatioGraphic: number; euiContrastRatioDisabled: number; euiAnimSlightBounce: string; euiAnimSlightResistance: string; euiAnimSpeedExtraFast: string; euiAnimSpeedFast: string; euiAnimSpeedNormal: string; euiAnimSpeedSlow: string; euiAnimSpeedExtraSlow: string; euiBorderWidthThin: string; euiBorderWidthThick: string; euiBorderColor: string; euiBorderRadius: string; euiBorderRadiusSmall: string; euiBorderThick: string; euiBorderThin: string; euiBorderEditable: string; euiButtonHeight: string; euiButtonHeightSmall: string; euiButtonHeightXSmall: string; euiButtonColorDisabled: string; euiButtonColorDisabledText: string; euiButtonColorGhostDisabled: string; euiButtonTypes: { primary: string; accent: string; secondary: string; success: string; warning: string; danger: string; subdued: string; ghost: string; text: string; }; euiColorGhost: string; euiColorInk: string; euiColorPrimary: string; euiColorSecondary: string; euiColorAccent: string; euiColorSuccess: string; euiColorWarning: string; euiColorDanger: string; euiColorEmptyShade: string; euiColorLightestShade: string; euiColorLightShade: string; euiColorMediumShade: string; euiColorDarkShade: string; euiColorDarkestShade: string; euiColorFullShade: string; euiPageBackgroundColor: string; euiColorHighlight: string; euiTextColor: string; euiTitleColor: string; euiTextSubduedColor: string; euiColorDisabled: string; euiColorPrimaryText: string; euiColorSecondaryText: string; euiColorAccentText: string; euiColorWarningText: string; euiColorDangerText: string; euiColorDisabledText: string; euiColorSuccessText: string; euiLinkColor: string; euiPaletteColorBlind: { euiColorVis0: { graphic: string; behindText: string; }; euiColorVis1: { graphic: string; behindText: string; }; euiColorVis2: { graphic: string; behindText: string; }; euiColorVis3: { graphic: string; behindText: string; }; euiColorVis4: { graphic: string; behindText: string; }; euiColorVis5: { graphic: string; behindText: string; }; euiColorVis6: { graphic: string; behindText: string; }; euiColorVis7: { graphic: string; behindText: string; }; euiColorVis8: { graphic: string; behindText: string; }; euiColorVis9: { graphic: string; behindText: string; }; }; euiPaletteColorBlindKeys: string; euiColorVis0: string; euiColorVis1: string; euiColorVis2: string; euiColorVis3: string; euiColorVis4: string; euiColorVis5: string; euiColorVis6: string; euiColorVis7: string; euiColorVis8: string; euiColorVis9: string; euiColorVis0_behindText: string; euiColorVis1_behindText: string; euiColorVis2_behindText: string; euiColorVis3_behindText: string; euiColorVis4_behindText: string; euiColorVis5_behindText: string; euiColorVis6_behindText: string; euiColorVis7_behindText: string; euiColorVis8_behindText: string; euiColorVis9_behindText: string; euiColorChartLines: string; euiColorChartBand: string; euiCodeBlockBackgroundColor: string; euiCodeBlockColor: string; euiCodeBlockSelectedBackgroundColor: string; euiCodeBlockCommentColor: string; euiCodeBlockSelectorTagColor: string; euiCodeBlockStringColor: string; euiCodeBlockTagColor: string; euiCodeBlockNameColor: string; euiCodeBlockNumberColor: string; euiCodeBlockKeywordColor: string; euiCodeBlockFunctionTitleColor: string; euiCodeBlockTypeColor: string; euiCodeBlockAttributeColor: string; euiCodeBlockSymbolColor: string; euiCodeBlockParamsColor: string; euiCodeBlockMetaColor: string; euiCodeBlockTitleColor: string; euiCodeBlockSectionColor: string; euiCodeBlockAdditionColor: string; euiCodeBlockDeletionColor: string; euiCodeBlockSelectorClassColor: string; euiCodeBlockSelectorIdColor: string; euiFormMaxWidth: string; euiFormControlHeight: string; euiFormControlCompressedHeight: string; euiFormControlPadding: string; euiFormControlCompressedPadding: string; euiFormControlBorderRadius: number; euiFormControlCompressedBorderRadius: string; euiRadioSize: string; euiCheckBoxSize: string; euiCheckboxBorderRadius: string; euiSwitchHeight: string; euiSwitchWidth: string; euiSwitchThumbSize: string; euiSwitchIconHeight: string; euiSwitchHeightCompressed: string; euiSwitchWidthCompressed: string; euiSwitchThumbSizeCompressed: string; euiSwitchHeightMini: string; euiSwitchWidthMini: string; euiSwitchThumbSizeMini: string; euiFormBackgroundColor: string; euiFormBackgroundDisabledColor: string; euiFormBackgroundReadOnlyColor: string; euiFormBorderOpaqueColor: string; euiFormBorderColor: string; euiFormBorderDisabledColor: string; euiFormCustomControlDisabledIconColor: string; euiFormCustomControlBorderColor: string; euiFormControlDisabledColor: string; euiFormControlBoxShadow: string; euiFormControlPlaceholderText: string; euiFormInputGroupLabelBackground: string; euiFormInputGroupBorder: string; euiSwitchOffColor: string; euiFormControlLayoutGroupInputHeight: string; euiFormControlLayoutGroupInputCompressedHeight: string; euiFormControlLayoutGroupInputCompressedBorderRadius: string; euiRangeTrackColor: string; euiRangeThumbRadius: string; euiRangeThumbHeight: string; euiRangeThumbWidth: string; euiRangeThumbBorderColor: string; euiRangeTrackWidth: string; euiRangeTrackHeight: string; euiRangeTrackBorderWidth: number; euiRangeTrackBorderColor: string; euiRangeTrackRadius: string; euiRangeDisabledOpacity: number; euiRangeHighlightHeight: string; euiHeaderBackgroundColor: string; euiHeaderDarkBackgroundColor: string; euiHeaderBorderColor: string; euiHeaderBreadcrumbColor: string; euiHeaderHeight: string; euiHeaderChildSize: string; euiHeaderHeightCompensation: string; euiPageDefaultMaxWidth: string; euiPageSidebarMinWidth: string; euiPanelPaddingModifiers: { paddingSmall: string; paddingMedium: string; paddingLarge: string; }; euiPanelBorderRadiusModifiers: { borderRadiusNone: number; borderRadiusMedium: string; }; euiPanelBackgroundColorModifiers: { transparent: string; plain: string; subdued: string; accent: string; primary: string; success: string; warning: string; danger: string; }; euiBreakpoints: { xs: number; s: string; m: string; l: string; xl: string; }; euiBreakpointKeys: string; euiShadowColor: string; euiShadowColorLarge: string; euiSize: string; euiSizeXS: string; euiSizeS: string; euiSizeM: string; euiSizeL: string; euiSizeXL: string; euiSizeXXL: string; euiButtonMinWidth: string; euiScrollBar: string; euiScrollBarCorner: string; euiFocusRingColor: string; euiFocusRingAnimStartColor: string; euiFocusRingAnimStartSize: string; euiFocusRingAnimStartSizeLarge: string; euiFocusRingSizeLarge: string; euiFocusRingSize: string; euiFocusTransparency: number; euiFocusBackgroundColor: string; euiTooltipBackgroundColor: string; euiTooltipAnimations: { top: string; left: string; bottom: string; right: string; }; euiFontFamily: string; euiCodeFontFamily: string; euiFontFeatureSettings: string; euiTextScale: string; euiFontSize: string; euiFontSizeXS: string; euiFontSizeS: string; euiFontSizeM: string; euiFontSizeL: string; euiFontSizeXL: string; euiFontSizeXXL: string; euiLineHeight: number; euiBodyLineHeight: number; euiFontWeightLight: number; euiFontWeightRegular: number; euiFontWeightMedium: number; euiFontWeightSemiBold: number; euiFontWeightBold: number; euiCodeFontWeightRegular: number; euiCodeFontWeightBold: number; euiTitles: { xxxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xxs: { 'font-size': string; 'line-height': string; 'font-weight': number; }; xs: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; s: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; m: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; l: { 'font-size': string; 'line-height': string; 'font-weight': number; 'letter-spacing': string; }; }; euiZLevel0: number; euiZLevel1: number; euiZLevel2: number; euiZLevel3: number; euiZLevel4: number; euiZLevel5: number; euiZLevel6: number; euiZLevel7: number; euiZLevel8: number; euiZLevel9: number; euiZToastList: number; euiZModal: number; euiZMask: number; euiZNavigation: number; euiZContentMenu: number; euiZHeader: number; euiZFlyout: number; euiZMaskBelowHeader: number; euiZContent: number; }" ], "source": { "path": "src/plugins/kibana_react/common/eui_styled_components.tsx", diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index da356108593a14..6b3efe2c90ea00 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import kibanaReactObj from './kibana_react.json'; @@ -19,7 +18,7 @@ import kibanaReactObj from './kibana_react.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 245 | 1 | 216 | 4 | +| 257 | 5 | 228 | 4 | ## Client diff --git a/api_docs/kibana_utils.json b/api_docs/kibana_utils.json index 99296f3235f0f7..93a73f18afac69 100644 --- a/api_docs/kibana_utils.json +++ b/api_docs/kibana_utils.json @@ -6121,71 +6121,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "kibanaUtils", - "id": "def-public.JsonArray", - "type": "Interface", - "tags": [], - "label": "JsonArray", - "description": [], - "signature": [ - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonArray", - "text": "JsonArray" - }, - " extends ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "[]" - ], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 16 - }, - "deprecated": false, - "children": [], - "initialIsOpen": false - }, - { - "parentPluginId": "kibanaUtils", - "id": "def-public.JsonObject", - "type": "Interface", - "tags": [], - "label": "JsonObject", - "description": [], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 11 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "kibanaUtils", - "id": "def-public.JsonObject.Unnamed", - "type": "Any", - "tags": [], - "label": "Unnamed", - "description": [], - "signature": [ - "any" - ], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 12 - }, - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "kibanaUtils", "id": "def-public.KibanaServerError", @@ -6960,39 +6895,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "kibanaUtils", - "id": "def-public.JsonValue", - "type": "Type", - "tags": [], - "label": "JsonValue", - "description": [], - "signature": [ - "string | number | boolean | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - }, - " | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonArray", - "text": "JsonArray" - }, - " | null" - ], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 9 - }, - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "kibanaUtils", "id": "def-public.MapStateToProps", @@ -10362,71 +10264,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "kibanaUtils", - "id": "def-common.JsonArray", - "type": "Interface", - "tags": [], - "label": "JsonArray", - "description": [], - "signature": [ - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonArray", - "text": "JsonArray" - }, - " extends ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "[]" - ], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 16 - }, - "deprecated": false, - "children": [], - "initialIsOpen": false - }, - { - "parentPluginId": "kibanaUtils", - "id": "def-common.JsonObject", - "type": "Interface", - "tags": [], - "label": "JsonObject", - "description": [], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 11 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "kibanaUtils", - "id": "def-common.JsonObject.Unnamed", - "type": "Any", - "tags": [], - "label": "Unnamed", - "description": [], - "signature": [ - "any" - ], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 12 - }, - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "kibanaUtils", "id": "def-common.KibanaServerError", @@ -11616,39 +11453,6 @@ "deprecated": false, "initialIsOpen": false }, - { - "parentPluginId": "kibanaUtils", - "id": "def-common.JsonValue", - "type": "Type", - "tags": [], - "label": "JsonValue", - "description": [], - "signature": [ - "string | number | boolean | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonObject", - "text": "JsonObject" - }, - " | ", - { - "pluginId": "kibanaUtils", - "scope": "common", - "docId": "kibKibanaUtilsPluginApi", - "section": "def-common.JsonArray", - "text": "JsonArray" - }, - " | null" - ], - "source": { - "path": "src/plugins/kibana_utils/common/typed_json.ts", - "lineNumber": 9 - }, - "deprecated": false, - "initialIsOpen": false - }, { "parentPluginId": "kibanaUtils", "id": "def-common.MapStateToProps", diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index a76992e0bc2b89..0cc3a3848bb572 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import kibanaUtilsObj from './kibana_utils.json'; @@ -19,7 +18,7 @@ import kibanaUtilsObj from './kibana_utils.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 551 | 5 | 373 | 8 | +| 543 | 3 | 365 | 8 | ## Client diff --git a/api_docs/lens.json b/api_docs/lens.json index 782d060f398cb3..2edb1e446a5d86 100644 --- a/api_docs/lens.json +++ b/api_docs/lens.json @@ -119,7 +119,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/datatable_visualization/visualization.tsx", - "lineNumber": 48 + "lineNumber": 51 }, "deprecated": false, "children": [ @@ -136,7 +136,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/datatable_visualization/visualization.tsx", - "lineNumber": 49 + "lineNumber": 52 }, "deprecated": false }, @@ -149,7 +149,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/datatable_visualization/visualization.tsx", - "lineNumber": 50 + "lineNumber": 53 }, "deprecated": false }, @@ -166,7 +166,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/datatable_visualization/visualization.tsx", - "lineNumber": 51 + "lineNumber": 54 }, "deprecated": false } @@ -227,7 +227,7 @@ "label": "params", "description": [], "signature": [ - "{ interval: string; timeZone?: string | undefined; }" + "{ interval: string; }" ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx", @@ -299,6 +299,65 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-public.FormulaIndexPatternColumn", + "type": "Interface", + "tags": [], + "label": "FormulaIndexPatternColumn", + "description": [], + "signature": [ + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.FormulaIndexPatternColumn", + "text": "FormulaIndexPatternColumn" + }, + " extends ", + "ReferenceBasedIndexPatternColumn" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.tsx", + "lineNumber": 23 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.FormulaIndexPatternColumn.operationType", + "type": "string", + "tags": [], + "label": "operationType", + "description": [], + "signature": [ + "\"formula\"" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.tsx", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-public.FormulaIndexPatternColumn.params", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "{ formula?: string | undefined; isFormulaBroken?: boolean | undefined; format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.tsx", + "lineNumber": 25 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-public.IncompleteColumn", @@ -320,7 +379,7 @@ "label": "operationType", "description": [], "signature": [ - "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"average\" | \"percentile\" | \"terms\" | \"median\" | \"cumulative_sum\" | \"moving_average\" | \"math\" | \"counter_rate\" | \"differences\" | \"unique_count\" | \"last_value\" | \"formula\" | undefined" + "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"average\" | \"percentile\" | \"terms\" | \"median\" | \"cumulative_sum\" | \"moving_average\" | \"math\" | \"overall_sum\" | \"overall_min\" | \"overall_max\" | \"overall_average\" | \"counter_rate\" | \"differences\" | \"unique_count\" | \"last_value\" | \"formula\" | undefined" ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts", @@ -356,7 +415,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/types.ts", - "lineNumber": 73 + "lineNumber": 76 }, "deprecated": false, "children": [ @@ -374,7 +433,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/types.ts", - "lineNumber": 74 + "lineNumber": 77 }, "deprecated": false } @@ -522,7 +581,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 84 + "lineNumber": 89 }, "deprecated": false, "children": [ @@ -558,7 +617,31 @@ ], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 93 + "lineNumber": 98 + }, + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-public.LensPublicStart.SaveModalComponent", + "type": "CompoundType", + "tags": [ + "experimental" + ], + "label": "SaveModalComponent", + "description": [ + "\nReact component which can be used to embed a Lens Visualization Save Modal Component.\nSee `x-pack/examples/embedded_lens_example` for exemplary usage.\n\nThis API might undergo breaking changes even in minor versions.\n" + ], + "signature": [ + "React.ComponentClass<Pick<", + "SaveModalContainerProps", + ", \"onClose\" | \"onSave\" | \"initialInput\" | \"redirectToOrigin\" | \"redirectTo\" | \"onAppLeave\" | \"isVisible\" | \"originatingApp\" | \"persistedDoc\" | \"lastKnownDoc\" | \"returnToOriginSwitchLabel\" | \"runSave\" | \"isSaveable\" | \"getAppNameFromId\">, any> | React.FunctionComponent<Pick<", + "SaveModalContainerProps", + ", \"onClose\" | \"onSave\" | \"initialInput\" | \"redirectToOrigin\" | \"redirectTo\" | \"onAppLeave\" | \"isVisible\" | \"originatingApp\" | \"persistedDoc\" | \"lastKnownDoc\" | \"returnToOriginSwitchLabel\" | \"runSave\" | \"isSaveable\" | \"getAppNameFromId\">>" + ], + "source": { + "path": "x-pack/plugins/lens/public/plugin.ts", + "lineNumber": 107 }, "deprecated": false }, @@ -575,12 +658,18 @@ ], "signature": [ "(input: ", - "LensEmbeddableInput", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.LensEmbeddableInput", + "text": "LensEmbeddableInput" + }, ", openInNewTab?: boolean | undefined) => void" ], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 102 + "lineNumber": 116 }, "deprecated": false, "returnComment": [], @@ -599,7 +688,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 102 + "lineNumber": 116 }, "deprecated": false }, @@ -615,7 +704,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 102 + "lineNumber": 116 }, "deprecated": false } @@ -635,7 +724,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 106 + "lineNumber": 120 }, "deprecated": false, "returnComment": [], @@ -657,7 +746,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/plugin.ts", - "lineNumber": 111 + "lineNumber": 125 }, "deprecated": false, "returnComment": [], @@ -666,6 +755,71 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "lens", + "id": "def-public.MathIndexPatternColumn", + "type": "Interface", + "tags": [], + "label": "MathIndexPatternColumn", + "description": [], + "signature": [ + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.MathIndexPatternColumn", + "text": "MathIndexPatternColumn" + }, + " extends ", + "ReferenceBasedIndexPatternColumn" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/math.tsx", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.MathIndexPatternColumn.operationType", + "type": "string", + "tags": [], + "label": "operationType", + "description": [], + "signature": [ + "\"math\"" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/math.tsx", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MathIndexPatternColumn.params", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "{ tinymathAst: string | number | ", + "TinymathVariable", + " | ", + "TinymathFunction", + " | ", + "TinymathNamedArgument", + "; format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/math.tsx", + "lineNumber": 15 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "lens", "id": "def-public.MetricState", @@ -720,7 +874,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/types.ts", - "lineNumber": 362 + "lineNumber": 372 }, "deprecated": false, "children": [ @@ -736,7 +890,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/types.ts", - "lineNumber": 364 + "lineNumber": 374 }, "deprecated": false }, @@ -749,7 +903,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/types.ts", - "lineNumber": 367 + "lineNumber": 377 }, "deprecated": false }, @@ -767,7 +921,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/types.ts", - "lineNumber": 373 + "lineNumber": 383 }, "deprecated": false } @@ -1759,7 +1913,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 139 + "lineNumber": 162 }, "deprecated": false, "initialIsOpen": false @@ -1842,7 +1996,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/types.ts", - "lineNumber": 351 + "lineNumber": 361 }, "deprecated": false, "initialIsOpen": false @@ -1875,19 +2029,53 @@ "label": "EmbeddableComponentProps", "description": [], "signature": [ + "(Pick<", + "LensByValueInput", + ", \"palette\" | \"timeRange\" | \"syncColors\" | \"viewMode\" | \"filters\" | \"title\" | \"query\" | \"hidePanelTitles\" | \"id\" | \"lastReloadRequestTime\" | \"enhancements\" | \"disabledActions\" | \"disableTriggers\" | \"searchSessionId\" | \"className\" | \"style\" | \"onLoad\" | \"renderMode\" | \"onBrushEnd\" | \"onFilter\" | \"onTableRowClick\"> & { attributes: LensAttributes<\"lnsXY\", ", { "pluginId": "lens", "scope": "public", "docId": "kibLensPluginApi", - "section": "def-public.TypedLensByValueInput", - "text": "TypedLensByValueInput" + "section": "def-public.XYState", + "text": "XYState" }, - " | ", - "LensByReferenceInput" + "> | LensAttributes<\"lnsPie\", ", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.PieVisualizationState", + "text": "PieVisualizationState" + }, + "> | LensAttributes<\"lnsDatatable\", ", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.DatatableVisualizationState", + "text": "DatatableVisualizationState" + }, + "> | LensAttributes<\"lnsMetric\", ", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.MetricState", + "text": "MetricState" + }, + ">; } & { withActions?: boolean | undefined; }) | (", + { + "pluginId": "embeddable", + "scope": "common", + "docId": "kibEmbeddablePluginApi", + "section": "def-common.SavedObjectEmbeddableInput", + "text": "SavedObjectEmbeddableInput" + }, + " & LensBaseEmbeddableInput & { withActions?: boolean | undefined; })" ], "source": { "path": "x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable_component.tsx", - "lineNumber": 46 + "lineNumber": 54 }, "deprecated": false, "initialIsOpen": false @@ -1958,7 +2146,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts", - "lineNumber": 80 + "lineNumber": 92 }, "deprecated": false, "initialIsOpen": false @@ -2044,7 +2232,7 @@ "section": "def-public.CumulativeSumIndexPatternColumn", "text": "CumulativeSumIndexPatternColumn" }, - " | ", + " | OverallMetricIndexPatternColumn<\"overall_sum\"> | OverallMetricIndexPatternColumn<\"overall_min\"> | OverallMetricIndexPatternColumn<\"overall_max\"> | OverallMetricIndexPatternColumn<\"overall_average\"> | ", { "pluginId": "lens", "scope": "public", @@ -2069,13 +2257,44 @@ "text": "MovingAverageIndexPatternColumn" }, " | ", - "MathIndexPatternColumn", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.MathIndexPatternColumn", + "text": "MathIndexPatternColumn" + }, " | ", - "FormulaIndexPatternColumn" + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.FormulaIndexPatternColumn", + "text": "FormulaIndexPatternColumn" + } ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts", - "lineNumber": 59 + "lineNumber": 67 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-public.LensEmbeddableInput", + "type": "Type", + "tags": [], + "label": "LensEmbeddableInput", + "description": [], + "signature": [ + "LensByValueInput", + " | ", + "LensByReferenceInput" + ], + "source": { + "path": "x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx", + "lineNumber": 82 }, "deprecated": false, "initialIsOpen": false @@ -2101,7 +2320,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 141 + "lineNumber": 164 }, "deprecated": false, "initialIsOpen": false @@ -2127,7 +2346,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 142 + "lineNumber": 165 }, "deprecated": false, "initialIsOpen": false @@ -2153,7 +2372,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 140 + "lineNumber": 163 }, "deprecated": false, "initialIsOpen": false @@ -2188,11 +2407,31 @@ "\nA union type of all available operation types. The operation type is a unique id of an operation.\nEach column is assigned to exactly one operation type." ], "signature": [ - "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"average\" | \"percentile\" | \"terms\" | \"median\" | \"cumulative_sum\" | \"moving_average\" | \"math\" | \"counter_rate\" | \"differences\" | \"unique_count\" | \"last_value\" | \"formula\"" + "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"average\" | \"percentile\" | \"terms\" | \"median\" | \"cumulative_sum\" | \"moving_average\" | \"math\" | \"overall_sum\" | \"overall_min\" | \"overall_max\" | \"overall_average\" | \"counter_rate\" | \"differences\" | \"unique_count\" | \"last_value\" | \"formula\"" ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts", - "lineNumber": 533 + "lineNumber": 573 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "lens", + "id": "def-public.OverallSumIndexPatternColumn", + "type": "Type", + "tags": [], + "label": "OverallSumIndexPatternColumn", + "description": [], + "signature": [ + "BaseIndexPatternColumn", + " & { params?: { format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; } | undefined; } & ", + "ReferenceBasedIndexPatternColumn", + " & { operationType: \"overall_sum\"; }" + ], + "source": { + "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/overall_metric.tsx", + "lineNumber": 19 }, "deprecated": false, "initialIsOpen": false @@ -2225,7 +2464,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/types.ts", - "lineNumber": 77 + "lineNumber": 80 }, "deprecated": false, "initialIsOpen": false @@ -2292,7 +2531,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 138 + "lineNumber": 161 }, "deprecated": false, "initialIsOpen": false @@ -2345,7 +2584,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable_component.tsx", - "lineNumber": 38 + "lineNumber": 46 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 8c47be1b5897ca..9408921e6e59d9 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import lensObj from './lens.json'; +Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. - - +Contact [Kibana App](https://github.com/orgs/elastic/teams/kibana-app) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 172 | 0 | 161 | 16 | +| 181 | 0 | 169 | 14 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index a2859cc03f8775..e8cbe775d1e5f3 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import licenseApiGuardObj from './license_api_guard.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index b198e83acebf35..8594a9d214caaa 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import licenseManagementObj from './license_management.json'; diff --git a/api_docs/licensing.json b/api_docs/licensing.json index 862a00e65215f4..9f1403e7ed0ac0 100644 --- a/api_docs/licensing.json +++ b/api_docs/licensing.json @@ -942,73 +942,73 @@ "deprecated": true, "references": [ { - "plugin": "reporting", + "plugin": "licenseManagement", "link": { - "path": "x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx", - "lineNumber": 40 + "path": "x-pack/plugins/license_management/public/plugin.ts", + "lineNumber": 61 } }, { - "plugin": "reporting", + "plugin": "security", "link": { - "path": "x-pack/plugins/reporting/public/share_context_menu/register_csv_reporting.tsx", - "lineNumber": 33 + "path": "x-pack/plugins/security/public/plugin.tsx", + "lineNumber": 86 } }, { - "plugin": "reporting", + "plugin": "ml", "link": { - "path": "x-pack/plugins/reporting/public/share_context_menu/register_pdf_png_reporting.tsx", - "lineNumber": 81 + "path": "x-pack/plugins/ml/public/application/license/check_license.tsx", + "lineNumber": 26 } }, { - "plugin": "reporting", + "plugin": "ml", "link": { - "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 116 + "path": "x-pack/plugins/ml/public/plugin.ts", + "lineNumber": 138 } }, { - "plugin": "reporting", + "plugin": "apm", "link": { - "path": "x-pack/plugins/reporting/public/components/report_listing.tsx", - "lineNumber": 61 + "path": "x-pack/plugins/apm/public/context/license/license_context.tsx", + "lineNumber": 19 } }, { - "plugin": "licenseManagement", + "plugin": "reporting", "link": { - "path": "x-pack/plugins/license_management/public/plugin.ts", - "lineNumber": 61 + "path": "x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx", + "lineNumber": 40 } }, { - "plugin": "security", + "plugin": "reporting", "link": { - "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 84 + "path": "x-pack/plugins/reporting/public/share_context_menu/register_csv_reporting.tsx", + "lineNumber": 33 } }, { - "plugin": "ml", + "plugin": "reporting", "link": { - "path": "x-pack/plugins/ml/public/application/license/check_license.tsx", - "lineNumber": 26 + "path": "x-pack/plugins/reporting/public/share_context_menu/register_pdf_png_reporting.tsx", + "lineNumber": 81 } }, { - "plugin": "ml", + "plugin": "reporting", "link": { - "path": "x-pack/plugins/ml/public/plugin.ts", - "lineNumber": 141 + "path": "x-pack/plugins/reporting/public/management/report_listing.tsx", + "lineNumber": 55 } }, { - "plugin": "apm", + "plugin": "reporting", "link": { - "path": "x-pack/plugins/apm/public/context/license/license_context.tsx", - "lineNumber": 19 + "path": "x-pack/plugins/reporting/public/plugin.ts", + "lineNumber": 122 } }, { @@ -1022,7 +1022,7 @@ "plugin": "fleet", "link": { "path": "x-pack/plugins/fleet/public/plugin.ts", - "lineNumber": 94 + "lineNumber": 100 } }, { @@ -3053,7 +3053,7 @@ "plugin": "spaces", "link": { "path": "x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts", - "lineNumber": 431 + "lineNumber": 437 } }, { @@ -3074,7 +3074,7 @@ "plugin": "security", "link": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 229 + "lineNumber": 228 } }, { @@ -3102,7 +3102,7 @@ "plugin": "alerting", "link": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 168 + "lineNumber": 170 } }, { @@ -3120,17 +3120,17 @@ } }, { - "plugin": "remoteClusters", + "plugin": "fleet", "link": { - "path": "x-pack/plugins/remote_clusters/server/plugin.ts", - "lineNumber": 73 + "path": "x-pack/plugins/fleet/server/plugin.ts", + "lineNumber": 214 } }, { - "plugin": "fleet", + "plugin": "remoteClusters", "link": { - "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 214 + "path": "x-pack/plugins/remote_clusters/server/plugin.ts", + "lineNumber": 73 } }, { @@ -3200,7 +3200,7 @@ "plugin": "spaces", "link": { "path": "x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts", - "lineNumber": 62 + "lineNumber": 63 } }, { diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index af26b10762d273..be974eb82bf619 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import licensingObj from './licensing.json'; diff --git a/api_docs/lists.json b/api_docs/lists.json index 061227499d67f2..36fb301ac0d6ab 100644 --- a/api_docs/lists.json +++ b/api_docs/lists.json @@ -341,7 +341,7 @@ "description": [], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 59 + "lineNumber": 58 }, "deprecated": false, "children": [ @@ -357,7 +357,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 64 + "lineNumber": 63 }, "deprecated": false, "children": [ @@ -373,7 +373,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 64 + "lineNumber": 63 }, "deprecated": false, "isRequired": true @@ -395,7 +395,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -411,7 +411,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 69 + "lineNumber": 68 }, "deprecated": false, "isRequired": true @@ -433,7 +433,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 78 + "lineNumber": 77 }, "deprecated": false, "children": [ @@ -449,7 +449,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 78 + "lineNumber": 77 }, "deprecated": false, "isRequired": true @@ -471,7 +471,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 87 + "lineNumber": 86 }, "deprecated": false, "children": [ @@ -487,7 +487,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 87 + "lineNumber": 86 }, "deprecated": false, "isRequired": true @@ -509,7 +509,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 102 + "lineNumber": 101 }, "deprecated": false, "children": [], @@ -531,27 +531,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 114 - }, - "deprecated": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "lists", - "id": "def-server.ExceptionListClient.createEndpointEventFiltersList", - "type": "Function", - "tags": [], - "label": "createEndpointEventFiltersList", - "description": [ - "\nCreate the Endpoint Event Filters Agnostic list if it does not yet exist (`null` is returned if it does exist)" - ], - "signature": [ - "() => Promise<{ _version: string | undefined; created_at: string; created_by: string; description: string; id: string; immutable: boolean; list_id: string; meta: object | undefined; name: string; namespace_type: \"single\" | \"agnostic\"; os_types: (\"windows\" | \"linux\" | \"macos\")[]; tags: string[]; tie_breaker_id: string; type: \"endpoint\" | \"detection\" | \"endpoint_events\"; updated_at: string; updated_by: string; version: number; } | null>" - ], - "source": { - "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 126 + "lineNumber": 113 }, "deprecated": false, "children": [], @@ -573,7 +553,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 140 + "lineNumber": 127 }, "deprecated": false, "children": [ @@ -589,7 +569,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 140 + "lineNumber": 127 }, "deprecated": false, "isRequired": true @@ -613,7 +593,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 176 + "lineNumber": 163 }, "deprecated": false, "children": [ @@ -629,7 +609,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 176 + "lineNumber": 163 }, "deprecated": false, "isRequired": true @@ -653,7 +633,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 212 + "lineNumber": 199 }, "deprecated": false, "children": [ @@ -669,7 +649,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 212 + "lineNumber": 199 }, "deprecated": false, "isRequired": true @@ -691,7 +671,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 220 + "lineNumber": 207 }, "deprecated": false, "children": [ @@ -707,7 +687,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 220 + "lineNumber": 207 }, "deprecated": false, "isRequired": true @@ -729,7 +709,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 247 + "lineNumber": 234 }, "deprecated": false, "children": [ @@ -745,7 +725,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 247 + "lineNumber": 234 }, "deprecated": false, "isRequired": true @@ -767,7 +747,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 278 + "lineNumber": 265 }, "deprecated": false, "children": [ @@ -783,7 +763,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 278 + "lineNumber": 265 }, "deprecated": false, "isRequired": true @@ -811,7 +791,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 292 + "lineNumber": 279 }, "deprecated": false, "children": [ @@ -833,7 +813,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 292 + "lineNumber": 279 }, "deprecated": false, "isRequired": true @@ -861,7 +841,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 323 + "lineNumber": 310 }, "deprecated": false, "children": [ @@ -883,7 +863,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 323 + "lineNumber": 310 }, "deprecated": false, "isRequired": true @@ -905,7 +885,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 356 + "lineNumber": 343 }, "deprecated": false, "children": [ @@ -921,7 +901,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 356 + "lineNumber": 343 }, "deprecated": false, "isRequired": true @@ -943,7 +923,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 370 + "lineNumber": 357 }, "deprecated": false, "children": [ @@ -959,7 +939,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 370 + "lineNumber": 357 }, "deprecated": false, "isRequired": true @@ -983,7 +963,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 385 + "lineNumber": 372 }, "deprecated": false, "children": [ @@ -999,7 +979,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 385 + "lineNumber": 372 }, "deprecated": false, "isRequired": true @@ -1021,7 +1001,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 398 + "lineNumber": 385 }, "deprecated": false, "children": [ @@ -1037,7 +1017,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 398 + "lineNumber": 385 }, "deprecated": false, "isRequired": true @@ -1059,7 +1039,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 420 + "lineNumber": 407 }, "deprecated": false, "children": [ @@ -1075,7 +1055,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 420 + "lineNumber": 407 }, "deprecated": false, "isRequired": true @@ -1097,7 +1077,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 442 + "lineNumber": 429 }, "deprecated": false, "children": [ @@ -1113,7 +1093,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 442 + "lineNumber": 429 }, "deprecated": false, "isRequired": true @@ -1135,7 +1115,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 460 + "lineNumber": 447 }, "deprecated": false, "children": [ @@ -1151,7 +1131,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 460 + "lineNumber": 447 }, "deprecated": false, "isRequired": true @@ -1175,7 +1155,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 488 + "lineNumber": 475 }, "deprecated": false, "children": [ @@ -1191,7 +1171,7 @@ ], "source": { "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.ts", - "lineNumber": 488 + "lineNumber": 475 }, "deprecated": false, "isRequired": true diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 47b1bde5c07822..16cab072460bfd 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import listsObj from './lists.json'; @@ -19,7 +18,7 @@ import listsObj from './lists.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 151 | 0 | 143 | 38 | +| 150 | 0 | 143 | 38 | ## Client diff --git a/api_docs/management.json b/api_docs/management.json index 41801e2f2bafc7..de8bb8ad13060b 100644 --- a/api_docs/management.json +++ b/api_docs/management.json @@ -73,7 +73,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 56 + "lineNumber": 59 }, "deprecated": false } @@ -382,7 +382,7 @@ "description": [], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 17 + "lineNumber": 20 }, "deprecated": false, "children": [ @@ -404,7 +404,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 18 + "lineNumber": 21 }, "deprecated": false }, @@ -426,7 +426,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 19 + "lineNumber": 22 }, "deprecated": false }, @@ -448,7 +448,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 20 + "lineNumber": 23 }, "deprecated": false }, @@ -470,7 +470,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 21 + "lineNumber": 24 }, "deprecated": false }, @@ -492,7 +492,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 22 + "lineNumber": 25 }, "deprecated": false }, @@ -514,7 +514,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 23 + "lineNumber": 26 }, "deprecated": false } @@ -530,7 +530,7 @@ "description": [], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 58 + "lineNumber": 61 }, "deprecated": false, "children": [ @@ -543,7 +543,7 @@ "description": [], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 59 + "lineNumber": 62 }, "deprecated": false }, @@ -559,7 +559,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 60 + "lineNumber": 63 }, "deprecated": false }, @@ -577,7 +577,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 61 + "lineNumber": 64 }, "deprecated": false, "returnComment": [], @@ -595,7 +595,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 61 + "lineNumber": 64 }, "deprecated": false } @@ -620,7 +620,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 62 + "lineNumber": 65 }, "deprecated": false } @@ -698,7 +698,7 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 56 + "lineNumber": 59 }, "deprecated": false } @@ -767,7 +767,7 @@ "description": [], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 13 + "lineNumber": 15 }, "deprecated": false, "children": [ @@ -783,7 +783,32 @@ ], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 14 + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "management", + "id": "def-public.ManagementSetup.locator", + "type": "Object", + "tags": [], + "label": "locator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + "ManagementAppLocatorParams", + ">" + ], + "source": { + "path": "src/plugins/management/public/types.ts", + "lineNumber": 17 }, "deprecated": false } @@ -800,7 +825,7 @@ "description": [], "source": { "path": "src/plugins/management/public/types.ts", - "lineNumber": 27 + "lineNumber": 30 }, "deprecated": false, "children": [], @@ -821,7 +846,34 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "management", + "id": "def-common.ManagementAppLocator", + "type": "Type", + "tags": [], + "label": "ManagementAppLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + "ManagementAppLocatorParams", + ">" + ], + "source": { + "path": "src/plugins/management/common/locator.ts", + "lineNumber": 20 + }, + "deprecated": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 22586c7b58b494..fff52d8d9bf07d 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import managementObj from './management.json'; @@ -19,7 +18,7 @@ import managementObj from './management.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 38 | 0 | 38 | 4 | +| 40 | 0 | 40 | 5 | ## Client @@ -38,3 +37,8 @@ import managementObj from './management.json'; ### Consts, variables and types <DocDefinitionList data={managementObj.client.misc}/> +## Common + +### Consts, variables and types +<DocDefinitionList data={managementObj.common.misc}/> + diff --git a/api_docs/maps.json b/api_docs/maps.json index 9c1c7243a41bc5..de1a1f9f6f55e2 100644 --- a/api_docs/maps.json +++ b/api_docs/maps.json @@ -57,7 +57,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 93 + "lineNumber": 94 }, "deprecated": false, "children": [ @@ -70,7 +70,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 96 + "lineNumber": 97 }, "deprecated": false }, @@ -86,7 +86,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 115 + "lineNumber": 116 }, "deprecated": false, "children": [ @@ -102,7 +102,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 115 + "lineNumber": 116 }, "deprecated": false, "isRequired": true @@ -125,7 +125,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 115 + "lineNumber": 116 }, "deprecated": false, "isRequired": true @@ -165,7 +165,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 115 + "lineNumber": 116 }, "deprecated": false, "isRequired": false @@ -194,7 +194,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 194 + "lineNumber": 195 }, "deprecated": false, "children": [ @@ -216,7 +216,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 195 + "lineNumber": 196 }, "deprecated": false, "isRequired": true @@ -238,7 +238,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 200 + "lineNumber": 201 }, "deprecated": false, "children": [], @@ -258,7 +258,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 208 + "lineNumber": 209 }, "deprecated": false, "children": [], @@ -276,7 +276,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 213 + "lineNumber": 214 }, "deprecated": false, "children": [], @@ -294,7 +294,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 217 + "lineNumber": 218 }, "deprecated": false, "children": [], @@ -314,7 +314,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 221 + "lineNumber": 222 }, "deprecated": false, "children": [ @@ -330,7 +330,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 221 + "lineNumber": 222 }, "deprecated": false, "isRequired": true @@ -352,7 +352,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 225 + "lineNumber": 226 }, "deprecated": false, "children": [ @@ -368,7 +368,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 225 + "lineNumber": 226 }, "deprecated": false, "isRequired": true @@ -395,7 +395,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 229 + "lineNumber": 230 }, "deprecated": false, "children": [], @@ -413,7 +413,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 233 + "lineNumber": 234 }, "deprecated": false, "children": [], @@ -439,7 +439,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 273 + "lineNumber": 274 }, "deprecated": false, "children": [], @@ -457,7 +457,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 281 + "lineNumber": 282 }, "deprecated": false, "children": [], @@ -475,7 +475,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 291 + "lineNumber": 292 }, "deprecated": false, "children": [ @@ -488,7 +488,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 291 + "lineNumber": 292 }, "deprecated": false, "children": [ @@ -501,7 +501,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 291 + "lineNumber": 292 }, "deprecated": false } @@ -522,7 +522,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 311 + "lineNumber": 312 }, "deprecated": false, "children": [ @@ -538,7 +538,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 311 + "lineNumber": 312 }, "deprecated": false, "isRequired": false @@ -560,7 +560,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 329 + "lineNumber": 330 }, "deprecated": false, "children": [ @@ -576,7 +576,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 329 + "lineNumber": 330 }, "deprecated": false, "isRequired": true @@ -598,7 +598,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 355 + "lineNumber": 357 }, "deprecated": false, "children": [ @@ -615,7 +615,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 355 + "lineNumber": 357 }, "deprecated": false, "isRequired": true @@ -643,7 +643,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 372 + "lineNumber": 374 }, "deprecated": false, "children": [ @@ -659,7 +659,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 372 + "lineNumber": 374 }, "deprecated": false, "isRequired": true @@ -676,7 +676,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 372 + "lineNumber": 374 }, "deprecated": false, "isRequired": true @@ -699,7 +699,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 372 + "lineNumber": 374 }, "deprecated": false, "isRequired": false @@ -727,7 +727,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 386 + "lineNumber": 388 }, "deprecated": false, "children": [ @@ -750,7 +750,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 386 + "lineNumber": 388 }, "deprecated": false, "isRequired": true @@ -767,7 +767,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 386 + "lineNumber": 388 }, "deprecated": false, "isRequired": true @@ -795,7 +795,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 398 + "lineNumber": 400 }, "deprecated": false, "children": [], @@ -821,7 +821,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 419 + "lineNumber": 421 }, "deprecated": false, "children": [], @@ -839,7 +839,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 430 + "lineNumber": 432 }, "deprecated": false, "children": [], @@ -857,7 +857,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 466 + "lineNumber": 468 }, "deprecated": false, "children": [], @@ -875,7 +875,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 480 + "lineNumber": 482 }, "deprecated": false, "children": [], @@ -893,7 +893,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 496 + "lineNumber": 498 }, "deprecated": false, "children": [], @@ -911,7 +911,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/embeddable/map_embeddable.tsx", - "lineNumber": 502 + "lineNumber": 504 }, "deprecated": false, "children": [], @@ -932,7 +932,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 18 + "lineNumber": 16 }, "deprecated": false, "children": [ @@ -945,7 +945,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 19 + "lineNumber": 17 }, "deprecated": false }, @@ -958,7 +958,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 20 + "lineNumber": 18 }, "deprecated": false } @@ -1238,26 +1238,10 @@ "description": [], "source": { "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 12 + "lineNumber": 11 }, "deprecated": false, "children": [ - { - "parentPluginId": "maps", - "id": "def-public.SampleValuesConfig.emsLayerIds", - "type": "Array", - "tags": [], - "label": "emsLayerIds", - "description": [], - "signature": [ - "string[] | undefined" - ], - "source": { - "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 13 - }, - "deprecated": false - }, { "parentPluginId": "maps", "id": "def-public.SampleValuesConfig.sampleValues", @@ -1270,7 +1254,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 14 + "lineNumber": 12 }, "deprecated": false }, @@ -1286,7 +1270,7 @@ ], "source": { "path": "x-pack/plugins/maps/public/ems_autosuggest/ems_autosuggest.ts", - "lineNumber": 15 + "lineNumber": 13 }, "deprecated": false } @@ -1561,7 +1545,7 @@ "label": "getEditPath", "description": [], "signature": [ - "(id: string) => string" + "(id: string | undefined) => string" ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", @@ -1577,14 +1561,14 @@ "label": "id", "description": [], "signature": [ - "string" + "string | undefined" ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", "lineNumber": 67 }, "deprecated": false, - "isRequired": true + "isRequired": false } ], "returnComment": [], @@ -1592,13 +1576,13 @@ }, { "parentPluginId": "maps", - "id": "def-common.getExistingMapPath", + "id": "def-common.getFullPath", "type": "Function", "tags": [], - "label": "getExistingMapPath", + "label": "getFullPath", "description": [], "signature": [ - "(id: string) => string" + "(id: string | undefined) => string" ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", @@ -1608,20 +1592,20 @@ "children": [ { "parentPluginId": "maps", - "id": "def-common.getExistingMapPath.$1", + "id": "def-common.getFullPath.$1", "type": "string", "tags": [], "label": "id", "description": [], "signature": [ - "string" + "string | undefined" ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", "lineNumber": 64 }, "deprecated": false, - "isRequired": true + "isRequired": false } ], "returnComment": [], @@ -1657,7 +1641,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 23 + "lineNumber": 29 }, "deprecated": false, "children": [ @@ -1673,7 +1657,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 24 + "lineNumber": 30 }, "deprecated": false } @@ -1750,7 +1734,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 14 + "lineNumber": 20 }, "deprecated": false, "children": [ @@ -1766,7 +1750,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 15 + "lineNumber": 21 }, "deprecated": false }, @@ -1782,7 +1766,68 @@ ], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 18 + "lineNumber": 24 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "maps", + "id": "def-common.MatchingIndexesResp", + "type": "Interface", + "tags": [], + "label": "MatchingIndexesResp", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "maps", + "id": "def-common.MatchingIndexesResp.matchingIndexes", + "type": "Array", + "tags": [], + "label": "matchingIndexes", + "description": [], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "maps", + "id": "def-common.MatchingIndexesResp.success", + "type": "boolean", + "tags": [], + "label": "success", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "maps", + "id": "def-common.MatchingIndexesResp.error", + "type": "Object", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "Error | undefined" + ], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 17 }, "deprecated": false } @@ -1798,7 +1843,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 27 + "lineNumber": 33 }, "deprecated": false, "children": [ @@ -1811,7 +1856,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 28 + "lineNumber": 34 }, "deprecated": false }, @@ -1827,7 +1872,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 29 + "lineNumber": 35 }, "deprecated": false }, @@ -1843,7 +1888,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/types.ts", - "lineNumber": 30 + "lineNumber": 36 }, "deprecated": false } @@ -1861,7 +1906,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 164 + "lineNumber": 176 }, "deprecated": false, "initialIsOpen": false @@ -1875,7 +1920,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 212 + "lineNumber": 224 }, "deprecated": false, "initialIsOpen": false @@ -1889,77 +1934,77 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 293 + "lineNumber": 300 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "maps", - "id": "def-common.DRAW_TYPE", + "id": "def-common.DRAW_MODE", "type": "Enum", "tags": [], - "label": "DRAW_TYPE", + "label": "DRAW_MODE", "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 157 + "lineNumber": 158 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "maps", - "id": "def-common.ES_GEO_FIELD_TYPE", + "id": "def-common.DRAW_SHAPE", "type": "Enum", "tags": [], - "label": "ES_GEO_FIELD_TYPE", + "label": "DRAW_SHAPE", "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 124 + "lineNumber": 165 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "maps", - "id": "def-common.ES_SPATIAL_RELATIONS", + "id": "def-common.ES_GEO_FIELD_TYPE", "type": "Enum", "tags": [], - "label": "ES_SPATIAL_RELATIONS", + "label": "ES_GEO_FIELD_TYPE", "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 132 + "lineNumber": 125 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "maps", - "id": "def-common.FIELD_ORIGIN", + "id": "def-common.ES_SPATIAL_RELATIONS", "type": "Enum", "tags": [], - "label": "FIELD_ORIGIN", + "label": "ES_SPATIAL_RELATIONS", "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 97 + "lineNumber": 133 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "maps", - "id": "def-common.FORMAT_TYPE", + "id": "def-common.FIELD_ORIGIN", "type": "Enum", "tags": [], - "label": "FORMAT_TYPE", + "label": "FIELD_ORIGIN", "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 256 + "lineNumber": 97 }, "deprecated": false, "initialIsOpen": false @@ -1973,7 +2018,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 138 + "lineNumber": 139 }, "deprecated": false, "initialIsOpen": false @@ -1987,7 +2032,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 181 + "lineNumber": 193 }, "deprecated": false, "initialIsOpen": false @@ -2001,7 +2046,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 268 + "lineNumber": 275 }, "deprecated": false, "initialIsOpen": false @@ -2015,7 +2060,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 225 + "lineNumber": 237 }, "deprecated": false, "initialIsOpen": false @@ -2029,7 +2074,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 206 + "lineNumber": 218 }, "deprecated": false, "initialIsOpen": false @@ -2057,7 +2102,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 275 + "lineNumber": 282 }, "deprecated": false, "initialIsOpen": false @@ -2071,7 +2116,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 288 + "lineNumber": 295 }, "deprecated": false, "initialIsOpen": false @@ -2085,7 +2130,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 261 + "lineNumber": 268 }, "deprecated": false, "initialIsOpen": false @@ -2099,7 +2144,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 175 + "lineNumber": 187 }, "deprecated": false, "initialIsOpen": false @@ -2113,7 +2158,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 249 + "lineNumber": 261 }, "deprecated": false, "initialIsOpen": false @@ -2141,7 +2186,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 201 + "lineNumber": 213 }, "deprecated": false, "initialIsOpen": false @@ -2155,7 +2200,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 220 + "lineNumber": 232 }, "deprecated": false, "initialIsOpen": false @@ -2169,7 +2214,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 281 + "lineNumber": 288 }, "deprecated": false, "initialIsOpen": false @@ -2183,7 +2228,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 234 + "lineNumber": 246 }, "deprecated": false, "initialIsOpen": false @@ -2202,7 +2247,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 163 + "lineNumber": 175 }, "deprecated": false, "initialIsOpen": false @@ -2216,7 +2261,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 45 + "lineNumber": 44 }, "deprecated": false, "initialIsOpen": false @@ -2298,7 +2343,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 217 + "lineNumber": 229 }, "deprecated": false, "initialIsOpen": false @@ -2312,7 +2357,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 195 + "lineNumber": 207 }, "deprecated": false, "initialIsOpen": false @@ -2329,7 +2374,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 199 + "lineNumber": 211 }, "deprecated": false, "initialIsOpen": false @@ -2346,7 +2391,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 113 + "lineNumber": 114 }, "deprecated": false, "initialIsOpen": false @@ -2363,7 +2408,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 232 + "lineNumber": 244 }, "deprecated": false, "initialIsOpen": false @@ -2380,7 +2425,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 117 + "lineNumber": 118 }, "deprecated": false, "initialIsOpen": false @@ -2397,7 +2442,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 116 + "lineNumber": 117 }, "deprecated": false, "initialIsOpen": false @@ -2414,7 +2459,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 115 + "lineNumber": 116 }, "deprecated": false, "initialIsOpen": false @@ -2431,7 +2476,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 193 + "lineNumber": 205 }, "deprecated": false, "initialIsOpen": false @@ -2448,7 +2493,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 297 + "lineNumber": 304 }, "deprecated": false, "initialIsOpen": false @@ -2703,7 +2748,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 308 + "lineNumber": 315 }, "deprecated": false, "initialIsOpen": false @@ -2720,7 +2765,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 309 + "lineNumber": 316 }, "deprecated": false, "initialIsOpen": false @@ -2737,7 +2782,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 307 + "lineNumber": 314 }, "deprecated": false, "initialIsOpen": false @@ -2754,7 +2799,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 130 + "lineNumber": 131 }, "deprecated": false, "initialIsOpen": false @@ -2771,7 +2816,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 119 + "lineNumber": 120 }, "deprecated": false, "initialIsOpen": false @@ -2788,7 +2833,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 120 + "lineNumber": 121 }, "deprecated": false, "initialIsOpen": false @@ -2813,7 +2858,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 301 + "lineNumber": 308 }, "deprecated": false, "initialIsOpen": false @@ -2861,7 +2906,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 190 + "lineNumber": 202 }, "deprecated": false, "initialIsOpen": false @@ -2878,7 +2923,21 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 189 + "lineNumber": 201 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "maps", + "id": "def-common.GET_MATCHING_INDEXES_PATH", + "type": "string", + "tags": [], + "label": "GET_MATCHING_INDEXES_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 46 }, "deprecated": false, "initialIsOpen": false @@ -2906,7 +2965,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 44 + "lineNumber": 45 }, "deprecated": false, "initialIsOpen": false @@ -2923,7 +2982,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 303 + "lineNumber": 310 }, "deprecated": false, "initialIsOpen": false @@ -3002,7 +3061,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 56 + "lineNumber": 57 }, "deprecated": false, "initialIsOpen": false @@ -3019,7 +3078,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 53 + "lineNumber": 54 }, "deprecated": false, "initialIsOpen": false @@ -3036,7 +3095,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 52 + "lineNumber": 53 }, "deprecated": false, "initialIsOpen": false @@ -3053,7 +3112,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 150 + "lineNumber": 151 }, "deprecated": false, "initialIsOpen": false @@ -3070,7 +3129,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 149 + "lineNumber": 150 }, "deprecated": false, "initialIsOpen": false @@ -3135,7 +3194,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 305 + "lineNumber": 312 }, "deprecated": false, "initialIsOpen": false @@ -3152,7 +3211,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 111 + "lineNumber": 112 }, "deprecated": false, "initialIsOpen": false @@ -3169,7 +3228,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 122 + "lineNumber": 123 }, "deprecated": false, "initialIsOpen": false @@ -3203,7 +3262,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 110 + "lineNumber": 111 }, "deprecated": false, "initialIsOpen": false @@ -3220,7 +3279,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 48 + "lineNumber": 49 }, "deprecated": false, "initialIsOpen": false @@ -3237,7 +3296,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 47 + "lineNumber": 48 }, "deprecated": false, "initialIsOpen": false @@ -3254,7 +3313,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false, "initialIsOpen": false @@ -3271,7 +3330,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 58 + "lineNumber": 59 }, "deprecated": false, "initialIsOpen": false @@ -3288,7 +3347,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 218 + "lineNumber": 230 }, "deprecated": false, "initialIsOpen": false @@ -3305,7 +3364,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 148 + "lineNumber": 149 }, "deprecated": false, "initialIsOpen": false @@ -3322,7 +3381,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 299 + "lineNumber": 306 }, "deprecated": false, "initialIsOpen": false @@ -3398,7 +3457,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 266 + "lineNumber": 273 }, "deprecated": false, "initialIsOpen": false @@ -3415,7 +3474,24 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 188 + "lineNumber": 200 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "maps", + "id": "def-common.SUPPORTS_FEATURE_EDITING_REQUEST_ID", + "type": "string", + "tags": [], + "label": "SUPPORTS_FEATURE_EDITING_REQUEST_ID", + "description": [], + "signature": [ + "\"SUPPORTS_FEATURE_EDITING_REQUEST_ID\"" + ], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 109 }, "deprecated": false, "initialIsOpen": false @@ -3432,7 +3508,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 192 + "lineNumber": 204 }, "deprecated": false, "initialIsOpen": false @@ -3449,7 +3525,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 114 + "lineNumber": 115 }, "deprecated": false, "initialIsOpen": false @@ -3465,7 +3541,7 @@ "description": [], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 152 + "lineNumber": 153 }, "deprecated": false, "children": [ @@ -3481,7 +3557,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 153 + "lineNumber": 154 }, "deprecated": false }, @@ -3497,7 +3573,7 @@ ], "source": { "path": "x-pack/plugins/maps/common/constants.ts", - "lineNumber": 154 + "lineNumber": 155 }, "deprecated": false } diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index efa7ddb5fddf58..e9d882d11c40f5 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import mapsObj from './maps.json'; @@ -19,7 +18,7 @@ import mapsObj from './maps.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 196 | 2 | 195 | 11 | +| 201 | 2 | 200 | 11 | ## Client diff --git a/api_docs/maps_ems.json b/api_docs/maps_ems.json index 347d2f28996b45..13db0329b4f778 100644 --- a/api_docs/maps_ems.json +++ b/api_docs/maps_ems.json @@ -822,7 +822,7 @@ "label": "MapsEmsConfig", "description": [], "signature": [ - "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" + "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; includeElasticMapsService: boolean; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" ], "source": { "path": "src/plugins/maps_ems/config.ts", @@ -914,7 +914,7 @@ "label": "config", "description": [], "signature": [ - "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" + "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; includeElasticMapsService: boolean; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" ], "source": { "path": "src/plugins/maps_ems/public/index.ts", @@ -1027,7 +1027,7 @@ "section": "def-server.PluginInitializerContext", "text": "PluginInitializerContext" }, - "<Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" + "<Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; includeElasticMapsService: boolean; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" ], "source": { "path": "src/plugins/maps_ems/server/index.ts", @@ -1066,7 +1066,7 @@ "section": "def-server.PluginInitializerContext", "text": "PluginInitializerContext" }, - "<Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" + "<Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; includeElasticMapsService: boolean; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" ], "source": { "path": "src/plugins/maps_ems/server/index.ts", @@ -1094,7 +1094,7 @@ "section": "def-server.CoreSetup", "text": "CoreSetup" }, - "<object, unknown>) => { config: Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>; }" + "<object, unknown>) => { config: Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; includeElasticMapsService: boolean; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>; }" ], "source": { "path": "src/plugins/maps_ems/server/index.ts", @@ -1174,7 +1174,7 @@ "label": "config", "description": [], "signature": [ - "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" + "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { layers: Readonly<{} & { name: string; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; format: Readonly<{} & { type: string; }>; url: string; attribution: string; }>[]; includeElasticMapsService: boolean; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" ], "source": { "path": "src/plugins/maps_ems/server/index.ts", diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 0abd9d511cf90c..667c126b5197ef 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import mapsEmsObj from './maps_ems.json'; diff --git a/api_docs/metrics_entities.mdx b/api_docs/metrics_entities.mdx index 182a78cd0ddc1b..99c2045d683b3d 100644 --- a/api_docs/metrics_entities.mdx +++ b/api_docs/metrics_entities.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsEntities'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import metricsEntitiesObj from './metrics_entities.json'; diff --git a/api_docs/ml.json b/api_docs/ml.json index 2e0e6364993d53..99038a2d1842d5 100644 --- a/api_docs/ml.json +++ b/api_docs/ml.json @@ -1299,6 +1299,22 @@ "lineNumber": 38 }, "deprecated": false + }, + { + "parentPluginId": "ml", + "id": "def-public.MlSummaryJob.jobTags", + "type": "Object", + "tags": [], + "label": "jobTags", + "description": [], + "signature": [ + "{ [x: string]: string; }" + ], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", + "lineNumber": 39 + }, + "deprecated": false } ], "initialIsOpen": false @@ -1563,7 +1579,7 @@ ], "source": { "path": "x-pack/plugins/ml/public/plugin.ts", - "lineNumber": 212 + "lineNumber": 203 }, "deprecated": false, "lifecycle": "start", @@ -2757,7 +2773,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 41 + "lineNumber": 42 }, "deprecated": false, "children": [ @@ -2770,7 +2786,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 42 + "lineNumber": 43 }, "deprecated": false }, @@ -2783,7 +2799,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 43 + "lineNumber": 44 }, "deprecated": false }, @@ -2796,7 +2812,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 44 + "lineNumber": 45 }, "deprecated": false }, @@ -2809,7 +2825,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 45 + "lineNumber": 46 }, "deprecated": false }, @@ -2822,7 +2838,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 46 + "lineNumber": 47 }, "deprecated": false }, @@ -2835,7 +2851,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 47 + "lineNumber": 48 }, "deprecated": false } @@ -3009,7 +3025,7 @@ ], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 52 + "lineNumber": 53 }, "deprecated": false, "children": [ @@ -3022,7 +3038,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 53 + "lineNumber": 54 }, "deprecated": false }, @@ -3038,7 +3054,7 @@ ], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 54 + "lineNumber": 55 }, "deprecated": false }, @@ -3054,7 +3070,7 @@ ], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 55 + "lineNumber": 56 }, "deprecated": false }, @@ -3070,7 +3086,7 @@ ], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 56 + "lineNumber": 57 }, "deprecated": false } @@ -3446,6 +3462,22 @@ "lineNumber": 38 }, "deprecated": false + }, + { + "parentPluginId": "ml", + "id": "def-server.MlSummaryJob.jobTags", + "type": "Object", + "tags": [], + "label": "jobTags", + "description": [], + "signature": [ + "{ [x: string]: string; }" + ], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", + "lineNumber": 39 + }, + "deprecated": false } ], "initialIsOpen": false @@ -3896,7 +3928,7 @@ ], "source": { "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/summary_job.ts", - "lineNumber": 50 + "lineNumber": 51 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 4a9b98a3268373..322cd6ea89927c 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import mlObj from './ml.json'; +This plugin provides access to the machine learning features provided by Elastic. - - +Contact [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 274 | 10 | 270 | 32 | +| 276 | 10 | 272 | 32 | ## Client diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index e3dd2a0bbb6a5d..1f60e4d1bcd4c7 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import monitoringObj from './monitoring.json'; diff --git a/api_docs/navigation.json b/api_docs/navigation.json index f04e195e95ec8c..b78eb2882888be 100644 --- a/api_docs/navigation.json +++ b/api_docs/navigation.json @@ -546,7 +546,7 @@ "section": "def-public.SearchBarProps", "text": "SearchBarProps" }, - ", \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"indexPatterns\" | \"isLoading\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"isClearable\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"onFiltersUpdated\" | \"onRefreshChange\"> & { config?: ", + ", \"filters\" | \"query\" | \"placeholder\" | \"iconType\" | \"isClearable\" | \"isLoading\" | \"indexPatterns\" | \"customSubmitButton\" | \"screenTitle\" | \"dataTestSubj\" | \"showQueryBar\" | \"showQueryInput\" | \"showFilterBar\" | \"showDatePicker\" | \"showAutoRefreshOnly\" | \"isRefreshPaused\" | \"refreshInterval\" | \"dateRangeFrom\" | \"dateRangeTo\" | \"showSaveQuery\" | \"savedQuery\" | \"onQueryChange\" | \"onQuerySubmit\" | \"onSaved\" | \"onSavedQueryUpdated\" | \"onClearSavedQuery\" | \"onRefresh\" | \"indicateNoData\" | \"nonKqlMode\" | \"nonKqlModeHelpText\" | \"onFiltersUpdated\" | \"onRefreshChange\"> & { config?: ", { "pluginId": "navigation", "scope": "public", diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index b8b6f82162916a..023fabfe95728d 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import navigationObj from './navigation.json'; diff --git a/api_docs/newsfeed.json b/api_docs/newsfeed.json index eec5a9c5642e50..bceefa127faf0b 100644 --- a/api_docs/newsfeed.json +++ b/api_docs/newsfeed.json @@ -13,7 +13,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 45 + "lineNumber": 49 }, "deprecated": false, "children": [ @@ -26,7 +26,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 46 + "lineNumber": 50 }, "deprecated": false }, @@ -39,7 +39,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 47 + "lineNumber": 51 }, "deprecated": false }, @@ -62,7 +62,7 @@ ], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 48 + "lineNumber": 52 }, "deprecated": false }, @@ -78,7 +78,7 @@ ], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 49 + "lineNumber": 53 }, "deprecated": false } @@ -94,7 +94,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 34 + "lineNumber": 38 }, "deprecated": false, "children": [ @@ -107,7 +107,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 35 + "lineNumber": 39 }, "deprecated": false }, @@ -120,7 +120,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 36 + "lineNumber": 40 }, "deprecated": false }, @@ -136,7 +136,7 @@ ], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 37 + "lineNumber": 41 }, "deprecated": false }, @@ -149,7 +149,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 38 + "lineNumber": 42 }, "deprecated": false }, @@ -165,7 +165,7 @@ ], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 39 + "lineNumber": 43 }, "deprecated": false }, @@ -181,7 +181,7 @@ ], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 40 + "lineNumber": 44 }, "deprecated": false }, @@ -197,7 +197,7 @@ ], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 41 + "lineNumber": 45 }, "deprecated": false }, @@ -210,7 +210,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/types.ts", - "lineNumber": 42 + "lineNumber": 46 }, "deprecated": false } @@ -228,7 +228,7 @@ "description": [], "source": { "path": "src/plugins/newsfeed/public/lib/api.ts", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 0c3fe2bbc6640a..7a073230ba33f6 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import newsfeedObj from './newsfeed.json'; diff --git a/api_docs/observability.json b/api_docs/observability.json index f59cf6407de756..ac70815fcddc09 100644 --- a/api_docs/observability.json +++ b/api_docs/observability.json @@ -79,7 +79,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 38 + "lineNumber": 41 }, "deprecated": false, "children": [ @@ -103,7 +103,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 38 + "lineNumber": 41 }, "deprecated": false, "isRequired": true @@ -120,7 +120,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/configurations/utils.ts", - "lineNumber": 38 + "lineNumber": 41 }, "deprecated": false, "isRequired": true @@ -149,11 +149,11 @@ "Formatter", "; }) => void; getFormatter: (typeId: string) => ", "Formatter", - " | undefined; } & { registerFormatter: () => void; }" + " | undefined; } & { getFormatter: () => () => string; registerFormatter: () => void; }" ], "source": { "path": "x-pack/plugins/observability/public/rules/observability_rule_type_registry_mock.ts", - "lineNumber": 14 + "lineNumber": 15 }, "deprecated": false, "children": [], @@ -174,7 +174,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 36 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -190,7 +190,44 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 36 + "lineNumber": 37 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-public.FilterValueLabel", + "type": "Function", + "tags": [], + "label": "FilterValueLabel", + "description": [], + "signature": [ + "({\n label,\n field,\n value,\n negate,\n indexPattern,\n invertFilter,\n removeFilter,\n allowExclusion = true,\n}: Props) => JSX.Element | null" + ], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.FilterValueLabel.$1", + "type": "Object", + "tags": [], + "label": "{\n label,\n field,\n value,\n negate,\n indexPattern,\n invertFilter,\n removeFilter,\n allowExclusion = true,\n}", + "description": [], + "signature": [ + "Props" + ], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx", + "lineNumber": 50 }, "deprecated": false, "isRequired": true @@ -287,7 +324,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "children": [ @@ -303,7 +340,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false, "isRequired": true @@ -326,7 +363,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false, "children": [ @@ -342,7 +379,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 26 + "lineNumber": 27 }, "deprecated": false, "isRequired": true @@ -351,6 +388,42 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "observability", + "id": "def-public.LazyAlertsFlyout", + "type": "Function", + "tags": [], + "label": "LazyAlertsFlyout", + "description": [], + "signature": [ + "React.ExoticComponent<AlertsFlyoutProps> & { readonly _result: ({ alerts, isInApp, observabilityRuleTypeRegistry, onClose, selectedAlertId, }: AlertsFlyoutProps) => JSX.Element | null; }" + ], + "source": { + "path": "x-pack/plugins/observability/public/index.ts", + "lineNumber": 58 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.props", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "source": { + "path": "node_modules/@types/react/index.d.ts", + "lineNumber": 359 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-public.Section", @@ -591,7 +664,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "lineNumber": 43 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -608,7 +681,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "lineNumber": 43 + "lineNumber": 37 }, "deprecated": false, "isRequired": true @@ -1010,7 +1083,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 114 + "lineNumber": 125 }, "deprecated": false, "children": [ @@ -1042,7 +1115,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 115 + "lineNumber": 126 }, "deprecated": false }, @@ -1066,7 +1139,52 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 119 + "lineNumber": 130 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-public.APMHasDataResponse", + "type": "Interface", + "tags": [], + "label": "APMHasDataResponse", + "description": [], + "source": { + "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.APMHasDataResponse.hasData", + "type": "boolean", + "tags": [], + "label": "hasData", + "description": [], + "source": { + "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.APMHasDataResponse.indices", + "type": "Object", + "tags": [], + "label": "indices", + "description": [], + "signature": [ + "ApmIndicesConfig" + ], + "source": { + "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", + "lineNumber": 52 }, "deprecated": false } @@ -1082,7 +1200,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/index.ts", - "lineNumber": 24 + "lineNumber": 25 }, "deprecated": false, "children": [ @@ -1098,7 +1216,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/index.ts", - "lineNumber": 25 + "lineNumber": 26 }, "deprecated": false } @@ -1114,7 +1232,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 15 + "lineNumber": 17 }, "deprecated": false, "children": [ @@ -1127,7 +1245,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 16 + "lineNumber": 18 }, "deprecated": false }, @@ -1143,7 +1261,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 17 + "lineNumber": 19 }, "deprecated": false } @@ -1169,7 +1287,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 57 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -1201,7 +1319,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 60 + "lineNumber": 71 }, "deprecated": false, "returnComment": [], @@ -1224,7 +1342,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 45 + "lineNumber": 56 }, "deprecated": false } @@ -1258,7 +1376,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 61 + "lineNumber": 72 }, "deprecated": false, "returnComment": [], @@ -1282,7 +1400,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 49 + "lineNumber": 60 }, "deprecated": false } @@ -1300,7 +1418,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 24 + "lineNumber": 26 }, "deprecated": false, "children": [ @@ -1316,7 +1434,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 25 + "lineNumber": 27 }, "deprecated": false }, @@ -1332,7 +1450,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 26 + "lineNumber": 28 }, "deprecated": false }, @@ -1345,7 +1463,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 27 + "lineNumber": 29 }, "deprecated": false }, @@ -1361,7 +1479,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 28 + "lineNumber": 30 }, "deprecated": false } @@ -1377,7 +1495,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 64 + "lineNumber": 75 }, "deprecated": false, "children": [ @@ -1390,7 +1508,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 65 + "lineNumber": 76 }, "deprecated": false } @@ -1406,7 +1524,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 31 + "lineNumber": 33 }, "deprecated": false, "children": [ @@ -1422,7 +1540,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 32 + "lineNumber": 34 }, "deprecated": false } @@ -1438,7 +1556,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 35 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -1451,20 +1569,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 36 - }, - "deprecated": false - }, - { - "parentPluginId": "observability", - "id": "def-public.HasDataResponse.indices", - "type": "string", - "tags": [], - "label": "indices", - "description": [], - "source": { - "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 37 + "lineNumber": 38 }, "deprecated": false } @@ -1497,7 +1602,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 68 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -1521,7 +1626,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 69 + "lineNumber": 80 }, "deprecated": false }, @@ -1545,7 +1650,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 70 + "lineNumber": 81 }, "deprecated": false } @@ -1578,7 +1683,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 97 + "lineNumber": 108 }, "deprecated": false, "children": [ @@ -1602,7 +1707,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 98 + "lineNumber": 109 }, "deprecated": false, "returnComment": [], @@ -1616,7 +1721,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 98 + "lineNumber": 109 }, "deprecated": false }, @@ -1629,7 +1734,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 98 + "lineNumber": 109 }, "deprecated": false } @@ -1654,7 +1759,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 99 + "lineNumber": 110 }, "deprecated": false } @@ -1670,7 +1775,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 76 + "lineNumber": 87 }, "deprecated": false, "children": [ @@ -1683,7 +1788,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 77 + "lineNumber": 88 }, "deprecated": false }, @@ -1699,7 +1804,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 78 + "lineNumber": 89 }, "deprecated": false }, @@ -1715,7 +1820,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 79 + "lineNumber": 90 }, "deprecated": false }, @@ -1731,7 +1836,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 80 + "lineNumber": 91 }, "deprecated": false }, @@ -1747,7 +1852,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 81 + "lineNumber": 92 }, "deprecated": false }, @@ -1763,7 +1868,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 82 + "lineNumber": 93 }, "deprecated": false }, @@ -1779,7 +1884,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 83 + "lineNumber": 94 }, "deprecated": false }, @@ -1795,7 +1900,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 84 + "lineNumber": 95 }, "deprecated": false }, @@ -1811,7 +1916,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 85 + "lineNumber": 96 }, "deprecated": false }, @@ -1827,7 +1932,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 86 + "lineNumber": 97 }, "deprecated": false }, @@ -1843,7 +1948,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 87 + "lineNumber": 98 }, "deprecated": false } @@ -1859,7 +1964,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 128 + "lineNumber": 139 }, "deprecated": false, "children": [ @@ -1881,7 +1986,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 129 + "lineNumber": 140 }, "deprecated": false }, @@ -1903,7 +2008,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 130 + "lineNumber": 141 }, "deprecated": false }, @@ -1925,7 +2030,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 131 + "lineNumber": 142 }, "deprecated": false }, @@ -1947,7 +2052,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 132 + "lineNumber": 143 }, "deprecated": false }, @@ -1969,7 +2074,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 133 + "lineNumber": 144 }, "deprecated": false } @@ -1985,20 +2090,29 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 136 + "lineNumber": 147 }, "deprecated": false, "children": [ { "parentPluginId": "observability", "id": "def-public.ObservabilityHasDataResponse.apm", - "type": "boolean", + "type": "Object", "tags": [], "label": "apm", "description": [], + "signature": [ + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.APMHasDataResponse", + "text": "APMHasDataResponse" + } + ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 137 + "lineNumber": 148 }, "deprecated": false }, @@ -2011,7 +2125,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 138 + "lineNumber": 149 }, "deprecated": false }, @@ -2024,7 +2138,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 139 + "lineNumber": 150 }, "deprecated": false }, @@ -2040,13 +2154,13 @@ "pluginId": "observability", "scope": "public", "docId": "kibObservabilityPluginApi", - "section": "def-public.HasDataResponse", - "text": "HasDataResponse" + "section": "def-public.SyntheticsHasDataResponse", + "text": "SyntheticsHasDataResponse" } ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 140 + "lineNumber": 151 }, "deprecated": false }, @@ -2068,7 +2182,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 141 + "lineNumber": 152 }, "deprecated": false } @@ -2084,7 +2198,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 42 + "lineNumber": 47 }, "deprecated": false, "children": [ @@ -2106,7 +2220,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 43 + "lineNumber": 48 }, "deprecated": false }, @@ -2128,7 +2242,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 44 + "lineNumber": 49 }, "deprecated": false }, @@ -2151,7 +2265,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 45 + "lineNumber": 50 }, "deprecated": false } @@ -2167,10 +2281,32 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 48 + "lineNumber": 53 }, "deprecated": false, "children": [ + { + "parentPluginId": "observability", + "id": "def-public.ObservabilityPublicPluginsStart.cases", + "type": "Object", + "tags": [], + "label": "cases", + "description": [], + "signature": [ + { + "pluginId": "cases", + "scope": "public", + "docId": "kibCasesPluginApi", + "section": "def-public.CasesUiStart", + "text": "CasesUiStart" + } + ], + "source": { + "path": "x-pack/plugins/observability/public/plugin.ts", + "lineNumber": 54 + }, + "deprecated": false + }, { "parentPluginId": "observability", "id": "def-public.ObservabilityPublicPluginsStart.home", @@ -2190,7 +2326,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 49 + "lineNumber": 55 }, "deprecated": false }, @@ -2212,7 +2348,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 50 + "lineNumber": 56 }, "deprecated": false }, @@ -2234,7 +2370,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 51 + "lineNumber": 57 }, "deprecated": false }, @@ -2256,7 +2392,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 52 + "lineNumber": 58 }, "deprecated": false } @@ -2272,7 +2408,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 20 + "lineNumber": 22 }, "deprecated": false, "children": [ @@ -2295,7 +2431,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 21 + "lineNumber": 23 }, "deprecated": false } @@ -2311,7 +2447,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 82 + "lineNumber": 71 }, "deprecated": false, "children": [ @@ -2327,7 +2463,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 83 + "lineNumber": 72 }, "deprecated": false }, @@ -2343,7 +2479,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 87 + "lineNumber": 76 }, "deprecated": false }, @@ -2360,7 +2496,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 88 + "lineNumber": 77 }, "deprecated": false }, @@ -2376,7 +2512,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 89 + "lineNumber": 78 }, "deprecated": false }, @@ -2388,11 +2524,11 @@ "label": "reportType", "description": [], "signature": [ - "\"logs\" | \"cpu\" | \"pld\" | \"kpi\" | \"cwv\" | \"upd\" | \"upp\" | \"svl\" | \"tpt\" | \"mem\" | \"nwk\"" + "\"data-distribution\" | \"kpi-over-time\" | \"core-web-vitals\" | \"device-data-distribution\"" ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 90 + "lineNumber": 79 }, "deprecated": false }, @@ -2404,11 +2540,11 @@ "label": "operationType", "description": [], "signature": [ - "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"average\" | \"percentile\" | \"terms\" | \"median\" | \"cumulative_sum\" | \"moving_average\" | \"math\" | \"counter_rate\" | \"differences\" | \"unique_count\" | \"last_value\" | \"formula\" | undefined" + "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"average\" | \"percentile\" | \"terms\" | \"median\" | \"cumulative_sum\" | \"moving_average\" | \"math\" | \"overall_sum\" | \"overall_min\" | \"overall_max\" | \"overall_average\" | \"counter_rate\" | \"differences\" | \"unique_count\" | \"last_value\" | \"formula\" | undefined" ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 91 + "lineNumber": 80 }, "deprecated": false }, @@ -2420,11 +2556,11 @@ "label": "dataType", "description": [], "signature": [ - "\"apm\" | \"infra_metrics\" | \"infra_logs\" | \"synthetics\" | \"ux\"" + "\"mobile\" | \"apm\" | \"infra_metrics\" | \"infra_logs\" | \"synthetics\" | \"ux\"" ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 92 + "lineNumber": 81 }, "deprecated": false }, @@ -2440,7 +2576,39 @@ ], "source": { "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", - "lineNumber": 93 + "lineNumber": 82 + }, + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.SeriesUrl.selectedMetricField", + "type": "string", + "tags": [], + "label": "selectedMetricField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.SeriesUrl.isNew", + "type": "CompoundType", + "tags": [], + "label": "isNew", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/exploratory_view/types.ts", + "lineNumber": 84 }, "deprecated": false } @@ -2456,7 +2624,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 10 + "lineNumber": 12 }, "deprecated": false, "children": [ @@ -2472,7 +2640,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 11 + "lineNumber": 13 }, "deprecated": false }, @@ -2485,7 +2653,53 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 12 + "lineNumber": 14 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-public.SyntheticsHasDataResponse", + "type": "Interface", + "tags": [], + "label": "SyntheticsHasDataResponse", + "description": [], + "signature": [ + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.SyntheticsHasDataResponse", + "text": "SyntheticsHasDataResponse" + }, + " extends ", + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.HasDataResponse", + "text": "HasDataResponse" + } + ], + "source": { + "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", + "lineNumber": 46 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.SyntheticsHasDataResponse.indices", + "type": "string", + "tags": [], + "label": "indices", + "description": [], + "source": { + "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", + "lineNumber": 47 }, "deprecated": false } @@ -2518,7 +2732,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 102 + "lineNumber": 113 }, "deprecated": false, "children": [ @@ -2558,7 +2772,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 103 + "lineNumber": 114 }, "deprecated": false }, @@ -2590,7 +2804,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 108 + "lineNumber": 119 }, "deprecated": false } @@ -2623,7 +2837,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 124 + "lineNumber": 135 }, "deprecated": false, "children": [ @@ -2645,7 +2859,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 125 + "lineNumber": 136 }, "deprecated": false } @@ -2678,7 +2892,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 40 + "lineNumber": 41 }, "deprecated": false, "children": [ @@ -2694,7 +2908,23 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 41 + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "observability", + "id": "def-public.UXHasDataResponse.indices", + "type": "string", + "tags": [], + "label": "indices", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", + "lineNumber": 43 }, "deprecated": false } @@ -2962,7 +3192,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 44 + "lineNumber": 55 }, "deprecated": false, "initialIsOpen": false @@ -2995,7 +3225,32 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 48 + "lineNumber": 59 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-public.LazyObservabilityPageTemplateProps", + "type": "Type", + "tags": [], + "label": "LazyObservabilityPageTemplateProps", + "description": [], + "signature": [ + "{ children?: React.ReactNode; 'data-test-subj'?: string | undefined; paddingSize?: \"none\" | \"m\" | \"s\" | \"l\" | undefined; restrictWidth?: string | number | boolean | undefined; template?: \"default\" | \"empty\" | \"centeredBody\" | \"centeredContent\" | undefined; pageHeader?: ", + "EuiPageHeaderProps", + " | undefined; isEmptyState?: boolean | undefined; pageBodyProps?: ", + "EuiPageBodyProps", + "<\"main\"> | undefined; pageContentProps?: ", + "EuiPageContentProps", + " | undefined; pageContentBodyProps?: ", + "EuiPageContentBodyProps", + " | undefined; }" + ], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/page_template/lazy_page_template.tsx", + "lineNumber": 16 }, "deprecated": false, "initialIsOpen": false @@ -3012,7 +3267,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 74 + "lineNumber": 85 }, "deprecated": false, "initialIsOpen": false @@ -3029,7 +3284,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 52 + "lineNumber": 63 }, "deprecated": false, "initialIsOpen": false @@ -3119,7 +3374,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts", - "lineNumber": 73 + "lineNumber": 84 }, "deprecated": false, "initialIsOpen": false @@ -3204,7 +3459,7 @@ ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 40 + "lineNumber": 45 }, "deprecated": false, "lifecycle": "setup", @@ -3218,13 +3473,19 @@ "label": "ObservabilityPublicStart", "description": [], "signature": [ - "{ navigation: { PageTemplate: (pageTemplateProps: ", - "WrappedPageTemplateProps", - ") => JSX.Element; }; }" + "{ navigation: { PageTemplate: (pageTemplateProps: Pick<", + { + "pluginId": "kibanaReact", + "scope": "public", + "docId": "kibKibanaReactPluginApi", + "section": "def-public.KibanaPageTemplateProps", + "text": "KibanaPageTemplateProps" + }, + ", \"children\" | \"data-test-subj\" | \"paddingSize\" | \"restrictWidth\" | \"template\" | \"pageHeader\" | \"isEmptyState\" | \"pageBodyProps\" | \"pageContentProps\" | \"pageContentBodyProps\">) => JSX.Element; }; }" ], "source": { "path": "x-pack/plugins/observability/public/plugin.ts", - "lineNumber": 55 + "lineNumber": 61 }, "deprecated": false, "lifecycle": "start", @@ -4182,7 +4443,7 @@ ], "source": { "path": "x-pack/plugins/observability/server/plugin.ts", - "lineNumber": 21 + "lineNumber": 29 }, "deprecated": false, "lifecycle": "setup", @@ -4194,7 +4455,59 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "observability", + "id": "def-common.casesFeatureId", + "type": "string", + "tags": [], + "label": "casesFeatureId", + "description": [], + "signature": [ + "\"observabilityCases\"" + ], + "source": { + "path": "x-pack/plugins/observability/common/index.ts", + "lineNumber": 8 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-common.observabilityAppId", + "type": "string", + "tags": [], + "label": "observabilityAppId", + "description": [], + "signature": [ + "\"observability-overview\"" + ], + "source": { + "path": "x-pack/plugins/observability/common/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "observability", + "id": "def-common.observabilityFeatureId", + "type": "string", + "tags": [], + "label": "observabilityFeatureId", + "description": [], + "signature": [ + "\"observability\"" + ], + "source": { + "path": "x-pack/plugins/observability/common/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 6787e3f0238c87..6fc08a1a70e0fb 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import observabilityObj from './observability.json'; @@ -19,7 +18,7 @@ import observabilityObj from './observability.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 194 | 0 | 194 | 10 | +| 210 | 0 | 210 | 10 | ## Client @@ -58,3 +57,8 @@ import observabilityObj from './observability.json'; ### Consts, variables and types <DocDefinitionList data={observabilityObj.server.misc}/> +## Common + +### Consts, variables and types +<DocDefinitionList data={observabilityObj.common.misc}/> + diff --git a/api_docs/osquery.json b/api_docs/osquery.json index 88a7e3ec7477bd..c58c04f977d57f 100644 --- a/api_docs/osquery.json +++ b/api_docs/osquery.json @@ -16,7 +16,7 @@ "description": [], "source": { "path": "x-pack/plugins/osquery/public/types.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false, "children": [], @@ -32,7 +32,7 @@ "description": [], "source": { "path": "x-pack/plugins/osquery/public/types.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false, "children": [], @@ -56,7 +56,7 @@ "description": [], "source": { "path": "x-pack/plugins/osquery/server/types.ts", - "lineNumber": 17 + "lineNumber": 19 }, "deprecated": false, "children": [], @@ -72,7 +72,7 @@ "description": [], "source": { "path": "x-pack/plugins/osquery/server/types.ts", - "lineNumber": 19 + "lineNumber": 21 }, "deprecated": false, "children": [], diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index a981f8f4b8c658..fb6531e4984065 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import osqueryObj from './osquery.json'; diff --git a/api_docs/presentation_util.json b/api_docs/presentation_util.json index bde8373e4450e0..d72410f9322c02 100644 --- a/api_docs/presentation_util.json +++ b/api_docs/presentation_util.json @@ -791,7 +791,7 @@ "label": "isProjectEnabled", "description": [], "signature": [ - "(id: \"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\") => boolean" + "(id: \"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\") => boolean" ], "source": { "path": "src/plugins/presentation_util/public/services/labs.ts", @@ -808,7 +808,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\"" + "\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\"" ], "source": { "path": "src/plugins/presentation_util/public/services/labs.ts", @@ -826,7 +826,7 @@ "label": "getProjectIDs", "description": [], "signature": [ - "() => readonly [\"labs:presentation:timeToPresent\", \"labs:canvas:useDataService\", \"labs:dashboard:deferBelowFold\"]" + "() => readonly [\"labs:presentation:timeToPresent\", \"labs:dashboard:deferBelowFold\"]" ], "source": { "path": "src/plugins/presentation_util/public/services/labs.ts", @@ -844,7 +844,7 @@ "label": "getProject", "description": [], "signature": [ - "(id: \"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\") => ", + "(id: \"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\") => ", { "pluginId": "presentationUtil", "scope": "common", @@ -868,7 +868,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\"" + "\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\"" ], "source": { "path": "src/plugins/presentation_util/public/services/labs.ts", @@ -886,7 +886,7 @@ "label": "getProjects", "description": [], "signature": [ - "(solutions?: (\"dashboard\" | \"canvas\" | \"presentation\")[] | undefined) => Record<\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\", ", + "(solutions?: (\"dashboard\" | \"canvas\" | \"presentation\")[] | undefined) => Record<\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\", ", { "pluginId": "presentationUtil", "scope": "common", @@ -929,7 +929,7 @@ "label": "setProjectStatus", "description": [], "signature": [ - "(id: \"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\", env: \"kibana\" | \"browser\" | \"session\", status: boolean) => void" + "(id: \"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\", env: \"kibana\" | \"browser\" | \"session\", status: boolean) => void" ], "source": { "path": "src/plugins/presentation_util/public/services/labs.ts", @@ -946,7 +946,7 @@ "label": "id", "description": [], "signature": [ - "\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\"" + "\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\"" ], "source": { "path": "src/plugins/presentation_util/public/services/labs.ts", @@ -1261,7 +1261,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 94 + "lineNumber": 77 }, "deprecated": false, "initialIsOpen": false @@ -1274,11 +1274,11 @@ "label": "ProjectID", "description": [], "signature": [ - "\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\"" + "\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\"" ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 70 + "lineNumber": 53 }, "deprecated": false, "initialIsOpen": false @@ -1293,11 +1293,11 @@ "label": "projectIDs", "description": [], "signature": [ - "readonly [\"labs:presentation:timeToPresent\", \"labs:canvas:useDataService\", \"labs:dashboard:deferBelowFold\"]" + "readonly [\"labs:presentation:timeToPresent\", \"labs:dashboard:deferBelowFold\"]" ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 16 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false @@ -1447,11 +1447,11 @@ "label": "getProjectIDs", "description": [], "signature": [ - "() => readonly [\"labs:presentation:timeToPresent\", \"labs:canvas:useDataService\", \"labs:dashboard:deferBelowFold\"]" + "() => readonly [\"labs:presentation:timeToPresent\", \"labs:dashboard:deferBelowFold\"]" ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 96 + "lineNumber": 79 }, "deprecated": false, "children": [], @@ -1478,7 +1478,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 98 + "lineNumber": 81 }, "deprecated": false, "children": [ @@ -1494,7 +1494,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 98 + "lineNumber": 81 }, "deprecated": false, "isRequired": true @@ -1517,7 +1517,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 98 + "lineNumber": 81 }, "deprecated": false, "isRequired": true @@ -1537,7 +1537,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 84 + "lineNumber": 67 }, "deprecated": false, "children": [ @@ -1549,11 +1549,11 @@ "label": "id", "description": [], "signature": [ - "\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\"" + "\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\"" ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 85 + "lineNumber": 68 }, "deprecated": false }, @@ -1566,7 +1566,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 86 + "lineNumber": 69 }, "deprecated": false }, @@ -1579,7 +1579,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 87 + "lineNumber": 70 }, "deprecated": false }, @@ -1592,7 +1592,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 88 + "lineNumber": 71 }, "deprecated": false }, @@ -1608,7 +1608,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 89 + "lineNumber": 72 }, "deprecated": false }, @@ -1621,7 +1621,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 90 + "lineNumber": 73 }, "deprecated": false }, @@ -1637,7 +1637,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 91 + "lineNumber": 74 }, "deprecated": false } @@ -1659,7 +1659,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 14 + "lineNumber": 13 }, "deprecated": false, "initialIsOpen": false @@ -1676,7 +1676,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 71 + "lineNumber": 54 }, "deprecated": false, "initialIsOpen": false @@ -1693,7 +1693,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 74 + "lineNumber": 57 }, "deprecated": false, "initialIsOpen": false @@ -1776,7 +1776,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 94 + "lineNumber": 77 }, "deprecated": false, "initialIsOpen": false @@ -1789,11 +1789,11 @@ "label": "ProjectID", "description": [], "signature": [ - "\"labs:presentation:timeToPresent\" | \"labs:canvas:useDataService\" | \"labs:dashboard:deferBelowFold\"" + "\"labs:presentation:timeToPresent\" | \"labs:dashboard:deferBelowFold\"" ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 70 + "lineNumber": 53 }, "deprecated": false, "initialIsOpen": false @@ -1817,7 +1817,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 78 + "lineNumber": 61 }, "deprecated": false, "initialIsOpen": false @@ -1834,7 +1834,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 72 + "lineNumber": 55 }, "deprecated": false, "initialIsOpen": false @@ -1849,23 +1849,6 @@ "signature": [ "\"labs:presentation:timeToPresent\"" ], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 13 - }, - "deprecated": false, - "initialIsOpen": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.USE_DATA_SERVICE", - "type": "string", - "tags": [], - "label": "USE_DATA_SERVICE", - "description": [], - "signature": [ - "\"labs:canvas:useDataService\"" - ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", "lineNumber": 12 @@ -1887,7 +1870,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 17 + "lineNumber": 16 }, "deprecated": false, "initialIsOpen": false @@ -1900,11 +1883,11 @@ "label": "projectIDs", "description": [], "signature": [ - "readonly [\"labs:presentation:timeToPresent\", \"labs:canvas:useDataService\", \"labs:dashboard:deferBelowFold\"]" + "readonly [\"labs:presentation:timeToPresent\", \"labs:dashboard:deferBelowFold\"]" ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 16 + "lineNumber": 15 }, "deprecated": false, "initialIsOpen": false @@ -1920,7 +1903,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 24 + "lineNumber": 23 }, "deprecated": false, "children": [ @@ -1933,7 +1916,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 25 + "lineNumber": 24 }, "deprecated": false, "children": [ @@ -1949,7 +1932,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 26 + "lineNumber": 25 }, "deprecated": false }, @@ -1965,7 +1948,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 27 + "lineNumber": 26 }, "deprecated": false }, @@ -1981,7 +1964,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 28 + "lineNumber": 27 }, "deprecated": false }, @@ -1997,7 +1980,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 29 + "lineNumber": 28 }, "deprecated": false }, @@ -2010,7 +1993,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 30 + "lineNumber": 29 }, "deprecated": false }, @@ -2023,7 +2006,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 33 + "lineNumber": 32 }, "deprecated": false }, @@ -2039,128 +2022,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 36 - }, - "deprecated": false - } - ] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE", - "type": "Object", - "tags": [], - "label": "[USE_DATA_SERVICE]", - "description": [], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 38 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "\"labs:canvas:useDataService\"" - ], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 39 - }, - "deprecated": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.isActive", - "type": "boolean", - "tags": [], - "label": "isActive", - "description": [], - "signature": [ - "true" - ], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 40 - }, - "deprecated": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.isDisplayed", - "type": "boolean", - "tags": [], - "label": "isDisplayed", - "description": [], - "signature": [ - "true" - ], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 41 - }, - "deprecated": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.environments", - "type": "Array", - "tags": [], - "label": "environments", - "description": [], - "signature": [ - "(\"kibana\" | \"browser\" | \"session\")[]" - ], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 42 - }, - "deprecated": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 43 - }, - "deprecated": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 46 - }, - "deprecated": false - }, - { - "parentPluginId": "presentationUtil", - "id": "def-common.projects.USE_DATA_SERVICE.solutions", - "type": "Array", - "tags": [], - "label": "solutions", - "description": [], - "signature": [ - "\"canvas\"[]" - ], - "source": { - "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 52 + "lineNumber": 35 }, "deprecated": false } @@ -2175,7 +2037,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 54 + "lineNumber": 37 }, "deprecated": false, "children": [ @@ -2191,7 +2053,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 55 + "lineNumber": 38 }, "deprecated": false }, @@ -2207,7 +2069,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 56 + "lineNumber": 39 }, "deprecated": false }, @@ -2223,7 +2085,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 57 + "lineNumber": 40 }, "deprecated": false }, @@ -2239,7 +2101,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 58 + "lineNumber": 41 }, "deprecated": false }, @@ -2252,7 +2114,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 59 + "lineNumber": 42 }, "deprecated": false }, @@ -2265,7 +2127,7 @@ "description": [], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 62 + "lineNumber": 45 }, "deprecated": false }, @@ -2281,7 +2143,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 66 + "lineNumber": 49 }, "deprecated": false } @@ -2302,7 +2164,7 @@ ], "source": { "path": "src/plugins/presentation_util/common/labs.ts", - "lineNumber": 18 + "lineNumber": 17 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 3df30c54e4390b..21f5b89d3a591f 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import presentationUtilObj from './presentation_util.json'; @@ -19,7 +18,7 @@ import presentationUtilObj from './presentation_util.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 125 | 1 | 121 | 3 | +| 116 | 1 | 112 | 3 | ## Client diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 166aeee82153e1..3726d744ea954c 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import remoteClustersObj from './remote_clusters.json'; diff --git a/api_docs/reporting.json b/api_docs/reporting.json index b2529f510bc2ed..47ea0f2f4a0e81 100644 --- a/api_docs/reporting.json +++ b/api_docs/reporting.json @@ -640,7 +640,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 81 + "lineNumber": 79 }, "deprecated": false, "children": [ @@ -656,7 +656,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 99 + "lineNumber": 97 }, "deprecated": false, "children": [ @@ -679,7 +679,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 99 + "lineNumber": 97 }, "deprecated": false, "isRequired": true @@ -716,7 +716,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 110 + "lineNumber": 117 }, "deprecated": false, "children": [ @@ -739,7 +739,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 110 + "lineNumber": 117 }, "deprecated": false, "isRequired": true @@ -756,7 +756,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 110 + "lineNumber": 117 }, "deprecated": false, "isRequired": true @@ -791,7 +791,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 190 + "lineNumber": 200 }, "deprecated": false, "children": [ @@ -813,7 +813,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 190 + "lineNumber": 200 }, "deprecated": false, "isRequired": true @@ -833,7 +833,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/plugin.ts", - "lineNumber": 209 + "lineNumber": 219 }, "deprecated": false, "children": [], @@ -887,7 +887,7 @@ ], "source": { "path": "x-pack/plugins/reporting/public/index.ts", - "lineNumber": 24 + "lineNumber": 20 }, "deprecated": false, "lifecycle": "start", @@ -2171,7 +2171,7 @@ ], "source": { "path": "x-pack/plugins/reporting/server/config/config.ts", - "lineNumber": 57 + "lineNumber": 55 }, "deprecated": false, "children": [ @@ -2187,7 +2187,7 @@ ], "source": { "path": "x-pack/plugins/reporting/server/config/config.ts", - "lineNumber": 58 + "lineNumber": 56 }, "deprecated": false } diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index f349b223ddf97c..f2b0b0b8405588 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import reportingObj from './reporting.json'; @@ -19,7 +18,7 @@ import reportingObj from './reporting.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 133 | 1 | 132 | 19 | +| 132 | 1 | 131 | 18 | ## Client diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 7a7765dfe1584a..60eeae0a0d1f35 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import rollupObj from './rollup.json'; diff --git a/api_docs/rule_registry.json b/api_docs/rule_registry.json index f114f1bf227516..ec570c7a7e8138 100644 --- a/api_docs/rule_registry.json +++ b/api_docs/rule_registry.json @@ -36,7 +36,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 21 + "lineNumber": 23 }, "deprecated": false, "children": [ @@ -52,7 +52,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 22 + "lineNumber": 24 }, "deprecated": false, "children": [ @@ -68,7 +68,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 22 + "lineNumber": 24 }, "deprecated": false, "isRequired": true @@ -89,7 +89,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 29 + "lineNumber": 31 }, "deprecated": false, "children": [ @@ -102,7 +102,7 @@ "description": [], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 29 + "lineNumber": 31 }, "deprecated": false, "children": [ @@ -118,7 +118,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 29 + "lineNumber": 31 }, "deprecated": false } @@ -140,7 +140,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 60 + "lineNumber": 73 }, "deprecated": false, "children": [ @@ -153,7 +153,7 @@ "description": [], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 60 + "lineNumber": 73 }, "deprecated": false, "children": [ @@ -169,7 +169,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 60 + "lineNumber": 73 }, "deprecated": false } @@ -190,7 +190,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 92 + "lineNumber": 105 }, "deprecated": false, "children": [ @@ -203,7 +203,7 @@ "description": [], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 92 + "lineNumber": 105 }, "deprecated": false, "children": [ @@ -219,7 +219,7 @@ ], "source": { "path": "x-pack/plugins/rule_registry/server/rule_data_client/index.ts", - "lineNumber": 92 + "lineNumber": 105 }, "deprecated": false } @@ -251,7 +251,9 @@ }, "; logger: ", "Logger", - "; }) => <TParams extends Record<string, unknown>, TAlertInstanceContext extends { [x: string]: unknown; }, TServices extends { alertWithLifecycle: LifecycleAlertService<TAlertInstanceContext>; }>(type: ", + "; }) => <TParams extends Record<string, unknown>, TAlertInstanceContext extends { [x: string]: unknown; }, TServices extends { alertWithLifecycle: ", + "LifecycleAlertService", + "<TAlertInstanceContext>; }>(type: ", "AlertTypeWithExecutor", "<TParams, TAlertInstanceContext, TServices>) => { executor: (options: ", { @@ -303,7 +305,7 @@ "section": "def-common.ActionVariable", "text": "ActionVariable" }, - "[] | undefined; } | undefined; minimumLicenseRequired: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\"; }" + "[] | undefined; } | undefined; minimumLicenseRequired: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\"; isExportable: boolean; }" ], "source": { "path": "x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type_factory.ts", @@ -412,7 +414,7 @@ "section": "def-common.ActionVariable", "text": "ActionVariable" }, - "[] | undefined; } | undefined; minimumLicenseRequired: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\"; }" + "[] | undefined; } | undefined; minimumLicenseRequired: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\"; isExportable: boolean; }" ], "source": { "path": "x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_factory.ts", @@ -893,7 +895,7 @@ "signature": [ "(input: unknown) => OutputOf<", "Optional", - "<{ readonly \"kibana.rac.alert.producer\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.uuid\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.id\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.start\": { readonly type: \"date\"; }; readonly \"kibana.rac.alert.end\": { readonly type: \"date\"; }; readonly \"kibana.rac.alert.duration.us\": { readonly type: \"long\"; }; readonly \"kibana.rac.alert.severity.level\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.severity.value\": { readonly type: \"long\"; }; readonly \"kibana.rac.alert.status\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.evaluation.threshold\": { readonly type: \"scaled_float\"; readonly scaling_factor: 100; }; readonly \"kibana.rac.alert.evaluation.value\": { readonly type: \"scaled_float\"; readonly scaling_factor: 100; }; readonly tags: { readonly type: \"keyword\"; readonly array: true; readonly required: false; }; readonly '@timestamp': { readonly type: \"date\"; readonly array: false; readonly required: true; }; readonly 'event.kind': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'event.action': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.uuid': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.id': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.name': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.category': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; }, \"tags\" | \"kibana.rac.alert.uuid\" | \"event.kind\" | \"event.action\" | \"rule.uuid\" | \"rule.id\" | \"rule.name\" | \"rule.category\" | \"kibana.rac.alert.producer\" | \"kibana.rac.alert.id\" | \"kibana.rac.alert.start\" | \"kibana.rac.alert.end\" | \"kibana.rac.alert.duration.us\" | \"kibana.rac.alert.severity.level\" | \"kibana.rac.alert.severity.value\" | \"kibana.rac.alert.status\" | \"kibana.rac.alert.evaluation.threshold\" | \"kibana.rac.alert.evaluation.value\">>" + "<{ readonly \"kibana.rac.alert.producer\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.uuid\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.id\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.start\": { readonly type: \"date\"; }; readonly \"kibana.rac.alert.end\": { readonly type: \"date\"; }; readonly \"kibana.rac.alert.duration.us\": { readonly type: \"long\"; }; readonly \"kibana.rac.alert.severity.level\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.severity.value\": { readonly type: \"long\"; }; readonly \"kibana.rac.alert.status\": { readonly type: \"keyword\"; }; readonly \"kibana.rac.alert.evaluation.threshold\": { readonly type: \"scaled_float\"; readonly scaling_factor: 100; }; readonly \"kibana.rac.alert.evaluation.value\": { readonly type: \"scaled_float\"; readonly scaling_factor: 100; }; readonly tags: { readonly type: \"keyword\"; readonly array: true; readonly required: false; }; readonly '@timestamp': { readonly type: \"date\"; readonly array: false; readonly required: true; }; readonly 'event.kind': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'event.action': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.uuid': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.id': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.name': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; readonly 'rule.category': { readonly type: \"keyword\"; readonly array: false; readonly required: false; }; }, \"tags\" | \"event.kind\" | \"event.action\" | \"rule.uuid\" | \"rule.id\" | \"rule.name\" | \"rule.category\" | \"kibana.rac.alert.producer\" | \"kibana.rac.alert.id\" | \"kibana.rac.alert.uuid\" | \"kibana.rac.alert.start\" | \"kibana.rac.alert.end\" | \"kibana.rac.alert.duration.us\" | \"kibana.rac.alert.severity.level\" | \"kibana.rac.alert.severity.value\" | \"kibana.rac.alert.status\" | \"kibana.rac.alert.evaluation.threshold\" | \"kibana.rac.alert.evaluation.value\">>" ], "source": { "path": "x-pack/plugins/rule_registry/common/parse_technical_fields.ts", diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index a0171607e8eebd..6515310c6213e9 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import ruleRegistryObj from './rule_registry.json'; @@ -19,7 +18,7 @@ import ruleRegistryObj from './rule_registry.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 43 | 0 | 43 | 6 | +| 43 | 0 | 43 | 7 | ## Server diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 2b9585f558ad5a..6474253a2ff978 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import runtimeFieldsObj from './runtime_fields.json'; diff --git a/api_docs/saved_objects.json b/api_docs/saved_objects.json index 6af18c749db67c..d7147a92b725db 100644 --- a/api_docs/saved_objects.json +++ b/api_docs/saved_objects.json @@ -23,7 +23,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 103 + "lineNumber": 104 }, "deprecated": false, "children": [ @@ -36,7 +36,7 @@ "description": [], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 107 + "lineNumber": 108 }, "deprecated": false, "children": [ @@ -53,7 +53,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 108 + "lineNumber": 109 }, "deprecated": false, "returnComment": [], @@ -143,7 +143,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 109 + "lineNumber": 110 }, "deprecated": false, "returnComment": [], @@ -231,7 +231,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 110 + "lineNumber": 111 }, "deprecated": false, "returnComment": [], @@ -319,7 +319,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 111 + "lineNumber": 112 }, "deprecated": false, "returnComment": [], @@ -407,7 +407,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 112 + "lineNumber": 113 }, "deprecated": false, "returnComment": [], @@ -495,7 +495,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 113 + "lineNumber": 114 }, "deprecated": false, "returnComment": [], @@ -584,7 +584,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 173 + "lineNumber": 174 }, "deprecated": false, "children": [ @@ -600,7 +600,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 173 + "lineNumber": 174 }, "deprecated": false, "isRequired": true @@ -620,7 +620,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 188 + "lineNumber": 189 }, "deprecated": false, "children": [], @@ -638,7 +638,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 193 + "lineNumber": 194 }, "deprecated": false, "children": [], @@ -656,7 +656,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 198 + "lineNumber": 199 }, "deprecated": false, "children": [], @@ -680,6 +680,20 @@ }, "deprecated": true, "references": [ + { + "plugin": "visualizations", + "link": { + "path": "src/plugins/visualizations/public/saved_visualizations/find_list_items.ts", + "lineNumber": 16 + } + }, + { + "plugin": "visualizations", + "link": { + "path": "src/plugins/visualizations/public/saved_visualizations/find_list_items.ts", + "lineNumber": 35 + } + }, { "plugin": "discover", "link": { @@ -705,21 +719,7 @@ "plugin": "discover", "link": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 88 - } - }, - { - "plugin": "visualizations", - "link": { - "path": "src/plugins/visualizations/public/saved_visualizations/find_list_items.ts", - "lineNumber": 16 - } - }, - { - "plugin": "visualizations", - "link": { - "path": "src/plugins/visualizations/public/saved_visualizations/find_list_items.ts", - "lineNumber": 35 + "lineNumber": 122 } }, { @@ -803,7 +803,7 @@ "plugin": "dashboard", "link": { "path": "src/plugins/dashboard/public/plugin.tsx", - "lineNumber": 127 + "lineNumber": 130 } }, { @@ -817,7 +817,7 @@ "plugin": "dashboard", "link": { "path": "src/plugins/dashboard/public/url_generator.ts", - "lineNumber": 95 + "lineNumber": 101 } }, { @@ -983,7 +983,7 @@ "section": "def-public.SavedObjectsClient", "text": "SavedObjectsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"update\" | \"bulkUpdate\">" + ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"resolve\" | \"update\" | \"bulkUpdate\">" ], "source": { "path": "src/plugins/saved_objects/public/saved_object/saved_object_loader.ts", @@ -1707,7 +1707,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 526 + "lineNumber": 527 }, "deprecated": false, "children": [ @@ -1729,7 +1729,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 526 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -1752,7 +1752,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 526 + "lineNumber": 527 }, "deprecated": false, "isRequired": true @@ -1892,7 +1892,7 @@ "section": "def-public.SavedObjectsClient", "text": "SavedObjectsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"update\" | \"bulkUpdate\">; overlays: ", + ", \"get\" | \"delete\" | \"create\" | \"bulkCreate\" | \"find\" | \"bulkGet\" | \"resolve\" | \"update\" | \"bulkUpdate\">; overlays: ", { "pluginId": "core", "scope": "public", @@ -2116,7 +2116,15 @@ "section": "def-public.SavedObjectsBatchResponse", "text": "SavedObjectsBatchResponse" }, - "<unknown>>; update: <T = unknown>(type: string, id: string, attributes: T, { version, references, upsert }?: ", + "<unknown>>; resolve: <T = unknown>(type: string, id: string) => Promise<", + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.ResolvedSimpleSavedObject", + "text": "ResolvedSimpleSavedObject" + }, + "<T>>; update: <T = unknown>(type: string, id: string, attributes: T, { version, references, upsert }?: ", { "pluginId": "core", "scope": "public", @@ -2569,31 +2577,31 @@ } }, { - "plugin": "discover", + "plugin": "visualizations", "link": { - "path": "src/plugins/discover/public/saved_searches/_saved_search.ts", + "path": "src/plugins/visualizations/public/types.ts", "lineNumber": 9 } }, { - "plugin": "discover", + "plugin": "visualizations", "link": { - "path": "src/plugins/discover/public/saved_searches/_saved_search.ts", - "lineNumber": 61 + "path": "src/plugins/visualizations/public/types.ts", + "lineNumber": 41 } }, { - "plugin": "visualizations", + "plugin": "discover", "link": { - "path": "src/plugins/visualizations/public/types.ts", + "path": "src/plugins/discover/public/saved_searches/_saved_search.ts", "lineNumber": 9 } }, { - "plugin": "visualizations", + "plugin": "discover", "link": { - "path": "src/plugins/visualizations/public/types.ts", - "lineNumber": 41 + "path": "src/plugins/discover/public/saved_searches/_saved_search.ts", + "lineNumber": 61 } }, { @@ -4003,6 +4011,57 @@ ], "returnComment": [] }, + { + "parentPluginId": "savedObjects", + "id": "def-public.SavedObjectMetaData.getSavedObjectSubType", + "type": "Function", + "tags": [], + "label": "getSavedObjectSubType", + "description": [], + "signature": [ + "((savedObject: ", + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.SimpleSavedObject", + "text": "SimpleSavedObject" + }, + "<T>) => string) | undefined" + ], + "source": { + "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", + "lineNumber": 49 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "savedObjects", + "id": "def-public.SavedObjectMetaData.getSavedObjectSubType.$1", + "type": "Object", + "tags": [], + "label": "savedObject", + "description": [], + "signature": [ + { + "pluginId": "core", + "scope": "public", + "docId": "kibCoreSavedObjectsPluginApi", + "section": "def-public.SimpleSavedObject", + "text": "SimpleSavedObject" + }, + "<T>" + ], + "source": { + "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", + "lineNumber": 49 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "savedObjects", "id": "def-public.SavedObjectMetaData.includeFields", @@ -4015,7 +4074,7 @@ ], "source": { "path": "src/plugins/saved_objects/public/finder/saved_object_finder.tsx", - "lineNumber": 49 + "lineNumber": 50 }, "deprecated": false } diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 66579c3e3b0ca7..0e64b52cbe31f4 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import savedObjectsObj from './saved_objects.json'; @@ -19,7 +18,7 @@ import savedObjectsObj from './saved_objects.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 211 | 3 | 197 | 5 | +| 213 | 3 | 199 | 5 | ## Client diff --git a/api_docs/saved_objects_management.json b/api_docs/saved_objects_management.json index 8e8e7850261a34..27257784f5fbfc 100644 --- a/api_docs/saved_objects_management.json +++ b/api_docs/saved_objects_management.json @@ -102,7 +102,7 @@ "label": "refreshOnFinish", "description": [], "signature": [ - "(() => boolean) | undefined" + "(() => { type: string; id: string; }[]) | undefined" ], "source": { "path": "src/plugins/saved_objects_management/public/services/types/action.ts", diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 0ee0660609f14d..884febcea6b3d0 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import savedObjectsManagementObj from './saved_objects_management.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index fe1d90171a2c17..0f176e1617ea2d 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import savedObjectsTaggingObj from './saved_objects_tagging.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 6fe8b4c6d46981..407c9244349aa6 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.json'; diff --git a/api_docs/screenshot_mode.json b/api_docs/screenshot_mode.json index 22b613bf0b04bc..9cd9a2eefce943 100644 --- a/api_docs/screenshot_mode.json +++ b/api_docs/screenshot_mode.json @@ -63,17 +63,17 @@ "objects": [], "setup": { "parentPluginId": "screenshotMode", - "id": "def-public.ScreenshotModePluginSetup", + "id": "def-public.ScreenshotModePluginStart", "type": "Type", "tags": [], - "label": "ScreenshotModePluginSetup", + "label": "ScreenshotModePluginStart", "description": [], "signature": [ "IScreenshotModeService" ], "source": { "path": "src/plugins/screenshot_mode/public/types.ts", - "lineNumber": 17 + "lineNumber": 18 }, "deprecated": false, "lifecycle": "setup", diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index a098e5f296d69d..9f3b076dc25105 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import screenshotModeObj from './screenshot_mode.json'; @@ -19,7 +18,7 @@ import screenshotModeObj from './screenshot_mode.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 21 | 0 | 16 | 1 | +| 22 | 0 | 17 | 1 | ## Client diff --git a/api_docs/security.json b/api_docs/security.json index f7547221cec666..ac0982be3f19e9 100644 --- a/api_docs/security.json +++ b/api_docs/security.json @@ -705,7 +705,7 @@ "description": [], "source": { "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 167 + "lineNumber": 170 }, "deprecated": false, "children": [ @@ -729,7 +729,7 @@ ], "source": { "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 171 + "lineNumber": 174 }, "deprecated": false }, @@ -753,7 +753,7 @@ ], "source": { "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 175 + "lineNumber": 178 }, "deprecated": false } @@ -770,7 +770,7 @@ "description": [], "source": { "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 178 + "lineNumber": 181 }, "deprecated": false, "children": [ @@ -794,7 +794,7 @@ ], "source": { "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 182 + "lineNumber": 185 }, "deprecated": false }, @@ -818,7 +818,25 @@ ], "source": { "path": "x-pack/plugins/security/public/plugin.tsx", - "lineNumber": 186 + "lineNumber": 189 + }, + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-public.SecurityPluginStart.uiApi", + "type": "Object", + "tags": [], + "label": "uiApi", + "description": [ + "\nExposes UI components that will be loaded asynchronously." + ], + "signature": [ + "UiApi" + ], + "source": { + "path": "x-pack/plugins/security/public/plugin.tsx", + "lineNumber": 193 }, "deprecated": false } @@ -1847,7 +1865,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 72 + "lineNumber": 71 }, "deprecated": false, "children": [ @@ -1881,7 +1899,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 76 + "lineNumber": 75 }, "deprecated": true, "references": [ @@ -1931,7 +1949,7 @@ "plugin": "dataEnhanced", "link": { "path": "x-pack/plugins/data_enhanced/server/search/session/session_service.ts", - "lineNumber": 448 + "lineNumber": 514 } }, { @@ -1991,7 +2009,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 80 + "lineNumber": 79 }, "deprecated": true, "references": [ @@ -2073,7 +2091,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 84 + "lineNumber": 83 }, "deprecated": false }, @@ -2097,7 +2115,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 88 + "lineNumber": 87 }, "deprecated": false } @@ -2116,7 +2134,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 94 + "lineNumber": 93 }, "deprecated": false, "children": [ @@ -2140,7 +2158,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 98 + "lineNumber": 97 }, "deprecated": false }, @@ -2164,7 +2182,7 @@ ], "source": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 102 + "lineNumber": 101 }, "deprecated": false } diff --git a/api_docs/security.mdx b/api_docs/security.mdx index e31fa44014c941..f387a764cd7884 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import securityObj from './security.json'; +This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. - - +Contact [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 95 | 0 | 45 | 11 | +| 110 | 0 | 49 | 6 | ## Client diff --git a/api_docs/security_oss.mdx b/api_docs/security_oss.mdx index ada97232ffe846..8d85247ecedf31 100644 --- a/api_docs/security_oss.mdx +++ b/api_docs/security_oss.mdx @@ -8,12 +8,11 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securityOss'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import securityOssObj from './security_oss.json'; +This plugin exposes a limited set of security functionality to OSS plugins. - - +Contact [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/security_solution.json b/api_docs/security_solution.json index 747ef4b4b715b0..06d5dea44b8fa4 100644 --- a/api_docs/security_solution.json +++ b/api_docs/security_solution.json @@ -43,7 +43,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 75 + "lineNumber": 64 }, "deprecated": false, "children": [ @@ -59,7 +59,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 79 + "lineNumber": 68 }, "deprecated": false, "children": [ @@ -82,7 +82,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 79 + "lineNumber": 68 }, "deprecated": false, "isRequired": true @@ -123,7 +123,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 103 + "lineNumber": 89 }, "deprecated": false, "children": [ @@ -150,7 +150,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 103 + "lineNumber": 89 }, "deprecated": false, "isRequired": true @@ -167,7 +167,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 103 + "lineNumber": 89 }, "deprecated": false, "isRequired": true @@ -197,7 +197,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 344 + "lineNumber": 194 }, "deprecated": false, "children": [ @@ -219,7 +219,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 344 + "lineNumber": 194 }, "deprecated": false, "isRequired": true @@ -236,7 +236,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 344 + "lineNumber": 194 }, "deprecated": false, "isRequired": true @@ -256,7 +256,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/plugin.tsx", - "lineNumber": 389 + "lineNumber": 241 }, "deprecated": false, "children": [], @@ -269,7 +269,73 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "securitySolution", + "id": "def-public.TimelineModel", + "type": "Type", + "tags": [], + "label": "TimelineModel", + "description": [], + "signature": [ + "Pick<", + "TGridModel", + ", \"columns\" | \"filters\" | \"title\" | \"id\" | \"sort\" | \"version\" | \"isLoading\" | \"savedObjectId\" | \"dateRange\" | \"deletedEventIds\" | \"excludedRowRendererIds\" | \"expandedDetail\" | \"graphEventId\" | \"kqlQuery\" | \"indexNames\" | \"isSelectAllChecked\" | \"itemsPerPage\" | \"itemsPerPageOptions\" | \"loadingEventIds\" | \"showCheckboxes\" | \"selectedEventIds\"> & { activeTab: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + "; prevActiveTab: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + "; createdBy?: string | undefined; dataProviders: ", + "DataProvider", + "[]; description: string; eqlOptions: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlOptionsSelected", + "text": "EqlOptionsSelected" + }, + "; eventType?: \"all\" | \"custom\" | \"raw\" | \"alert\" | \"eql\" | \"signal\" | undefined; eventIdToNoteIds: Record<string, string[]>; historyIds: string[]; highlightedDropAndProviderId: string; isFavorite: boolean; isLive: boolean; kqlMode: ", + "KqlMode", + "; title: string; timelineType: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + "; templateTimelineId: string | null; templateTimelineVersion: number | null; noteIds: string[]; pinnedEventIds: Record<string, boolean>; pinnedEventsSaveObject: Record<string, ", + "PinnedEvent", + ">; showSaveModal?: boolean | undefined; savedQueryId?: string | null | undefined; show: boolean; status: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + "; updated?: number | undefined; isSaving: boolean; version: string | null; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/public/timelines/store/timeline/model.ts", + "lineNumber": 23 + }, + "deprecated": false, + "initialIsOpen": false + } + ], "objects": [], "setup": { "parentPluginId": "securitySolution", @@ -280,7 +346,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/public/types.ts", - "lineNumber": 69 + "lineNumber": 75 }, "deprecated": false, "children": [ @@ -298,7 +364,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/public/types.ts", - "lineNumber": 70 + "lineNumber": 76 }, "deprecated": false, "returnComment": [], @@ -445,7 +511,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 143 + "lineNumber": 127 }, "deprecated": false, "children": [ @@ -461,7 +527,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 159 + "lineNumber": 143 }, "deprecated": false, "children": [ @@ -484,7 +550,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 159 + "lineNumber": 143 }, "deprecated": false, "isRequired": true @@ -524,7 +590,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 171 + "lineNumber": 155 }, "deprecated": false, "children": [ @@ -557,7 +623,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 171 + "lineNumber": 155 }, "deprecated": false, "isRequired": true @@ -574,7 +640,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 171 + "lineNumber": 155 }, "deprecated": false, "isRequired": true @@ -604,7 +670,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 471 + "lineNumber": 439 }, "deprecated": false, "children": [ @@ -626,7 +692,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 471 + "lineNumber": 439 }, "deprecated": false, "isRequired": true @@ -643,7 +709,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 471 + "lineNumber": 439 }, "deprecated": false, "isRequired": true @@ -663,7 +729,7 @@ ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 546 + "lineNumber": 514 }, "deprecated": false, "children": [], @@ -747,7 +813,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 127 + "lineNumber": 123 }, "deprecated": false, "children": [], @@ -763,7 +829,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 130 + "lineNumber": 126 }, "deprecated": false, "children": [], @@ -773,10 +839,29679 @@ }, "common": { "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] + "functions": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.assertUnreachable", + "type": "Function", + "tags": [], + "label": "assertUnreachable", + "description": [ + "\nUnreachable Assertion helper for scenarios like exhaustive switches.\nFor references see: https://stackoverflow.com/questions/39419170/how-do-i-check-that-a-switch-block-is-exhaustive-in-typescript\nThis \"x\" should _always_ be a type of \"never\" and not change to \"unknown\" or any other type. See above link or the generic\nconcept of exhaustive checks in switch blocks.\n\nOptionally you can avoid the use of this by using early returns and TypeScript will clear your type checking without complaints\nbut there are situations and times where this function might still be needed.\n\nIf you see an error, DO NOT cast \"as never\" such as:\nassertUnreachable(x as never) // BUG IN YOUR CODE NOW AND IT WILL THROW DURING RUNTIME\nIf you see code like that remove it, as that deactivates the intent of this utility.\nIf you need to do that, then you should remove assertUnreachable from your code and\nuse a default at the end of the switch instead." + ], + "signature": [ + "(x: never, message?: string) => never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 48 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.assertUnreachable.$1", + "type": "Uncategorized", + "tags": [], + "label": "x", + "description": [ + "Unreachable field" + ], + "signature": [ + "never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 49 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.assertUnreachable.$2", + "type": "string", + "tags": [], + "label": "message", + "description": [ + "Message of error thrown" + ], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 50 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.stringEnum", + "type": "Function", + "tags": [], + "label": "stringEnum", + "description": [], + "signature": [ + "<T>(enumObj: T, enumName?: string) => ", + "Type", + "<T[keyof T], string, unknown>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 20 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.stringEnum.$1", + "type": "Uncategorized", + "tags": [], + "label": "enumObj", + "description": [], + "signature": [ + "T" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 20 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.stringEnum.$2", + "type": "string", + "tags": [], + "label": "enumName", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 20 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.unionWithNullType", + "type": "Function", + "tags": [], + "label": "unionWithNullType", + "description": [], + "signature": [ + "<T extends ", + "Mixed", + ">(type: T) => ", + "UnionC", + "<[T, ", + "NullC", + "]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 17 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.unionWithNullType.$1", + "type": "Uncategorized", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "T" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 17 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps", + "type": "Interface", + "tags": [], + "label": "ActionProps", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.ariaRowindex", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.action", + "type": "CompoundType", + "tags": [], + "label": "action", + "description": [], + "signature": [ + "((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.Component<Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">, any, any>) | ((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => JSX.Element) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.Component<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ", any, any>) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => JSX.Element) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.width", + "type": "number", + "tags": [], + "label": "width", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.columnId", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.columnValues", + "type": "string", + "tags": [], + "label": "columnValues", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.checked", + "type": "boolean", + "tags": [], + "label": "checked", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.onRowSelected", + "type": "Function", + "tags": [], + "label": "onRowSelected", + "description": [], + "signature": [ + "({ eventIds, isSelected, }: { eventIds: string[]; isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 23 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ eventIds: string[]; isSelected: boolean; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 80 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.eventId", + "type": "string", + "tags": [], + "label": "eventId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.loadingEventIds", + "type": "Object", + "tags": [], + "label": "loadingEventIds", + "description": [], + "signature": [ + "readonly string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.onEventDetailsPanelOpened", + "type": "Function", + "tags": [], + "label": "onEventDetailsPanelOpened", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.showCheckboxes", + "type": "boolean", + "tags": [], + "label": "showCheckboxes", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.ecsData", + "type": "Object", + "tags": [], + "label": "ecsData", + "description": [], + "signature": [ + "Ecs" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.index", + "type": "number", + "tags": [], + "label": "index", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.eventIdToNoteIds", + "type": "Object", + "tags": [], + "label": "eventIdToNoteIds", + "description": [], + "signature": [ + "Readonly<Record<string, string[]>> | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.isEventPinned", + "type": "CompoundType", + "tags": [], + "label": "isEventPinned", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.isEventViewer", + "type": "CompoundType", + "tags": [], + "label": "isEventViewer", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.rowIndex", + "type": "number", + "tags": [], + "label": "rowIndex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.refetch", + "type": "Function", + "tags": [], + "label": "refetch", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.onRuleChange", + "type": "Function", + "tags": [], + "label": "onRuleChange", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.showNotes", + "type": "CompoundType", + "tags": [], + "label": "showNotes", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.tabType", + "type": "CompoundType", + "tags": [], + "label": "tabType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.timelineId", + "type": "string", + "tags": [], + "label": "timelineId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ActionProps.toggleShowNotes", + "type": "Function", + "tags": [], + "label": "toggleShowNotes", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 40 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AggregationRequest", + "type": "Interface", + "tags": [], + "label": "AggregationRequest", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AggregationRequest.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AlertsGroupData", + "type": "Interface", + "tags": [], + "label": "AlertsGroupData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/alerts/index.ts", + "lineNumber": 10 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AlertsGroupData.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/alerts/index.ts", + "lineNumber": 11 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AlertsGroupData.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/alerts/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AlertsGroupData.alerts", + "type": "Object", + "tags": [], + "label": "alerts", + "description": [], + "signature": [ + "{ buckets: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HistogramBucket", + "text": "HistogramBucket" + }, + "[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/alerts/index.ts", + "lineNumber": 13 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomaliesActionGroupData", + "type": "Interface", + "tags": [], + "label": "AnomaliesActionGroupData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomaliesActionGroupData.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomaliesActionGroupData.anomalies", + "type": "Object", + "tags": [], + "label": "anomalies", + "description": [], + "signature": [ + "{ bucket: AnomaliesOverTimeHistogramData[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomaliesActionGroupData.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 21 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomalyHit", + "type": "Interface", + "tags": [], + "label": "AnomalyHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AnomalyHit", + "text": "AnomalyHit" + }, + " extends ", + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 28 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomalyHit.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomalyHit._source", + "type": "Object", + "tags": [], + "label": "_source", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AnomalySource", + "text": "AnomalySource" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomalyHit.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + "{ [agg: string]: any; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 31 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomalySource", + "type": "Interface", + "tags": [], + "label": "AnomalySource", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AnomalySource.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/anomalies/index.ts", + "lineNumber": 25 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationBucket", + "type": "Interface", + "tags": [], + "label": "AuthenticationBucket", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 68 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationBucket.key", + "type": "Object", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "{ user_uid: string; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationBucket.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 72 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationBucket.failures", + "type": "Object", + "tags": [], + "label": "failures", + "description": [], + "signature": [ + "{ doc_count: number; value?: number | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 73 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationBucket.successes", + "type": "Object", + "tags": [], + "label": "successes", + "description": [], + "signature": [ + "{ doc_count: number; value?: number | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 78 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationBucket.authentication", + "type": "Object", + "tags": [], + "label": "authentication", + "description": [], + "signature": [ + "{ hits: { total: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TotalHit", + "text": "TotalHit" + }, + "; hits: ArrayLike<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationHit", + "text": "AuthenticationHit" + }, + ">; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 83 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit", + "type": "Interface", + "tags": [], + "label": "AuthenticationHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationHit", + "text": "AuthenticationHit" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hit", + "text": "Hit" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 55 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit._source", + "type": "Object", + "tags": [], + "label": "_source", + "description": [], + "signature": [ + "{ '@timestamp': string; lastSuccess?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.LastSourceHost", + "text": "LastSourceHost" + }, + " | undefined; lastFailure?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.LastSourceHost", + "text": "LastSourceHost" + }, + " | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 56 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit.user", + "type": "string", + "tags": [], + "label": "user", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 61 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit.failures", + "type": "number", + "tags": [], + "label": "failures", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 62 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit.successes", + "type": "number", + "tags": [], + "label": "successes", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 63 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit.cursor", + "type": "string", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 64 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationHit.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "React.ReactText[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 65 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem", + "type": "Interface", + "tags": [], + "label": "AuthenticationItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 40 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem._id", + "type": "string", + "tags": [], + "label": "_id", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem.failures", + "type": "number", + "tags": [], + "label": "failures", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem.successes", + "type": "number", + "tags": [], + "label": "successes", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "UserEcs" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem.lastSuccess", + "type": "CompoundType", + "tags": [], + "label": "lastSuccess", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.LastSourceHost", + "text": "LastSourceHost" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationItem.lastFailure", + "type": "CompoundType", + "tags": [], + "label": "lastFailure", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.LastSourceHost", + "text": "LastSourceHost" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 46 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsActionGroupData", + "type": "Interface", + "tags": [], + "label": "AuthenticationsActionGroupData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsActionGroupData.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsActionGroupData.events", + "type": "Object", + "tags": [], + "label": "events", + "description": [], + "signature": [ + "{ bucket: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationsOverTimeHistogramData", + "text": "AuthenticationsOverTimeHistogramData" + }, + "[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsActionGroupData.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 19 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsEdges", + "type": "Interface", + "tags": [], + "label": "AuthenticationsEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationItem", + "text": "AuthenticationItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 37 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsOverTimeHistogramData", + "type": "Interface", + "tags": [], + "label": "AuthenticationsOverTimeHistogramData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 8 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsOverTimeHistogramData.key_as_string", + "type": "string", + "tags": [], + "label": "key_as_string", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 9 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsOverTimeHistogramData.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 10 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AuthenticationsOverTimeHistogramData.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/authentications/index.ts", + "lineNumber": 11 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystem", + "type": "Interface", + "tags": [], + "label": "AutonomousSystem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystem.number", + "type": "CompoundType", + "tags": [], + "label": "number", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystem.organization", + "type": "CompoundType", + "tags": [], + "label": "organization", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AutonomousSystemOrganization", + "text": "AutonomousSystemOrganization" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 38 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemHit", + "type": "Interface", + "tags": [], + "label": "AutonomousSystemHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AutonomousSystemHit", + "text": "AutonomousSystemHit" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 73 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemHit.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 74 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemHit.top_as", + "type": "Object", + "tags": [], + "label": "top_as", + "description": [], + "signature": [ + "{ hits: { total: number | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TotalValue", + "text": "TotalValue" + }, + "; max_score: number | null; hits: { _source: T; sort?: [number] | undefined; _index?: string | undefined; _type?: string | undefined; _id?: string | undefined; _score?: number | null | undefined; }[]; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 75 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemItem", + "type": "Interface", + "tags": [], + "label": "AutonomousSystemItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 59 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemItem.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemItem.number", + "type": "CompoundType", + "tags": [], + "label": "number", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 61 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemOrganization", + "type": "Interface", + "tags": [], + "label": "AutonomousSystemOrganization", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 41 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AutonomousSystemOrganization.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 42 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField", + "type": "Interface", + "tags": [], + "label": "BrowserField", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 63 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.aggregatable", + "type": "boolean", + "tags": [], + "label": "aggregatable", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 64 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.category", + "type": "string", + "tags": [], + "label": "category", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 66 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [], + "signature": [ + "string | number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.fields", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "{ readonly [x: string]: Partial<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 68 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.format", + "type": "string", + "tags": [], + "label": "format", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.indexes", + "type": "Array", + "tags": [], + "label": "indexes", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 70 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 71 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.searchable", + "type": "boolean", + "tags": [], + "label": "searchable", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 72 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 73 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserField.subType", + "type": "Object", + "tags": [], + "label": "subType", + "description": [], + "signature": [ + "{ [key: string]: unknown; nested?: { path: string; } | undefined; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 74 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BulkGetInput", + "type": "Interface", + "tags": [], + "label": "BulkGetInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 429 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.BulkGetInput.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 430 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BulkGetInput.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 431 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput", + "type": "Interface", + "tags": [], + "label": "ColumnHeaderInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 80 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.aggregatable", + "type": "CompoundType", + "tags": [], + "label": "aggregatable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 81 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.category", + "type": "CompoundType", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 82 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.columnHeaderType", + "type": "CompoundType", + "tags": [], + "label": "columnHeaderType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 84 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 85 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.indexes", + "type": "CompoundType", + "tags": [], + "label": "indexes", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 86 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 87 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 88 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.placeholder", + "type": "CompoundType", + "tags": [], + "label": "placeholder", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 89 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.searchable", + "type": "CompoundType", + "tags": [], + "label": "searchable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 90 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderInput.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 91 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult", + "type": "Interface", + "tags": [], + "label": "ColumnHeaderResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 594 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.aggregatable", + "type": "CompoundType", + "tags": [], + "label": "aggregatable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 595 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.category", + "type": "CompoundType", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 596 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.columnHeaderType", + "type": "CompoundType", + "tags": [], + "label": "columnHeaderType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 597 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 598 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 599 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.indexes", + "type": "CompoundType", + "tags": [], + "label": "indexes", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 600 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 601 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 602 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.placeholder", + "type": "CompoundType", + "tags": [], + "label": "placeholder", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 603 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.searchable", + "type": "CompoundType", + "tags": [], + "label": "searchable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 604 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderResult.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 605 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnRenderer", + "type": "Interface", + "tags": [], + "label": "ColumnRenderer", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnRenderer.isInstance", + "type": "Function", + "tags": [], + "label": "isInstance", + "description": [], + "signature": [ + "(columnName: string, data: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.columnName", + "type": "string", + "tags": [], + "label": "columnName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 36 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnRenderer.renderColumn", + "type": "Function", + "tags": [], + "label": "renderColumn", + "description": [], + "signature": [ + "({ columnName, eventId, field, timelineId, truncate, values, linkValues, }: { columnName: string; eventId: string; field: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "; timelineId: string; truncate?: boolean | undefined; values: string[] | null | undefined; linkValues?: string[] | null | undefined; }) => React.ReactNode" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ columnName: string; eventId: string; field: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "; timelineId: string; truncate?: boolean | undefined; values: string[] | null | undefined; linkValues?: string[] | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 37 + }, + "deprecated": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.CursorType", + "type": "Interface", + "tags": [], + "label": "CursorType", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.CursorType.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.CursorType.tiebreaker", + "type": "CompoundType", + "tags": [], + "label": "tiebreaker", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 18 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider", + "type": "Interface", + "tags": [], + "label": "DataProvider", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 32 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "Uniquely identifies a data provider" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "Human readable" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [ + "\nWhen `false`, a data provider is temporarily disabled, but not removed from\nthe timeline. default: `true`" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.excluded", + "type": "boolean", + "tags": [], + "label": "excluded", + "description": [ + "\nWhen `true`, a data provider is excluding the match, but not removed from\nthe timeline. default: `false`" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.kqlQuery", + "type": "string", + "tags": [], + "label": "kqlQuery", + "description": [ + "\nReturns the KQL query who have been added by user" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.queryMatch", + "type": "Object", + "tags": [], + "label": "queryMatch", + "description": [ + "\nReturns a query properties that, when executed, returns the data for this provider" + ], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.QueryMatch", + "text": "QueryMatch" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.and", + "type": "Array", + "tags": [], + "label": "and", + "description": [ + "\nAdditional query clauses that are ANDed with this query to narrow results" + ], + "signature": [ + "Pick<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProvider", + "text": "DataProvider" + }, + ", \"type\" | \"enabled\" | \"id\" | \"name\" | \"excluded\" | \"kqlQuery\" | \"queryMatch\">[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvider.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [ + "\nReturns a DataProviderType" + ], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 62 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput", + "type": "Interface", + "tags": [], + "label": "DataProviderInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 106 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 107 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 108 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.enabled", + "type": "CompoundType", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 109 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.excluded", + "type": "CompoundType", + "tags": [], + "label": "excluded", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 110 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 111 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.queryMatch", + "type": "CompoundType", + "tags": [], + "label": "queryMatch", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.QueryMatchInput", + "text": "QueryMatchInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 112 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.and", + "type": "CompoundType", + "tags": [], + "label": "and", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderInput", + "text": "DataProviderInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 113 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderInput.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 114 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult", + "type": "Interface", + "tags": [], + "label": "DataProviderResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 608 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 609 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 610 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.enabled", + "type": "CompoundType", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 611 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.excluded", + "type": "CompoundType", + "tags": [], + "label": "excluded", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 612 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 613 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.queryMatch", + "type": "CompoundType", + "tags": [], + "label": "queryMatch", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.QueryMatchResult", + "text": "QueryMatchResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 614 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 615 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderResult.and", + "type": "CompoundType", + "tags": [], + "label": "and", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderResult", + "text": "DataProviderResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 616 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DateRangePickerInput", + "type": "Interface", + "tags": [], + "label": "DateRangePickerInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 163 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DateRangePickerInput.start", + "type": "CompoundType", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 164 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DateRangePickerInput.end", + "type": "CompoundType", + "tags": [], + "label": "end", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 165 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DateRangePickerResult", + "type": "Interface", + "tags": [], + "label": "DateRangePickerResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 627 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DateRangePickerResult.start", + "type": "Any", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 629 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DateRangePickerResult.end", + "type": "Any", + "tags": [], + "label": "end", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 631 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DescriptionList", + "type": "Interface", + "tags": [], + "label": "DescriptionList", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DescriptionList.title", + "type": "CompoundType", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | number | boolean | {} | React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | React.ReactNodeArray | React.ReactPortal" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DescriptionList.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | number | boolean | {} | React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | React.ReactNodeArray | React.ReactPortal" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/utility_types.ts", + "lineNumber": 14 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramGroupData", + "type": "Interface", + "tags": [], + "label": "DnsHistogramGroupData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramGroupData.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramGroupData.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramGroupData.key_as_string", + "type": "string", + "tags": [], + "label": "key_as_string", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramGroupData.histogram", + "type": "Object", + "tags": [], + "label": "histogram", + "description": [], + "signature": [ + "DnsHistogramBucket" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 25 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramSubBucket", + "type": "Interface", + "tags": [], + "label": "DnsHistogramSubBucket", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 8 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramSubBucket.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 9 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramSubBucket.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 10 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DnsHistogramSubBucket.orderAgg", + "type": "Object", + "tags": [], + "label": "orderAgg", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/dns/index.ts", + "lineNumber": 11 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DocValueFieldsInput", + "type": "Interface", + "tags": [], + "label": "DocValueFieldsInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 208 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DocValueFieldsInput.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 209 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DocValueFieldsInput.format", + "type": "string", + "tags": [], + "label": "format", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 211 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EndpointFields", + "type": "Interface", + "tags": [], + "label": "EndpointFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EndpointFields.endpointPolicy", + "type": "CompoundType", + "tags": [], + "label": "endpointPolicy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EndpointFields.sensorVersion", + "type": "CompoundType", + "tags": [], + "label": "sensorVersion", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EndpointFields.policyStatus", + "type": "CompoundType", + "tags": [], + "label": "policyStatus", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostPolicyResponseActionStatus", + "text": "HostPolicyResponseActionStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EndpointFields.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsData", + "type": "Interface", + "tags": [], + "label": "EqlOptionsData", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 32 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsData.keywordFields", + "type": "Array", + "tags": [], + "label": "keywordFields", + "description": [], + "signature": [ + "EuiComboBoxOptionOption", + "<string | number | string[] | undefined>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsData.dateFields", + "type": "Array", + "tags": [], + "label": "dateFields", + "description": [], + "signature": [ + "EuiComboBoxOptionOption", + "<string | number | string[] | undefined>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsData.nonDateFields", + "type": "Array", + "tags": [], + "label": "nonDateFields", + "description": [], + "signature": [ + "EuiComboBoxOptionOption", + "<string | number | string[] | undefined>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 35 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsInput", + "type": "Interface", + "tags": [], + "label": "EqlOptionsInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 117 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsInput.eventCategoryField", + "type": "CompoundType", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 118 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsInput.tiebreakerField", + "type": "CompoundType", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 119 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsInput.timestampField", + "type": "CompoundType", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 120 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsInput.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 121 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsInput.size", + "type": "CompoundType", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 122 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsResult", + "type": "Interface", + "tags": [], + "label": "EqlOptionsResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 634 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsResult.eventCategoryField", + "type": "CompoundType", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 635 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsResult.tiebreakerField", + "type": "CompoundType", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 636 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsResult.timestampField", + "type": "CompoundType", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 637 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsResult.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 638 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsResult.size", + "type": "Any", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 640 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsSelected", + "type": "Interface", + "tags": [], + "label": "EqlOptionsSelected", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsSelected.eventCategoryField", + "type": "string", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsSelected.tiebreakerField", + "type": "string", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsSelected.timestampField", + "type": "string", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsSelected.query", + "type": "string", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EqlOptionsSelected.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 43 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventHit", + "type": "Interface", + "tags": [], + "label": "EventHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EventHit", + "text": "EventHit" + }, + " extends ", + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 33 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EventHit.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventHit._source", + "type": "Object", + "tags": [], + "label": "_source", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EventSource", + "text": "EventSource" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventHit.fields", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Fields", + "text": "Fields" + }, + "<unknown[]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventHit.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + "{ [agg: string]: any; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 37 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventsActionGroupData", + "type": "Interface", + "tags": [], + "label": "EventsActionGroupData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EventsActionGroupData.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventsActionGroupData.events", + "type": "Object", + "tags": [], + "label": "events", + "description": [], + "signature": [ + "{ bucket: EventsMatrixHistogramData[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventsActionGroupData.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EventSource", + "type": "Interface", + "tags": [], + "label": "EventSource", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EventSource.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 18 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Explanation", + "type": "Interface", + "tags": [], + "label": "Explanation", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.Explanation.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Explanation.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Explanation.details", + "type": "Array", + "tags": [], + "label": "details", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Explanation", + "text": "Explanation" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 40 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportedNotes", + "type": "Interface", + "tags": [], + "label": "ExportedNotes", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 414 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportedNotes.eventNotes", + "type": "Array", + "tags": [], + "label": "eventNotes", + "description": [], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 415 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportedNotes.globalNotes", + "type": "Array", + "tags": [], + "label": "globalNotes", + "description": [], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 416 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportTimelineNotFoundError", + "type": "Interface", + "tags": [], + "label": "ExportTimelineNotFoundError", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 424 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportTimelineNotFoundError.statusCode", + "type": "number", + "tags": [], + "label": "statusCode", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 425 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportTimelineNotFoundError.message", + "type": "string", + "tags": [], + "label": "message", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 426 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Fields", + "type": "Interface", + "tags": [], + "label": "Fields", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Fields", + "text": "Fields" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.Fields.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/events/index.ts", + "lineNumber": 30 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput", + "type": "Interface", + "tags": [], + "label": "FilterMetaTimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 125 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.alias", + "type": "CompoundType", + "tags": [], + "label": "alias", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 126 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.controlledBy", + "type": "CompoundType", + "tags": [], + "label": "controlledBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 127 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.disabled", + "type": "CompoundType", + "tags": [], + "label": "disabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 128 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 129 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.formattedValue", + "type": "CompoundType", + "tags": [], + "label": "formattedValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 130 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.index", + "type": "CompoundType", + "tags": [], + "label": "index", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 131 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.key", + "type": "CompoundType", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 132 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.negate", + "type": "CompoundType", + "tags": [], + "label": "negate", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 133 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.params", + "type": "CompoundType", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 134 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 135 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineInput.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 136 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult", + "type": "Interface", + "tags": [], + "label": "FilterMetaTimelineResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 653 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.alias", + "type": "CompoundType", + "tags": [], + "label": "alias", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 654 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.controlledBy", + "type": "CompoundType", + "tags": [], + "label": "controlledBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 655 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.disabled", + "type": "CompoundType", + "tags": [], + "label": "disabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 656 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 657 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.formattedValue", + "type": "CompoundType", + "tags": [], + "label": "formattedValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 658 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.index", + "type": "CompoundType", + "tags": [], + "label": "index", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 659 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.key", + "type": "CompoundType", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 660 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.negate", + "type": "CompoundType", + "tags": [], + "label": "negate", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 661 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.params", + "type": "CompoundType", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 662 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 663 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterMetaTimelineResult.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 664 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput", + "type": "Interface", + "tags": [], + "label": "FilterTimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 139 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.exists", + "type": "CompoundType", + "tags": [], + "label": "exists", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 140 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.meta", + "type": "CompoundType", + "tags": [], + "label": "meta", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FilterMetaTimelineInput", + "text": "FilterMetaTimelineInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 141 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.match_all", + "type": "CompoundType", + "tags": [], + "label": "match_all", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 142 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.missing", + "type": "CompoundType", + "tags": [], + "label": "missing", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 143 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 144 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.range", + "type": "CompoundType", + "tags": [], + "label": "range", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 145 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineInput.script", + "type": "CompoundType", + "tags": [], + "label": "script", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 146 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult", + "type": "Interface", + "tags": [], + "label": "FilterTimelineResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 643 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.exists", + "type": "CompoundType", + "tags": [], + "label": "exists", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 644 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.meta", + "type": "CompoundType", + "tags": [], + "label": "meta", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FilterMetaTimelineResult", + "text": "FilterMetaTimelineResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 645 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.match_all", + "type": "CompoundType", + "tags": [], + "label": "match_all", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 646 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.missing", + "type": "CompoundType", + "tags": [], + "label": "missing", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 647 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 648 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.range", + "type": "CompoundType", + "tags": [], + "label": "range", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 649 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FilterTimelineResult.script", + "type": "CompoundType", + "tags": [], + "label": "script", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 650 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GenericBuckets", + "type": "Interface", + "tags": [], + "label": "GenericBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 70 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.GenericBuckets.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 71 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GenericBuckets.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 72 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GeoItem", + "type": "Interface", + "tags": [], + "label": "GeoItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 47 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.GeoItem.geo", + "type": "CompoundType", + "tags": [], + "label": "geo", + "description": [], + "signature": [ + "GeoEcs", + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GeoItem.flowTarget", + "type": "CompoundType", + "tags": [], + "label": "flowTarget", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTargetSourceDest", + "text": "FlowTargetSourceDest" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 49 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables", + "type": "Interface", + "tags": [], + "label": "GetAllTimelineVariables", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 724 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoTimeline", + "text": "PageInfoTimeline" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 725 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables.search", + "type": "CompoundType", + "tags": [], + "label": "search", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 726 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortTimeline", + "text": "SortTimeline" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 727 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables.onlyUserFavorite", + "type": "CompoundType", + "tags": [], + "label": "onlyUserFavorite", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 728 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 729 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetAllTimelineVariables.status", + "type": "CompoundType", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 730 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps", + "type": "Interface", + "tags": [], + "label": "HeaderActionProps", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 43 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.width", + "type": "number", + "tags": [], + "label": "width", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.browserFields", + "type": "Object", + "tags": [], + "label": "browserFields", + "description": [], + "signature": [ + "{ readonly [x: string]: Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.columnHeaders", + "type": "Array", + "tags": [], + "label": "columnHeaders", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.isEventViewer", + "type": "CompoundType", + "tags": [], + "label": "isEventViewer", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.isSelectAllChecked", + "type": "boolean", + "tags": [], + "label": "isSelectAllChecked", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.onSelectAll", + "type": "Function", + "tags": [], + "label": "onSelectAll", + "description": [], + "signature": [ + "({ isSelected }: { isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 49 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ isSelected: boolean; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 49 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.showEventsSelect", + "type": "boolean", + "tags": [], + "label": "showEventsSelect", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.showSelectAllCheckbox", + "type": "boolean", + "tags": [], + "label": "showSelectAllCheckbox", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortColumnTimeline", + "text": "SortColumnTimeline" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.tabType", + "type": "Enum", + "tags": [], + "label": "tabType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderActionProps.timelineId", + "type": "string", + "tags": [], + "label": "timelineId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 54 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HistogramBucket", + "type": "Interface", + "tags": [], + "label": "HistogramBucket", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/common/index.ts", + "lineNumber": 8 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HistogramBucket.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/common/index.ts", + "lineNumber": 9 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HistogramBucket.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/common/index.ts", + "lineNumber": 10 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Hit", + "type": "Interface", + "tags": [], + "label": "Hit", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 55 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.Hit._index", + "type": "string", + "tags": [], + "label": "_index", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 56 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Hit._type", + "type": "string", + "tags": [], + "label": "_type", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Hit._id", + "type": "string", + "tags": [], + "label": "_id", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Hit._score", + "type": "CompoundType", + "tags": [], + "label": "_score", + "description": [], + "signature": [ + "number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 59 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Hits", + "type": "Interface", + "tags": [], + "label": "Hits", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hits", + "text": "Hits" + }, + "<T, U>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 62 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.Hits.hits", + "type": "Object", + "tags": [], + "label": "hits", + "description": [], + "signature": [ + "{ total: T; max_score: number | null; hits: U[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 63 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsData", + "type": "Interface", + "tags": [], + "label": "HostAggEsData", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAggEsData", + "text": "HostAggEsData" + }, + " extends ", + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 106 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsData.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 107 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsData.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAggEsItem", + "text": "HostAggEsItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 108 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem", + "type": "Interface", + "tags": [], + "label": "HostAggEsItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 74 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.cloud_instance_id", + "type": "Object", + "tags": [], + "label": "cloud_instance_id", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 75 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.cloud_machine_type", + "type": "Object", + "tags": [], + "label": "cloud_machine_type", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 76 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.cloud_provider", + "type": "Object", + "tags": [], + "label": "cloud_provider", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 77 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.cloud_region", + "type": "Object", + "tags": [], + "label": "cloud_region", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 78 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.endpoint", + "type": "Object", + "tags": [], + "label": "endpoint", + "description": [], + "signature": [ + "{ id: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + "; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 79 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_architecture", + "type": "Object", + "tags": [], + "label": "host_architecture", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 82 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_id", + "type": "Object", + "tags": [], + "label": "host_id", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_ip", + "type": "Object", + "tags": [], + "label": "host_ip", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 84 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_mac", + "type": "Object", + "tags": [], + "label": "host_mac", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 85 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_name", + "type": "Object", + "tags": [], + "label": "host_name", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 86 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_os_name", + "type": "Object", + "tags": [], + "label": "host_os_name", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 87 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_os_version", + "type": "Object", + "tags": [], + "label": "host_os_version", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 88 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.host_type", + "type": "Object", + "tags": [], + "label": "host_type", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBuckets", + "text": "HostBuckets" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 89 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 90 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAggEsItem.os", + "type": "Object", + "tags": [], + "label": "os", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostOsHitsItem", + "text": "HostOsHitsItem" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 91 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsRequestOptions", + "type": "Interface", + "tags": [], + "label": "HostAuthenticationsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAuthenticationsRequestOptions", + "text": "HostAuthenticationsRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 31 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsRequestOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 32 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostAuthenticationsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAuthenticationsStrategyResponse", + "text": "HostAuthenticationsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationsEdges", + "text": "AuthenticationsEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostAuthenticationsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostBucketItem", + "type": "Interface", + "tags": [], + "label": "HostBucketItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 49 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostBucketItem.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostBucketItem.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostBucketItem.timestamp", + "type": "Object", + "tags": [], + "label": "timestamp", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostValue", + "text": "HostValue" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 52 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostBuckets", + "type": "Interface", + "tags": [], + "label": "HostBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 55 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostBuckets.buckets", + "type": "Array", + "tags": [], + "label": "buckets", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostBucketItem", + "text": "HostBucketItem" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 56 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsRequestOptions", + "type": "Interface", + "tags": [], + "label": "HostDetailsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostDetailsRequestOptions", + "text": "HostDetailsRequestOptions" + }, + " extends Partial<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsFields", + "text": "HostsFields" + }, + ">>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 20 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsRequestOptions.hostName", + "type": "string", + "tags": [], + "label": "hostName", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsRequestOptions.skip", + "type": "CompoundType", + "tags": [], + "label": "skip", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsRequestOptions.timerange", + "type": "Object", + "tags": [], + "label": "timerange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimerangeInput", + "text": "TimerangeInput" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsRequestOptions.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 24 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostDetailsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostDetailsStrategyResponse", + "text": "HostDetailsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 15 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsStrategyResponse.hostDetails", + "type": "Object", + "tags": [], + "label": "hostDetails", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostItem", + "text": "HostItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostDetailsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/details/index.ts", + "lineNumber": 17 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostEsData", + "type": "Interface", + "tags": [], + "label": "HostEsData", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostEsData", + "text": "HostEsData" + }, + " extends ", + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 94 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostEsData.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 95 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostEsData.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + "{ host_count: { value: number; }; host_data: { buckets: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAggEsItem", + "text": "HostAggEsItem" + }, + "[]; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 96 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenRequestOptions", + "type": "Interface", + "tags": [], + "label": "HostFirstLastSeenRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostFirstLastSeenRequestOptions", + "text": "HostFirstLastSeenRequestOptions" + }, + " extends Partial<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsFields", + "text": "HostsFields" + }, + ">>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenRequestOptions.hostName", + "type": "string", + "tags": [], + "label": "hostName", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenRequestOptions.order", + "type": "Enum", + "tags": [], + "label": "order", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostFirstLastSeenStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostFirstLastSeenStrategyResponse", + "text": "HostFirstLastSeenStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenStrategyResponse.firstSeen", + "type": "CompoundType", + "tags": [], + "label": "firstSeen", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostFirstLastSeenStrategyResponse.lastSeen", + "type": "CompoundType", + "tags": [], + "label": "lastSeen", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/first_last_seen/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostHit", + "type": "Interface", + "tags": [], + "label": "HostHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostHit", + "text": "HostHit" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hit", + "text": "Hit" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 111 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostHit._source", + "type": "Object", + "tags": [], + "label": "_source", + "description": [], + "signature": [ + "{ '@timestamp'?: string | undefined; host: ", + "HostEcs", + "; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 112 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostHit.cursor", + "type": "string", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 116 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostHit.firstSeen", + "type": "string", + "tags": [], + "label": "firstSeen", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 117 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostHit.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "React.ReactText[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 118 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem", + "type": "Interface", + "tags": [], + "label": "HostItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem.agent", + "type": "CompoundType", + "tags": [], + "label": "agent", + "description": [], + "signature": [ + "AgentFields | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem.cloud", + "type": "CompoundType", + "tags": [], + "label": "cloud", + "description": [], + "signature": [ + "CloudEcs", + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem.endpoint", + "type": "CompoundType", + "tags": [], + "label": "endpoint", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EndpointFields", + "text": "EndpointFields" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem.host", + "type": "CompoundType", + "tags": [], + "label": "host", + "description": [], + "signature": [ + "HostEcs", + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostItem.lastSeen", + "type": "CompoundType", + "tags": [], + "label": "lastSeen", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostOsHitsItem", + "type": "Interface", + "tags": [], + "label": "HostOsHitsItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 59 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostOsHitsItem.hits", + "type": "Object", + "tags": [], + "label": "hits", + "description": [], + "signature": [ + "{ total: number | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TotalValue", + "text": "TotalValue" + }, + "; max_score: number | null; hits: { _source: { host: { os: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Maybe", + "text": "Maybe" + }, + "<", + "OsEcs", + ">; }; }; sort?: [number] | undefined; _index?: string | undefined; _type?: string | undefined; _id?: string | undefined; _score?: number | null | undefined; }[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 60 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsEdges", + "type": "Interface", + "tags": [], + "label": "HostsEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostItem", + "text": "HostItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsHistogramCount", + "type": "Interface", + "tags": [], + "label": "HostsKpiAuthenticationsHistogramCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsHistogramCount.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsHistogramCount.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostsKpiAuthenticationsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiAuthenticationsStrategyResponse", + "text": "HostsKpiAuthenticationsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsStrategyResponse.authenticationsSuccess", + "type": "CompoundType", + "tags": [], + "label": "authenticationsSuccess", + "description": [], + "signature": [ + "number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsStrategyResponse.authenticationsSuccessHistogram", + "type": "CompoundType", + "tags": [], + "label": "authenticationsSuccessHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHistogramData", + "text": "HostsKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsStrategyResponse.authenticationsFailure", + "type": "CompoundType", + "tags": [], + "label": "authenticationsFailure", + "description": [], + "signature": [ + "number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsStrategyResponse.authenticationsFailureHistogram", + "type": "CompoundType", + "tags": [], + "label": "authenticationsFailureHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHistogramData", + "text": "HostsKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiGeneralHistogramCount", + "type": "Interface", + "tags": [], + "label": "HostsKpiGeneralHistogramCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 22 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiGeneralHistogramCount.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 23 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogram", + "type": "Interface", + "tags": [], + "label": "HostsKpiHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHistogram", + "text": "HostsKpiHistogram" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 15 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogram.key_as_string", + "type": "string", + "tags": [], + "label": "key_as_string", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogram.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogram.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogram.count", + "type": "Uncategorized", + "tags": [], + "label": "count", + "description": [], + "signature": [ + "T" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 19 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogramData", + "type": "Interface", + "tags": [], + "label": "HostsKpiHistogramData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 10 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogramData.x", + "type": "CompoundType", + "tags": [], + "label": "x", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 11 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHistogramData.y", + "type": "CompoundType", + "tags": [], + "label": "y", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/common/index.ts", + "lineNumber": 12 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHostsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostsKpiHostsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHostsStrategyResponse", + "text": "HostsKpiHostsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/hosts/index.ts", + "lineNumber": 15 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHostsStrategyResponse.hosts", + "type": "CompoundType", + "tags": [], + "label": "hosts", + "description": [], + "signature": [ + "number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/hosts/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHostsStrategyResponse.hostsHistogram", + "type": "CompoundType", + "tags": [], + "label": "hostsHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHistogramData", + "text": "HostsKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/hosts/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHostsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/hosts/index.ts", + "lineNumber": 18 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostsKpiUniqueIpsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiUniqueIpsStrategyResponse", + "text": "HostsKpiUniqueIpsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 15 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsStrategyResponse.uniqueSourceIps", + "type": "CompoundType", + "tags": [], + "label": "uniqueSourceIps", + "description": [], + "signature": [ + "number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsStrategyResponse.uniqueSourceIpsHistogram", + "type": "CompoundType", + "tags": [], + "label": "uniqueSourceIpsHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHistogramData", + "text": "HostsKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsStrategyResponse.uniqueDestinationIps", + "type": "CompoundType", + "tags": [], + "label": "uniqueDestinationIps", + "description": [], + "signature": [ + "number | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsStrategyResponse.uniqueDestinationIpsHistogram", + "type": "CompoundType", + "tags": [], + "label": "uniqueDestinationIpsHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHistogramData", + "text": "HostsKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 20 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsOverviewStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostsOverviewStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsOverviewStrategyResponse", + "text": "HostsOverviewStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/overview/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsOverviewStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/overview/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsOverviewStrategyResponse.overviewHost", + "type": "Object", + "tags": [], + "label": "overviewHost", + "description": [], + "signature": [ + "{ auditbeatAuditd?: number | null | undefined; auditbeatFIM?: number | null | undefined; auditbeatLogin?: number | null | undefined; auditbeatPackage?: number | null | undefined; auditbeatProcess?: number | null | undefined; auditbeatUser?: number | null | undefined; endgameDns?: number | null | undefined; endgameFile?: number | null | undefined; endgameImageLoad?: number | null | undefined; endgameNetwork?: number | null | undefined; endgameProcess?: number | null | undefined; endgameRegistry?: number | null | undefined; endgameSecurity?: number | null | undefined; filebeatSystemModule?: number | null | undefined; winlogbeatSecurity?: number | null | undefined; winlogbeatMWSysmonOperational?: number | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/overview/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsRequestOptions", + "type": "Interface", + "tags": [], + "label": "HostsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsRequestOptions", + "text": "HostsRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsFields", + "text": "HostsFields" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsRequestOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 27 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsSortField", + "type": "Interface", + "tags": [], + "label": "HostsSortField", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsSortField.field", + "type": "Enum", + "tags": [], + "label": "field", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsFields", + "text": "HostsFields" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsSortField.direction", + "type": "Enum", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 33 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsStrategyResponse", + "text": "HostsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsEdges", + "text": "HostsEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/all/index.ts", + "lineNumber": 23 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesEdges", + "type": "Interface", + "tags": [], + "label": "HostsUncommonProcessesEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessItem", + "text": "HostsUncommonProcessItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 40 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesRequestOptions", + "type": "Interface", + "tags": [], + "label": "HostsUncommonProcessesRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessesRequestOptions", + "text": "HostsUncommonProcessesRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesRequestOptions.sort", + "type": "Object", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesRequestOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesStrategyResponse", + "type": "Interface", + "tags": [], + "label": "HostsUncommonProcessesStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessesStrategyResponse", + "text": "HostsUncommonProcessesStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 31 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessesEdges", + "text": "HostsUncommonProcessesEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessesStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 35 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessHit", + "type": "Interface", + "tags": [], + "label": "HostsUncommonProcessHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessHit", + "text": "HostsUncommonProcessHit" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hit", + "text": "Hit" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 51 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessHit.total", + "type": "Object", + "tags": [], + "label": "total", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TotalHit", + "text": "TotalHit" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessHit.host", + "type": "Array", + "tags": [], + "label": "host", + "description": [], + "signature": [ + "{ id: string[] | undefined; name: string[] | undefined; }[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessHit._source", + "type": "Object", + "tags": [], + "label": "_source", + "description": [], + "signature": [ + "{ '@timestamp': string; process: ", + "ProcessEcs", + "; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessHit.cursor", + "type": "string", + "tags": [], + "label": "cursor", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 61 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessHit.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "React.ReactText[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 62 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessItem", + "type": "Interface", + "tags": [], + "label": "HostsUncommonProcessItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 43 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessItem._id", + "type": "string", + "tags": [], + "label": "_id", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessItem.instances", + "type": "number", + "tags": [], + "label": "instances", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessItem.process", + "type": "Object", + "tags": [], + "label": "process", + "description": [], + "signature": [ + "ProcessEcs" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessItem.hosts", + "type": "Array", + "tags": [], + "label": "hosts", + "description": [], + "signature": [ + "HostEcs", + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsUncommonProcessItem.user", + "type": "CompoundType", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "UserEcs", + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 48 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostValue", + "type": "Interface", + "tags": [], + "label": "HostValue", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 44 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.HostValue.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostValue.value_as_string", + "type": "string", + "tags": [], + "label": "value_as_string", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 46 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField", + "type": "Interface", + "tags": [], + "label": "IndexField", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.category", + "type": "string", + "tags": [], + "label": "category", + "description": [ + "Where the field belong" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [ + "Example of field's value" + ], + "signature": [ + "string | number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.indexes", + "type": "Array", + "tags": [], + "label": "indexes", + "description": [ + "whether the field's belong to an alias index" + ], + "signature": [ + "(string | null)[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "The name of the field" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.type", + "type": "string", + "tags": [], + "label": "type", + "description": [ + "The type of the field's values as recognized by Kibana" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.searchable", + "type": "boolean", + "tags": [], + "label": "searchable", + "description": [ + "Whether the field's values can be efficiently searched for" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.aggregatable", + "type": "boolean", + "tags": [], + "label": "aggregatable", + "description": [ + "Whether the field's values can be aggregated" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [ + "Description of the field" + ], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.format", + "type": "CompoundType", + "tags": [], + "label": "format", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.esTypes", + "type": "Array", + "tags": [], + "label": "esTypes", + "description": [ + "the elastic type as mapped in the index" + ], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.subType", + "type": "Object", + "tags": [], + "label": "subType", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IFieldSubType", + "text": "IFieldSubType" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexField.readFromDocValues", + "type": "boolean", + "tags": [], + "label": "readFromDocValues", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 48 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexFieldsStrategyRequest", + "type": "Interface", + "tags": [], + "label": "IndexFieldsStrategyRequest", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.IndexFieldsStrategyRequest", + "text": "IndexFieldsStrategyRequest" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 53 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexFieldsStrategyRequest.indices", + "type": "Array", + "tags": [], + "label": "indices", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexFieldsStrategyRequest.onlyCheckIfIndicesExist", + "type": "boolean", + "tags": [], + "label": "onlyCheckIfIndicesExist", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 55 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexFieldsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "IndexFieldsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.IndexFieldsStrategyResponse", + "text": "IndexFieldsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 58 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexFieldsStrategyResponse.indexFields", + "type": "Array", + "tags": [], + "label": "indexFields", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.IndexField", + "text": "IndexField" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IndexFieldsStrategyResponse.indicesExist", + "type": "Array", + "tags": [], + "label": "indicesExist", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 60 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Inspect", + "type": "Interface", + "tags": [], + "label": "Inspect", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.Inspect.dsl", + "type": "Array", + "tags": [], + "label": "dsl", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQuery", + "type": "Interface", + "tags": [], + "label": "KueryFilterQuery", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 23 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQuery.kind", + "type": "CompoundType", + "tags": [], + "label": "kind", + "description": [], + "signature": [ + "\"eql\" | \"lucene\" | \"kuery\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQuery.expression", + "type": "string", + "tags": [], + "label": "expression", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 25 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryInput", + "type": "Interface", + "tags": [], + "label": "KueryFilterQueryInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 158 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryInput.kind", + "type": "CompoundType", + "tags": [], + "label": "kind", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 159 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryInput.expression", + "type": "CompoundType", + "tags": [], + "label": "expression", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 160 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryResult", + "type": "Interface", + "tags": [], + "label": "KueryFilterQueryResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 676 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryResult.kind", + "type": "CompoundType", + "tags": [], + "label": "kind", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 677 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryResult.expression", + "type": "CompoundType", + "tags": [], + "label": "expression", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 678 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LastSourceHost", + "type": "Interface", + "tags": [], + "label": "LastSourceHost", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 49 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.LastSourceHost.timestamp", + "type": "CompoundType", + "tags": [], + "label": "timestamp", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LastSourceHost.source", + "type": "CompoundType", + "tags": [], + "label": "source", + "description": [], + "signature": [ + "SourceEcs", + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LastSourceHost.host", + "type": "CompoundType", + "tags": [], + "label": "host", + "description": [], + "signature": [ + "HostEcs", + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/authentications/index.ts", + "lineNumber": 52 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LastTimeDetails", + "type": "Interface", + "tags": [], + "label": "LastTimeDetails", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.LastTimeDetails.hostName", + "type": "CompoundType", + "tags": [], + "label": "hostName", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LastTimeDetails.ip", + "type": "CompoundType", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 21 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LocationHit", + "type": "Interface", + "tags": [], + "label": "LocationHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.LocationHit", + "text": "LocationHit" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 109 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.LocationHit.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 110 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LocationHit.top_geo", + "type": "Object", + "tags": [], + "label": "top_geo", + "description": [], + "signature": [ + "{ hits: { total: number | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TotalValue", + "text": "TotalValue" + }, + "; max_score: number | null; hits: { _source: T; sort?: [number] | undefined; _index?: string | undefined; _type?: string | undefined; _id?: string | undefined; _score?: number | null | undefined; }[]; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 111 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramBucket", + "type": "Interface", + "tags": [], + "label": "MatrixHistogramBucket", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 68 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramBucket.key", + "type": "number", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramBucket.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 70 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramData", + "type": "Interface", + "tags": [], + "label": "MatrixHistogramData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 62 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramData.x", + "type": "CompoundType", + "tags": [], + "label": "x", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 63 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramData.y", + "type": "CompoundType", + "tags": [], + "label": "y", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 64 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramData.g", + "type": "CompoundType", + "tags": [], + "label": "g", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 65 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions", + "type": "Interface", + "tags": [], + "label": "MatrixHistogramRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramRequestOptions", + "text": "MatrixHistogramRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.timerange", + "type": "Object", + "tags": [], + "label": "timerange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimerangeInput", + "text": "TimerangeInput" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.histogramType", + "type": "Enum", + "tags": [], + "label": "histogramType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.stackByField", + "type": "string", + "tags": [], + "label": "stackByField", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.threshold", + "type": "Object", + "tags": [], + "label": "threshold", + "description": [], + "signature": [ + "{ field: string[]; value: string; cardinality?: { field: string[]; value: string; } | undefined; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.isPtrIncluded", + "type": "CompoundType", + "tags": [], + "label": "isPtrIncluded", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramRequestOptions.includeMissingData", + "type": "CompoundType", + "tags": [], + "label": "includeMissingData", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 53 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramSchema", + "type": "Interface", + "tags": [], + "label": "MatrixHistogramSchema", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 73 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramSchema.buildDsl", + "type": "Function", + "tags": [], + "label": "buildDsl", + "description": [], + "signature": [ + "(options: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramRequestOptions", + "text": "MatrixHistogramRequestOptions" + }, + ") => {}" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 74 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.options", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramRequestOptions", + "text": "MatrixHistogramRequestOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 74 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramSchema.aggName", + "type": "string", + "tags": [], + "label": "aggName", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 75 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramSchema.parseKey", + "type": "string", + "tags": [], + "label": "parseKey", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 76 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramSchema.parser", + "type": "Function", + "tags": [], + "label": "parser", + "description": [], + "signature": [ + "(<U>(data: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramParseData", + "text": "MatrixHistogramParseData" + }, + "<U>, keyBucket: string) => ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramData", + "text": "MatrixHistogramData" + }, + "[]) | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 77 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramStrategyResponse", + "type": "Interface", + "tags": [], + "label": "MatrixHistogramStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramStrategyResponse", + "text": "MatrixHistogramStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 56 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramStrategyResponse.matrixHistogramData", + "type": "Array", + "tags": [], + "label": "matrixHistogramData", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramData", + "text": "MatrixHistogramData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 59 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixOverOrdinalHistogramData", + "type": "Interface", + "tags": [], + "label": "MatrixOverOrdinalHistogramData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 48 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixOverOrdinalHistogramData.x", + "type": "string", + "tags": [], + "label": "x", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 49 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixOverOrdinalHistogramData.y", + "type": "number", + "tags": [], + "label": "y", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixOverOrdinalHistogramData.g", + "type": "string", + "tags": [], + "label": "g", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 51 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetails", + "type": "Interface", + "tags": [], + "label": "NetworkDetails", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetails.firstSeen", + "type": "CompoundType", + "tags": [], + "label": "firstSeen", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetails.lastSeen", + "type": "CompoundType", + "tags": [], + "label": "lastSeen", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetails.autonomousSystem", + "type": "Object", + "tags": [], + "label": "autonomousSystem", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AutonomousSystem", + "text": "AutonomousSystem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetails.geo", + "type": "Object", + "tags": [], + "label": "geo", + "description": [], + "signature": [ + "GeoEcs" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 33 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHit", + "type": "Interface", + "tags": [], + "label": "NetworkDetailsHit", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 88 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHit.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + "{ destination?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHit", + "text": "NetworkHit" + }, + " | undefined; source?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHit", + "text": "NetworkHit" + }, + " | undefined; host: ResultHit<object>; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 89 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHit._shards", + "type": "Object", + "tags": [], + "label": "_shards", + "description": [], + "signature": [ + "{ total: number; successful: number; skipped: number; failed: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 94 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHit.hits", + "type": "Object", + "tags": [], + "label": "hits", + "description": [], + "signature": [ + "{ total: { value: number; relation: string; }; max_score: number | null; hits: []; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 100 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHit.took", + "type": "number", + "tags": [], + "label": "took", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 108 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHit.timeout", + "type": "number", + "tags": [], + "label": "timeout", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 109 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkDetailsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetailsRequestOptions", + "text": "NetworkDetailsRequestOptions" + }, + " extends Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + ", \"id\" | \"params\" | \"defaultIndex\" | \"filterQuery\" | \"docValueFields\" | \"factoryQueryType\" | \"indexType\">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsRequestOptions.ip", + "type": "string", + "tags": [], + "label": "ip", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 15 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkDetailsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetailsStrategyResponse", + "text": "NetworkDetailsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsStrategyResponse.networkDetails", + "type": "Object", + "tags": [], + "label": "networkDetails", + "description": [], + "signature": [ + "{ client?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetails", + "text": "NetworkDetails" + }, + " | null | undefined; destination?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetails", + "text": "NetworkDetails" + }, + " | null | undefined; host?: ", + "HostEcs", + " | undefined; server?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetails", + "text": "NetworkDetails" + }, + " | null | undefined; source?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetails", + "text": "NetworkDetails" + }, + " | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsBuckets", + "type": "Interface", + "tags": [], + "label": "NetworkDnsBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 54 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsBuckets.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 55 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsBuckets.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 56 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsBuckets.unique_domains", + "type": "Object", + "tags": [], + "label": "unique_domains", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsBuckets.dns_bytes_in", + "type": "Object", + "tags": [], + "label": "dns_bytes_in", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsBuckets.dns_bytes_out", + "type": "Object", + "tags": [], + "label": "dns_bytes_out", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 63 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsEdges", + "type": "Interface", + "tags": [], + "label": "NetworkDnsEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 34 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsItem", + "text": "NetworkDnsItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 36 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem", + "type": "Interface", + "tags": [], + "label": "NetworkDnsItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 39 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem.dnsBytesIn", + "type": "CompoundType", + "tags": [], + "label": "dnsBytesIn", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem.dnsBytesOut", + "type": "CompoundType", + "tags": [], + "label": "dnsBytesOut", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem.dnsName", + "type": "CompoundType", + "tags": [], + "label": "dnsName", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem.queryCount", + "type": "CompoundType", + "tags": [], + "label": "queryCount", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsItem.uniqueDomains", + "type": "CompoundType", + "tags": [], + "label": "uniqueDomains", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 45 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkDnsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsRequestOptions", + "text": "NetworkDnsRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 20 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsRequestOptions.isPtrIncluded", + "type": "boolean", + "tags": [], + "label": "isPtrIncluded", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsRequestOptions.sort", + "type": "Object", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsFields", + "text": "NetworkDnsFields" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsRequestOptions.stackByField", + "type": "CompoundType", + "tags": [], + "label": "stackByField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 23 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkDnsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsStrategyResponse", + "text": "NetworkDnsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsEdges", + "text": "NetworkDnsEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsStrategyResponse.histogram", + "type": "CompoundType", + "tags": [], + "label": "histogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixOverOrdinalHistogramData", + "text": "MatrixOverOrdinalHistogramData" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 31 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit", + "type": "Interface", + "tags": [], + "label": "NetworkHit", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 63 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.took", + "type": "number", + "tags": [], + "label": "took", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 64 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.timed_out", + "type": "CompoundType", + "tags": [], + "label": "timed_out", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit._scroll_id", + "type": "string", + "tags": [], + "label": "_scroll_id", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 66 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit._shards", + "type": "Object", + "tags": [], + "label": "_shards", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.ShardsResponse", + "text": "ShardsResponse" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.timeout", + "type": "number", + "tags": [], + "label": "timeout", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 68 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.hits", + "type": "Object", + "tags": [], + "label": "hits", + "description": [], + "signature": [ + "{ total: number; hits: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hit", + "text": "Hit" + }, + "[]; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 73 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.geo", + "type": "Object", + "tags": [], + "label": "geo", + "description": [], + "signature": [ + "ResultHit<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 74 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.autonomousSystem", + "type": "Object", + "tags": [], + "label": "autonomousSystem", + "description": [], + "signature": [ + "ResultHit<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 75 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.firstSeen", + "type": "Object", + "tags": [], + "label": "firstSeen", + "description": [], + "signature": [ + "{ value: number; value_as_string: string; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 76 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHit.lastSeen", + "type": "Object", + "tags": [], + "label": "lastSeen", + "description": [], + "signature": [ + "{ value: number; value_as_string: string; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 80 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets", + "type": "Interface", + "tags": [], + "label": "NetworkHttpBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets.domains", + "type": "Object", + "tags": [], + "label": "domains", + "description": [], + "signature": [ + "{ buckets: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GenericBuckets", + "text": "GenericBuckets" + }, + "[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets.methods", + "type": "Object", + "tags": [], + "label": "methods", + "description": [], + "signature": [ + "{ buckets: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GenericBuckets", + "text": "GenericBuckets" + }, + "[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 56 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets.source", + "type": "Uncategorized", + "tags": [], + "label": "source", + "description": [], + "signature": [ + "object" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpBuckets.status", + "type": "Object", + "tags": [], + "label": "status", + "description": [], + "signature": [ + "{ buckets: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GenericBuckets", + "text": "GenericBuckets" + }, + "[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 60 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpEdges", + "type": "Interface", + "tags": [], + "label": "NetworkHttpEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 34 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHttpItem", + "text": "NetworkHttpItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 36 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem", + "type": "Interface", + "tags": [], + "label": "NetworkHttpItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 39 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.domains", + "type": "Array", + "tags": [], + "label": "domains", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.lastHost", + "type": "CompoundType", + "tags": [], + "label": "lastHost", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.lastSourceIp", + "type": "CompoundType", + "tags": [], + "label": "lastSourceIp", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.methods", + "type": "Array", + "tags": [], + "label": "methods", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.path", + "type": "CompoundType", + "tags": [], + "label": "path", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.requestCount", + "type": "CompoundType", + "tags": [], + "label": "requestCount", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpItem.statuses", + "type": "Array", + "tags": [], + "label": "statuses", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 47 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkHttpRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHttpRequestOptions", + "text": "NetworkHttpRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 22 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpRequestOptions.ip", + "type": "string", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpRequestOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 24 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkHttpStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHttpStrategyResponse", + "text": "NetworkHttpStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHttpEdges", + "text": "NetworkHttpEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 31 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiDnsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkKpiDnsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiDnsStrategyResponse", + "text": "NetworkKpiDnsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/dns/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiDnsStrategyResponse.dnsQueries", + "type": "number", + "tags": [], + "label": "dnsQueries", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/dns/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiDnsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/dns/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiHistogramData", + "type": "Interface", + "tags": [], + "label": "NetworkKpiHistogramData", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiHistogramData.x", + "type": "CompoundType", + "tags": [], + "label": "x", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiHistogramData.y", + "type": "CompoundType", + "tags": [], + "label": "y", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 14 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiNetworkEventsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkKpiNetworkEventsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiNetworkEventsStrategyResponse", + "text": "NetworkKpiNetworkEventsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/network_events/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiNetworkEventsStrategyResponse.networkEvents", + "type": "number", + "tags": [], + "label": "networkEvents", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/network_events/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiNetworkEventsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/network_events/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiTlsHandshakesStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkKpiTlsHandshakesStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiTlsHandshakesStrategyResponse", + "text": "NetworkKpiTlsHandshakesStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/tls_handshakes/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiTlsHandshakesStrategyResponse.tlsHandshakes", + "type": "number", + "tags": [], + "label": "tlsHandshakes", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/tls_handshakes/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiTlsHandshakesStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/tls_handshakes/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniqueFlowsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkKpiUniqueFlowsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiUniqueFlowsStrategyResponse", + "text": "NetworkKpiUniqueFlowsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_flows/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniqueFlowsStrategyResponse.uniqueFlowId", + "type": "number", + "tags": [], + "label": "uniqueFlowId", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_flows/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniqueFlowsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_flows/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkKpiUniquePrivateIpsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse", + "text": "NetworkKpiUniquePrivateIpsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse.uniqueSourcePrivateIps", + "type": "number", + "tags": [], + "label": "uniqueSourcePrivateIps", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse.uniqueSourcePrivateIpsHistogram", + "type": "CompoundType", + "tags": [], + "label": "uniqueSourcePrivateIpsHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiHistogramData", + "text": "NetworkKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse.uniqueDestinationPrivateIps", + "type": "number", + "tags": [], + "label": "uniqueDestinationPrivateIps", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse.uniqueDestinationPrivateIpsHistogram", + "type": "CompoundType", + "tags": [], + "label": "uniqueDestinationPrivateIpsHistogram", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiHistogramData", + "text": "NetworkKpiHistogramData" + }, + "[] | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 24 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkOverviewStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkOverviewStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkOverviewStrategyResponse", + "text": "NetworkOverviewStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/overview/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkOverviewStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/overview/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkOverviewStrategyResponse.overviewNetwork", + "type": "Object", + "tags": [], + "label": "overviewNetwork", + "description": [], + "signature": [ + "{ auditbeatSocket?: number | null | undefined; filebeatCisco?: number | null | undefined; filebeatNetflow?: number | null | undefined; filebeatPanw?: number | null | undefined; filebeatSuricata?: number | null | undefined; filebeatZeek?: number | null | undefined; packetbeatDNS?: number | null | undefined; packetbeatFlow?: number | null | undefined; packetbeatTLS?: number | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/overview/index.ts", + "lineNumber": 16 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets", + "type": "Interface", + "tags": [], + "label": "NetworkTlsBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets.timestamp", + "type": "Object", + "tags": [], + "label": "timestamp", + "description": [], + "signature": [ + "{ value: number; value_as_string: string; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets.subjects", + "type": "Object", + "tags": [], + "label": "subjects", + "description": [], + "signature": [ + "{ buckets: readonly { key: string; doc_count: number; }[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets.ja3", + "type": "Object", + "tags": [], + "label": "ja3", + "description": [], + "signature": [ + "{ buckets: readonly { key: string; doc_count: number; }[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets.issuers", + "type": "Object", + "tags": [], + "label": "issuers", + "description": [], + "signature": [ + "{ buckets: readonly { key: string; doc_count: number; }[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsBuckets.not_after", + "type": "Object", + "tags": [], + "label": "not_after", + "description": [], + "signature": [ + "{ buckets: readonly { key: number; key_as_string: string; doc_count: number; }[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsEdges", + "type": "Interface", + "tags": [], + "label": "NetworkTlsEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 46 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsNode", + "text": "NetworkTlsNode" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 48 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode", + "type": "Interface", + "tags": [], + "label": "NetworkTlsNode", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 33 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode.timestamp", + "type": "CompoundType", + "tags": [], + "label": "timestamp", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode.notAfter", + "type": "CompoundType", + "tags": [], + "label": "notAfter", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode.subjects", + "type": "CompoundType", + "tags": [], + "label": "subjects", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode.ja3", + "type": "CompoundType", + "tags": [], + "label": "ja3", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsNode.issuers", + "type": "CompoundType", + "tags": [], + "label": "issuers", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 39 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkTlsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsRequestOptions", + "text": "NetworkTlsRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsFields", + "text": "NetworkTlsFields" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 51 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsRequestOptions.ip", + "type": "string", + "tags": [], + "label": "ip", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsRequestOptions.flowTarget", + "type": "Enum", + "tags": [], + "label": "flowTarget", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTargetSourceDest", + "text": "FlowTargetSourceDest" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsRequestOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 54 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkTlsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsStrategyResponse", + "text": "NetworkTlsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 57 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsEdges", + "text": "NetworkTlsEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 61 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets", + "type": "Interface", + "tags": [], + "label": "NetworkTopCountriesBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 59 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.country", + "type": "string", + "tags": [], + "label": "country", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 61 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.bytes_in", + "type": "Object", + "tags": [], + "label": "bytes_in", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 62 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.bytes_out", + "type": "Object", + "tags": [], + "label": "bytes_out", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.flows", + "type": "number", + "tags": [], + "label": "flows", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 68 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.destination_ips", + "type": "number", + "tags": [], + "label": "destination_ips", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesBuckets.source_ips", + "type": "number", + "tags": [], + "label": "source_ips", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 70 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesEdges", + "type": "Interface", + "tags": [], + "label": "NetworkTopCountriesEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 39 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopCountriesItem", + "text": "NetworkTopCountriesItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesItem", + "type": "Interface", + "tags": [], + "label": "NetworkTopCountriesItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 44 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesItem._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesItem.source", + "type": "CompoundType", + "tags": [], + "label": "source", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TopCountriesItemSource", + "text": "TopCountriesItemSource" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesItem.destination", + "type": "CompoundType", + "tags": [], + "label": "destination", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TopCountriesItemDestination", + "text": "TopCountriesItemDestination" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesItem.network", + "type": "CompoundType", + "tags": [], + "label": "network", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TopNetworkTablesEcsField", + "text": "TopNetworkTablesEcsField" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 48 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkTopCountriesRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopCountriesRequestOptions", + "text": "NetworkTopCountriesRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopTablesFields", + "text": "NetworkTopTablesFields" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesRequestOptions.flowTarget", + "type": "Enum", + "tags": [], + "label": "flowTarget", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTargetSourceDest", + "text": "FlowTargetSourceDest" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesRequestOptions.ip", + "type": "string", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 29 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkTopCountriesStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopCountriesStrategyResponse", + "text": "NetworkTopCountriesStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 32 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopCountriesEdges", + "text": "NetworkTopCountriesEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopCountriesStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 36 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets", + "type": "Interface", + "tags": [], + "label": "NetworkTopNFlowBuckets", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 91 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 92 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.autonomous_system", + "type": "Object", + "tags": [], + "label": "autonomous_system", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AutonomousSystemHit", + "text": "AutonomousSystemHit" + }, + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 93 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.bytes_in", + "type": "Object", + "tags": [], + "label": "bytes_in", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 94 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.bytes_out", + "type": "Object", + "tags": [], + "label": "bytes_out", + "description": [], + "signature": [ + "{ value: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 97 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.domain", + "type": "Object", + "tags": [], + "label": "domain", + "description": [], + "signature": [ + "{ buckets: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GenericBuckets", + "text": "GenericBuckets" + }, + "[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 100 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.location", + "type": "Object", + "tags": [], + "label": "location", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.LocationHit", + "text": "LocationHit" + }, + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 103 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.flows", + "type": "number", + "tags": [], + "label": "flows", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 104 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.destination_ips", + "type": "number", + "tags": [], + "label": "destination_ips", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 105 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowBuckets.source_ips", + "type": "number", + "tags": [], + "label": "source_ips", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 106 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowEdges", + "type": "Interface", + "tags": [], + "label": "NetworkTopNFlowEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopNFlowItem", + "text": "NetworkTopNFlowItem" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 40 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowItem", + "type": "Interface", + "tags": [], + "label": "NetworkTopNFlowItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 43 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowItem._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowItem.source", + "type": "CompoundType", + "tags": [], + "label": "source", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TopNFlowItemSource", + "text": "TopNFlowItemSource" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowItem.destination", + "type": "CompoundType", + "tags": [], + "label": "destination", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TopNFlowItemDestination", + "text": "TopNFlowItemDestination" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowItem.network", + "type": "CompoundType", + "tags": [], + "label": "network", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TopNetworkTablesEcsField", + "text": "TopNetworkTablesEcsField" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 47 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkTopNFlowRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopNFlowRequestOptions", + "text": "NetworkTopNFlowRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopTablesFields", + "text": "NetworkTopTablesFields" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowRequestOptions.flowTarget", + "type": "Enum", + "tags": [], + "label": "flowTarget", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTargetSourceDest", + "text": "FlowTargetSourceDest" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowRequestOptions.ip", + "type": "CompoundType", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkTopNFlowStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopNFlowStrategyResponse", + "text": "NetworkTopNFlowStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 31 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopNFlowEdges", + "text": "NetworkTopNFlowEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopNFlowStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 35 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersBucketsItem", + "type": "Interface", + "tags": [], + "label": "NetworkUsersBucketsItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersBucketsItem.key", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersBucketsItem.doc_count", + "type": "number", + "tags": [], + "label": "doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersBucketsItem.groupName", + "type": "Object", + "tags": [], + "label": "groupName", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersGroupName", + "text": "NetworkUsersGroupName" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersBucketsItem.groupId", + "type": "Object", + "tags": [], + "label": "groupId", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersGroupId", + "text": "NetworkUsersGroupId" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersBucketsItem.id", + "type": "Object", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "Id | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 55 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersEdges", + "type": "Interface", + "tags": [], + "label": "NetworkUsersEdges", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 31 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersNode", + "text": "NetworkUsersNode" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 33 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupId", + "type": "Interface", + "tags": [], + "label": "NetworkUsersGroupId", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 64 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupId.doc_count_error_upper_bound", + "type": "number", + "tags": [], + "label": "doc_count_error_upper_bound", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupId.sum_other_doc_count", + "type": "number", + "tags": [], + "label": "sum_other_doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 66 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupId.buckets", + "type": "Array", + "tags": [], + "label": "buckets", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersBucketsItem", + "text": "NetworkUsersBucketsItem" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 67 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupName", + "type": "Interface", + "tags": [], + "label": "NetworkUsersGroupName", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 58 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupName.doc_count_error_upper_bound", + "type": "number", + "tags": [], + "label": "doc_count_error_upper_bound", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupName.sum_other_doc_count", + "type": "number", + "tags": [], + "label": "sum_other_doc_count", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersGroupName.buckets", + "type": "Array", + "tags": [], + "label": "buckets", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersBucketsItem", + "text": "NetworkUsersBucketsItem" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 61 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersItem", + "type": "Interface", + "tags": [], + "label": "NetworkUsersItem", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 42 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersItem.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersItem.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersItem.groupId", + "type": "CompoundType", + "tags": [], + "label": "groupId", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersItem.groupName", + "type": "CompoundType", + "tags": [], + "label": "groupName", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersItem.count", + "type": "CompoundType", + "tags": [], + "label": "count", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 47 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersNode", + "type": "Interface", + "tags": [], + "label": "NetworkUsersNode", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersNode._id", + "type": "CompoundType", + "tags": [], + "label": "_id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersNode.timestamp", + "type": "CompoundType", + "tags": [], + "label": "timestamp", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersNode.user", + "type": "CompoundType", + "tags": [], + "label": "user", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersItem", + "text": "NetworkUsersItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 39 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersRequestOptions", + "type": "Interface", + "tags": [], + "label": "NetworkUsersRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersRequestOptions", + "text": "NetworkUsersRequestOptions" + }, + " extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersRequestOptions.ip", + "type": "string", + "tags": [], + "label": "ip", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersRequestOptions.sort", + "type": "Object", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersFields", + "text": "NetworkUsersFields" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersRequestOptions.flowTarget", + "type": "Enum", + "tags": [], + "label": "flowTarget", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 21 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersStrategyResponse", + "type": "Interface", + "tags": [], + "label": "NetworkUsersStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersStrategyResponse", + "text": "NetworkUsersStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersEdges", + "text": "NetworkUsersEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PageInfoPaginated", + "text": "PageInfoPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 28 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OverviewHostHit", + "type": "Interface", + "tags": [], + "label": "OverviewHostHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.OverviewHostHit", + "text": "OverviewHostHit" + }, + " extends ", + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/overview/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.OverviewHostHit.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + "{ auditd_count: { doc_count: number; }; endgame_module: { dns_event_count: { doc_count: number; }; file_event_count: { doc_count: number; }; image_load_event_count: { doc_count: number; }; network_event_count: { doc_count: number; }; process_event_count: { doc_count: number; }; registry_event: { doc_count: number; }; security_event_count: { doc_count: number; }; }; fim_count: { doc_count: number; }; system_module: { login_count: { doc_count: number; }; package_count: { doc_count: number; }; process_count: { doc_count: number; }; user_count: { doc_count: number; }; filebeat_count: { doc_count: number; }; }; winlog_count: { doc_count: number; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/overview/index.ts", + "lineNumber": 37 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OverviewNetworkHit", + "type": "Interface", + "tags": [], + "label": "OverviewNetworkHit", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.OverviewNetworkHit", + "text": "OverviewNetworkHit" + }, + " extends ", + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/overview/index.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.OverviewNetworkHit.aggregations", + "type": "Object", + "tags": [], + "label": "aggregations", + "description": [], + "signature": [ + "{ unique_flow_count: { doc_count: number; }; unique_dns_count: { doc_count: number; }; unique_suricata_count: { doc_count: number; }; unique_zeek_count: { doc_count: number; }; unique_socket_count: { doc_count: number; }; unique_filebeat_count: { unique_netflow_count: { doc_count: number; }; unique_panw_count: { doc_count: number; }; unique_cisco_count: { doc_count: number; }; }; unique_packetbeat_count: { unique_tls_count: { doc_count: number; }; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/overview/index.ts", + "lineNumber": 30 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoPaginated", + "type": "Interface", + "tags": [], + "label": "PageInfoPaginated", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 23 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoPaginated.activePage", + "type": "number", + "tags": [], + "label": "activePage", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoPaginated.fakeTotalCount", + "type": "number", + "tags": [], + "label": "fakeTotalCount", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoPaginated.showMorePagesIndicator", + "type": "boolean", + "tags": [], + "label": "showMorePagesIndicator", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoTimeline", + "type": "Interface", + "tags": [], + "label": "PageInfoTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 588 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoTimeline.pageIndex", + "type": "number", + "tags": [], + "label": "pageIndex", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 589 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PageInfoTimeline.pageSize", + "type": "number", + "tags": [], + "label": "pageSize", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 591 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInput", + "type": "Interface", + "tags": [], + "label": "PaginationInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 28 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInput.limit", + "type": "number", + "tags": [], + "label": "limit", + "description": [ + "The limit parameter allows you to configure the maximum amount of items to be returned" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInput.cursor", + "type": "CompoundType", + "tags": [], + "label": "cursor", + "description": [ + "The cursor parameter defines the next result you want to fetch" + ], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInput.tiebreaker", + "type": "CompoundType", + "tags": [], + "label": "tiebreaker", + "description": [ + "The tiebreaker parameter allow to be more precise to fetch the next item" + ], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 34 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInputPaginated", + "type": "Interface", + "tags": [], + "label": "PaginationInputPaginated", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 44 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInputPaginated.activePage", + "type": "number", + "tags": [], + "label": "activePage", + "description": [ + "The activePage parameter defines the page of results you want to fetch" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInputPaginated.cursorStart", + "type": "number", + "tags": [], + "label": "cursorStart", + "description": [ + "The cursorStart parameter defines the start of the results to be displayed" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInputPaginated.fakePossibleCount", + "type": "number", + "tags": [], + "label": "fakePossibleCount", + "description": [ + "The fakePossibleCount parameter determines the total count in order to show 5 additional pages" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.PaginationInputPaginated.querySize", + "type": "number", + "tags": [], + "label": "querySize", + "description": [ + "The querySize parameter is the number of items to be returned" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 52 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatch", + "type": "Interface", + "tags": [], + "label": "QueryMatch", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatch.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatch.displayField", + "type": "string", + "tags": [], + "label": "displayField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatch.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatch.displayValue", + "type": "CompoundType", + "tags": [], + "label": "displayValue", + "description": [], + "signature": [ + "string | number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatch.operator", + "type": "CompoundType", + "tags": [], + "label": "operator", + "description": [], + "signature": [ + "\":\" | \":*\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 29 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchInput", + "type": "Interface", + "tags": [], + "label": "QueryMatchInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 94 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchInput.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 95 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchInput.displayField", + "type": "CompoundType", + "tags": [], + "label": "displayField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 97 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchInput.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 99 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchInput.displayValue", + "type": "CompoundType", + "tags": [], + "label": "displayValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 101 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchInput.operator", + "type": "CompoundType", + "tags": [], + "label": "operator", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 103 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchResult", + "type": "Interface", + "tags": [], + "label": "QueryMatchResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 619 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchResult.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 620 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchResult.displayField", + "type": "CompoundType", + "tags": [], + "label": "displayField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 621 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchResult.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 622 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchResult.displayValue", + "type": "CompoundType", + "tags": [], + "label": "displayValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 623 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryMatchResult.operator", + "type": "CompoundType", + "tags": [], + "label": "operator", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 624 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestBasicOptions", + "type": "Interface", + "tags": [], + "label": "RequestBasicOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 88 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestBasicOptions.timerange", + "type": "Object", + "tags": [], + "label": "timerange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimerangeInput", + "text": "TimerangeInput" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 89 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestBasicOptions.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + "string | ", + "JsonObject", + " | ", + "ESRangeQuery", + " | ", + "ESQueryStringQuery", + " | ", + "ESMatchQuery", + " | ", + "ESTermQuery", + " | ", + "ESBoolQuery", + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 90 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestBasicOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 91 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestBasicOptions.docValueFields", + "type": "Array", + "tags": [], + "label": "docValueFields", + "description": [], + "signature": [ + "SearchDocValueField", + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 92 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestBasicOptions.factoryQueryType", + "type": "CompoundType", + "tags": [], + "label": "factoryQueryType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + " | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + " | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + " | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + " | ", + "CtiQueries", + " | \"matrixHistogram\" | \"matrixHistogramEntities\" | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 93 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestOptions", + "type": "Interface", + "tags": [], + "label": "RequestOptions", + "description": [ + "A mapping of semantic fields to their document counterparts" + ], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptions", + "text": "RequestOptions" + }, + "<Field> extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 98 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestOptions.pagination", + "type": "Object", + "tags": [], + "label": "pagination", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.PaginationInput", + "text": "PaginationInput" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 99 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestOptions.sort", + "type": "Object", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 100 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestOptionsPaginated", + "type": "Interface", + "tags": [], + "label": "RequestOptionsPaginated", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestOptionsPaginated", + "text": "RequestOptionsPaginated" + }, + "<Field> extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 103 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestOptionsPaginated.pagination", + "type": "Object", + "tags": [], + "label": "pagination", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.PaginationInputPaginated", + "text": "PaginationInputPaginated" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 104 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RequestOptionsPaginated.sort", + "type": "Object", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 105 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ResponseTimeline", + "type": "Interface", + "tags": [], + "label": "ResponseTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 714 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ResponseTimeline.code", + "type": "CompoundType", + "tags": [], + "label": "code", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 715 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ResponseTimeline.message", + "type": "CompoundType", + "tags": [], + "label": "message", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 716 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ResponseTimeline.timeline", + "type": "Object", + "tags": [], + "label": "timeline", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineResult", + "text": "TimelineResult" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 717 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RowRenderer", + "type": "Interface", + "tags": [], + "label": "RowRenderer", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.RowRenderer.id", + "type": "Enum", + "tags": [], + "label": "id", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RowRenderer.isInstance", + "type": "Function", + "tags": [], + "label": "isInstance", + "description": [], + "signature": [ + "(data: ", + "Ecs", + ") => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.data", + "type": "Object", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "Ecs" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 14 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RowRenderer.renderRow", + "type": "Function", + "tags": [], + "label": "renderRow", + "description": [], + "signature": [ + "({ browserFields, data, timelineId, }: { browserFields: Readonly<Record<string, Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">>>; data: ", + "Ecs", + "; timelineId: string; }) => React.ReactNode" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 15 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ browserFields: Readonly<Record<string, Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">>>; data: ", + "Ecs", + "; timelineId: string; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 15 + }, + "deprecated": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQuery", + "type": "Interface", + "tags": [], + "label": "SerializedFilterQuery", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 28 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQuery.kuery", + "type": "CompoundType", + "tags": [], + "label": "kuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.KueryFilterQuery", + "text": "KueryFilterQuery" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQuery.serializedQuery", + "type": "string", + "tags": [], + "label": "serializedQuery", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 30 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQueryInput", + "type": "Interface", + "tags": [], + "label": "SerializedFilterQueryInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 149 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQueryInput.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SerializedKueryQueryInput", + "text": "SerializedKueryQueryInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 150 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQueryResult", + "type": "Interface", + "tags": [], + "label": "SerializedFilterQueryResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 667 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedFilterQueryResult.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SerializedKueryQueryResult", + "text": "SerializedKueryQueryResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 668 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedKueryQueryInput", + "type": "Interface", + "tags": [], + "label": "SerializedKueryQueryInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 153 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedKueryQueryInput.kuery", + "type": "CompoundType", + "tags": [], + "label": "kuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.KueryFilterQueryInput", + "text": "KueryFilterQueryInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 154 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedKueryQueryInput.serializedQuery", + "type": "CompoundType", + "tags": [], + "label": "serializedQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 155 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedKueryQueryResult", + "type": "Interface", + "tags": [], + "label": "SerializedKueryQueryResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 671 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedKueryQueryResult.kuery", + "type": "CompoundType", + "tags": [], + "label": "kuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.KueryFilterQueryResult", + "text": "KueryFilterQueryResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 672 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SerializedKueryQueryResult.serializedQuery", + "type": "CompoundType", + "tags": [], + "label": "serializedQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 673 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ShardsResponse", + "type": "Interface", + "tags": [], + "label": "ShardsResponse", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 43 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.ShardsResponse.total", + "type": "number", + "tags": [], + "label": "total", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ShardsResponse.successful", + "type": "number", + "tags": [], + "label": "successful", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ShardsResponse.failed", + "type": "number", + "tags": [], + "label": "failed", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ShardsResponse.skipped", + "type": "number", + "tags": [], + "label": "skipped", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 47 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortColumnTimeline", + "type": "Interface", + "tags": [], + "label": "SortColumnTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 34 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SortColumnTimeline.columnId", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortColumnTimeline.columnType", + "type": "string", + "tags": [], + "label": "columnType", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortColumnTimeline.sortDirection", + "type": "CompoundType", + "tags": [], + "label": "sortDirection", + "description": [], + "signature": [ + "\"none\" | \"asc\" | \"desc\" | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 37 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortField", + "type": "Interface", + "tags": [], + "label": "SortField", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SortField.field", + "type": "Uncategorized", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "Field" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortField.direction", + "type": "Enum", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 32 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortTimeline", + "type": "Interface", + "tags": [], + "label": "SortTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 719 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SortTimeline.sortField", + "type": "Enum", + "tags": [], + "label": "sortField", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 720 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortTimeline.sortOrder", + "type": "Enum", + "tags": [], + "label": "sortOrder", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 721 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortTimelineInput", + "type": "Interface", + "tags": [], + "label": "SortTimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 168 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.SortTimelineInput.columnId", + "type": "CompoundType", + "tags": [], + "label": "columnId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 169 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortTimelineInput.sortDirection", + "type": "CompoundType", + "tags": [], + "label": "sortDirection", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 170 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEdges", + "type": "Interface", + "tags": [], + "label": "TimelineEdges", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineItem", + "text": "TimelineItem" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 15 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEqlRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEqlRequestOptions", + "text": "TimelineEqlRequestOptions" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EqlSearchStrategyRequest", + "text": "EqlSearchStrategyRequest" + }, + ",Pick<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllRequestOptions", + "text": "TimelineEventsAllRequestOptions" + }, + ", \"id\" | \"sort\" | \"fields\" | \"language\" | \"timerange\" | \"defaultIndex\" | \"pagination\" | \"filterQuery\" | \"docValueFields\" | \"factoryQueryType\" | \"indexType\" | \"fieldRequested\" | \"excludeEcsData\">" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlRequestOptions.eventCategoryField", + "type": "string", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlRequestOptions.tiebreakerField", + "type": "string", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlRequestOptions.timestampField", + "type": "string", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlRequestOptions.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEqlResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEqlResponse", + "text": "TimelineEqlResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EqlSearchStrategyResponse", + "text": "EqlSearchStrategyResponse" + }, + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlSearchResponse", + "text": "EqlSearchResponse" + }, + "<unknown>>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEdges", + "text": "TimelineEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + "{ activePage: number; querySize: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEqlResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 29 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEventsAllRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllRequestOptions", + "text": "TimelineEventsAllRequestOptions" + }, + " extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestOptionsPaginated", + "text": "TimelineRequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllRequestOptions.fields", + "type": "CompoundType", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "string[] | { field: string; include_unmapped: boolean; }[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllRequestOptions.fieldRequested", + "type": "Array", + "tags": [], + "label": "fieldRequested", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllRequestOptions.language", + "type": "CompoundType", + "tags": [], + "label": "language", + "description": [], + "signature": [ + "\"eql\" | \"lucene\" | \"kuery\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllRequestOptions.excludeEcsData", + "type": "CompoundType", + "tags": [], + "label": "excludeEcsData", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEventsAllStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllStrategyResponse", + "text": "TimelineEventsAllStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEdges", + "text": "TimelineEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + "{ activePage: number; querySize: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsAllStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 34 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem", + "type": "Interface", + "tags": [], + "label": "TimelineEventsDetailsItem", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem.ariaRowindex", + "type": "CompoundType", + "tags": [], + "label": "ariaRowindex", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem.category", + "type": "string", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem.values", + "type": "CompoundType", + "tags": [], + "label": "values", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem.originalValue", + "type": "Any", + "tags": [], + "label": "originalValue", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsItem.isObjectArray", + "type": "boolean", + "tags": [], + "label": "isObjectArray", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 19 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEventsDetailsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsRequestOptions", + "text": "TimelineEventsDetailsRequestOptions" + }, + " extends Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestOptionsPaginated", + "text": "TimelineRequestOptionsPaginated" + }, + "<string>>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsRequestOptions.indexName", + "type": "string", + "tags": [], + "label": "indexName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsRequestOptions.eventId", + "type": "string", + "tags": [], + "label": "eventId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 30 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEventsDetailsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsStrategyResponse", + "text": "TimelineEventsDetailsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 22 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsStrategyResponse.data", + "type": "CompoundType", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsItem", + "text": "TimelineEventsDetailsItem" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsDetailsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 24 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsLastEventTimeRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEventsLastEventTimeRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeRequestOptions", + "text": "TimelineEventsLastEventTimeRequestOptions" + }, + " extends Pick<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + }, + ", \"id\" | \"params\" | \"defaultIndex\" | \"docValueFields\" | \"factoryQueryType\" | \"indexType\">" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsLastEventTimeRequestOptions.indexKey", + "type": "Enum", + "tags": [], + "label": "indexKey", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.LastEventIndexKey", + "text": "LastEventIndexKey" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsLastEventTimeRequestOptions.details", + "type": "Object", + "tags": [], + "label": "details", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.LastTimeDetails", + "text": "LastTimeDetails" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsLastEventTimeStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEventsLastEventTimeStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeStrategyResponse", + "text": "TimelineEventsLastEventTimeStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsLastEventTimeStrategyResponse.lastSeen", + "type": "CompoundType", + "tags": [], + "label": "lastSeen", + "description": [], + "signature": [ + "string | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsLastEventTimeStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput", + "type": "Interface", + "tags": [], + "label": "TimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 173 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.columns", + "type": "CompoundType", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.ColumnHeaderInput", + "text": "ColumnHeaderInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 174 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.dataProviders", + "type": "CompoundType", + "tags": [], + "label": "dataProviders", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderInput", + "text": "DataProviderInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 175 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 176 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.eqlOptions", + "type": "CompoundType", + "tags": [], + "label": "eqlOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EqlOptionsInput", + "text": "EqlOptionsInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 177 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.eventType", + "type": "CompoundType", + "tags": [], + "label": "eventType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 178 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.excludedRowRendererIds", + "type": "CompoundType", + "tags": [], + "label": "excludedRowRendererIds", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 179 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.filters", + "type": "CompoundType", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FilterTimelineInput", + "text": "FilterTimelineInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 180 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.kqlMode", + "type": "CompoundType", + "tags": [], + "label": "kqlMode", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 181 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SerializedFilterQueryInput", + "text": "SerializedFilterQueryInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 182 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.indexNames", + "type": "CompoundType", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 183 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.title", + "type": "CompoundType", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 184 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.templateTimelineId", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 185 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.templateTimelineVersion", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineVersion", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 186 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 187 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.dateRange", + "type": "CompoundType", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DateRangePickerInput", + "text": "DateRangePickerInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 188 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.savedQueryId", + "type": "CompoundType", + "tags": [], + "label": "savedQueryId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 189 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortTimelineInput", + "text": "SortTimelineInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 190 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineInput.status", + "type": "CompoundType", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 191 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineItem", + "type": "Interface", + "tags": [], + "label": "TimelineItem", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineItem._id", + "type": "string", + "tags": [], + "label": "_id", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineItem._index", + "type": "CompoundType", + "tags": [], + "label": "_index", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineItem.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineItem.ecs", + "type": "Object", + "tags": [], + "label": "ecs", + "description": [], + "signature": [ + "Ecs" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineKpiStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineKpiStrategyResponse", + "text": "TimelineKpiStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse.destinationIpCount", + "type": "number", + "tags": [], + "label": "destinationIpCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse.hostCount", + "type": "number", + "tags": [], + "label": "hostCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse.processCount", + "type": "number", + "tags": [], + "label": "processCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse.sourceIpCount", + "type": "number", + "tags": [], + "label": "sourceIpCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineKpiStrategyResponse.userCount", + "type": "number", + "tags": [], + "label": "userCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 35 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineNonEcsData", + "type": "Interface", + "tags": [], + "label": "TimelineNonEcsData", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineNonEcsData.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineNonEcsData.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 27 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput", + "type": "Interface", + "tags": [], + "label": "TimelinePersistInput", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 40 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.dataProviders", + "type": "Array", + "tags": [], + "label": "dataProviders", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProvider", + "text": "DataProvider" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.dateRange", + "type": "Object", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + "{ start: string; end: string; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.excludedRowRendererIds", + "type": "Array", + "tags": [], + "label": "excludedRowRendererIds", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.expandedDetail", + "type": "Object", + "tags": [], + "label": "expandedDetail", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineExpandedDetail", + "text": "TimelineExpandedDetail" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 49 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.itemsPerPage", + "type": "number", + "tags": [], + "label": "itemsPerPage", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.indexNames", + "type": "Array", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.kqlQuery", + "type": "Object", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + "{ filterQuery: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SerializedFilterQuery", + "text": "SerializedFilterQuery" + }, + " | null; } | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.show", + "type": "CompoundType", + "tags": [], + "label": "show", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 56 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortColumnTimeline", + "text": "SortColumnTimeline" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.showCheckboxes", + "type": "CompoundType", + "tags": [], + "label": "showCheckboxes", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.templateTimelineId", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelinePersistInput.templateTimelineVersion", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineVersion", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 61 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestBasicOptions", + "type": "Interface", + "tags": [], + "label": "TimelineRequestBasicOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestBasicOptions.timerange", + "type": "Object", + "tags": [], + "label": "timerange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimerangeInput", + "text": "TimerangeInput" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestBasicOptions.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + "string | ", + "JsonObject", + " | ", + "ESRangeQuery", + " | ", + "ESQueryStringQuery", + " | ", + "ESMatchQuery", + " | ", + "ESTermQuery", + " | ", + "ESBoolQuery", + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestBasicOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestBasicOptions.docValueFields", + "type": "Array", + "tags": [], + "label": "docValueFields", + "description": [], + "signature": [ + "SearchDocValueField", + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestBasicOptions.factoryQueryType", + "type": "CompoundType", + "tags": [], + "label": "factoryQueryType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 43 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestOptionsPaginated", + "type": "Interface", + "tags": [], + "label": "TimelineRequestOptionsPaginated", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineRequestOptionsPaginated", + "text": "TimelineRequestOptionsPaginated" + }, + "<Field> extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestOptionsPaginated.pagination", + "type": "Object", + "tags": [], + "label": "pagination", + "description": [], + "signature": [ + "{ activePage: number; querySize: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestOptionsPaginated.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineRequestSortField", + "text": "TimelineRequestSortField" + }, + "<Field>[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 53 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestSortField", + "type": "Interface", + "tags": [], + "label": "TimelineRequestSortField", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineRequestSortField", + "text": "TimelineRequestSortField" + }, + "<Field> extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 46 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineRequestSortField.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 47 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult", + "type": "Interface", + "tags": [], + "label": "TimelineResult", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 681 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.columns", + "type": "CompoundType", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.ColumnHeaderResult", + "text": "ColumnHeaderResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 682 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.created", + "type": "CompoundType", + "tags": [], + "label": "created", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 683 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.createdBy", + "type": "CompoundType", + "tags": [], + "label": "createdBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 684 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.dataProviders", + "type": "CompoundType", + "tags": [], + "label": "dataProviders", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderResult", + "text": "DataProviderResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 685 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.dateRange", + "type": "CompoundType", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DateRangePickerResult", + "text": "DateRangePickerResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 686 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 687 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.eqlOptions", + "type": "CompoundType", + "tags": [], + "label": "eqlOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EqlOptionsResult", + "text": "EqlOptionsResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 688 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.eventIdToNoteIds", + "type": "CompoundType", + "tags": [], + "label": "eventIdToNoteIds", + "description": [], + "signature": [ + "NoteResult", + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 689 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.eventType", + "type": "CompoundType", + "tags": [], + "label": "eventType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 690 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.excludedRowRendererIds", + "type": "CompoundType", + "tags": [], + "label": "excludedRowRendererIds", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 691 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.favorite", + "type": "CompoundType", + "tags": [], + "label": "favorite", + "description": [], + "signature": [ + "{ fullName?: string | null | undefined; userName?: string | null | undefined; favoriteDate?: number | null | undefined; }[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 692 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.filters", + "type": "CompoundType", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FilterTimelineResult", + "text": "FilterTimelineResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 693 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.kqlMode", + "type": "CompoundType", + "tags": [], + "label": "kqlMode", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 694 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SerializedFilterQueryResult", + "text": "SerializedFilterQueryResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 695 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.indexNames", + "type": "CompoundType", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 696 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.notes", + "type": "CompoundType", + "tags": [], + "label": "notes", + "description": [], + "signature": [ + "NoteResult", + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 697 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.noteIds", + "type": "CompoundType", + "tags": [], + "label": "noteIds", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 698 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.pinnedEventIds", + "type": "CompoundType", + "tags": [], + "label": "pinnedEventIds", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 699 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.pinnedEventsSaveObject", + "type": "CompoundType", + "tags": [], + "label": "pinnedEventsSaveObject", + "description": [], + "signature": [ + "PinnedEvent", + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 700 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.savedQueryId", + "type": "CompoundType", + "tags": [], + "label": "savedQueryId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 701 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.savedObjectId", + "type": "string", + "tags": [], + "label": "savedObjectId", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 702 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "{ columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 703 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.status", + "type": "CompoundType", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 704 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.title", + "type": "CompoundType", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 705 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.templateTimelineId", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 706 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.templateTimelineVersion", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineVersion", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 707 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 708 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.updated", + "type": "CompoundType", + "tags": [], + "label": "updated", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 709 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.updatedBy", + "type": "CompoundType", + "tags": [], + "label": "updatedBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 710 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResult.version", + "type": "string", + "tags": [], + "label": "version", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 711 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimerangeInput", + "type": "Interface", + "tags": [], + "label": "TimerangeInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TimerangeInput.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [ + "The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan." + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimerangeInput.to", + "type": "string", + "tags": [], + "label": "to", + "description": [ + "The end of the timerange" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimerangeInput.from", + "type": "string", + "tags": [], + "label": "from", + "description": [ + "The beginning of the timerange" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemDestination", + "type": "Interface", + "tags": [], + "label": "TopCountriesItemDestination", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 51 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemDestination.country", + "type": "CompoundType", + "tags": [], + "label": "country", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemDestination.destination_ips", + "type": "CompoundType", + "tags": [], + "label": "destination_ips", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemDestination.flows", + "type": "CompoundType", + "tags": [], + "label": "flows", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemDestination.location", + "type": "CompoundType", + "tags": [], + "label": "location", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GeoItem", + "text": "GeoItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 55 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemDestination.source_ips", + "type": "CompoundType", + "tags": [], + "label": "source_ips", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 56 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemSource", + "type": "Interface", + "tags": [], + "label": "TopCountriesItemSource", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemSource.country", + "type": "CompoundType", + "tags": [], + "label": "country", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemSource.destination_ips", + "type": "CompoundType", + "tags": [], + "label": "destination_ips", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemSource.flows", + "type": "CompoundType", + "tags": [], + "label": "flows", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemSource.location", + "type": "CompoundType", + "tags": [], + "label": "location", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GeoItem", + "text": "GeoItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopCountriesItemSource.source_ips", + "type": "CompoundType", + "tags": [], + "label": "source_ips", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_countries/index.ts", + "lineNumber": 23 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNetworkTablesEcsField", + "type": "Interface", + "tags": [], + "label": "TopNetworkTablesEcsField", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 42 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNetworkTablesEcsField.bytes_in", + "type": "CompoundType", + "tags": [], + "label": "bytes_in", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNetworkTablesEcsField.bytes_out", + "type": "CompoundType", + "tags": [], + "label": "bytes_out", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 44 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination", + "type": "Interface", + "tags": [], + "label": "TopNFlowItemDestination", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 64 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination.autonomous_system", + "type": "CompoundType", + "tags": [], + "label": "autonomous_system", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AutonomousSystemItem", + "text": "AutonomousSystemItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination.domain", + "type": "CompoundType", + "tags": [], + "label": "domain", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 66 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination.ip", + "type": "CompoundType", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination.location", + "type": "CompoundType", + "tags": [], + "label": "location", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GeoItem", + "text": "GeoItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 68 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination.flows", + "type": "CompoundType", + "tags": [], + "label": "flows", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemDestination.source_ips", + "type": "CompoundType", + "tags": [], + "label": "source_ips", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 70 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource", + "type": "Interface", + "tags": [], + "label": "TopNFlowItemSource", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource.autonomous_system", + "type": "CompoundType", + "tags": [], + "label": "autonomous_system", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AutonomousSystemItem", + "text": "AutonomousSystemItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource.domain", + "type": "CompoundType", + "tags": [], + "label": "domain", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource.ip", + "type": "CompoundType", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource.location", + "type": "CompoundType", + "tags": [], + "label": "location", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.GeoItem", + "text": "GeoItem" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource.flows", + "type": "CompoundType", + "tags": [], + "label": "flows", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 55 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TopNFlowItemSource.destination_ips", + "type": "CompoundType", + "tags": [], + "label": "destination_ips", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/top_n_flow/index.ts", + "lineNumber": 56 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TotalHit", + "type": "Interface", + "tags": [], + "label": "TotalHit", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TotalHit.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TotalHit.relation", + "type": "string", + "tags": [], + "label": "relation", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 52 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TotalValue", + "type": "Interface", + "tags": [], + "label": "TotalValue", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.TotalValue.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TotalValue.relation", + "type": "string", + "tags": [], + "label": "relation", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 13 + }, + "deprecated": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderType", + "type": "Enum", + "tags": [], + "label": "DataProviderType", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 70 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Direction", + "type": "Enum", + "tags": [], + "label": "Direction", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FlowDirection", + "type": "Enum", + "tags": [], + "label": "FlowDirection", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 194 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FlowTarget", + "type": "Enum", + "tags": [], + "label": "FlowTarget", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FlowTargetSourceDest", + "type": "Enum", + "tags": [], + "label": "FlowTargetSourceDest", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostPolicyResponseActionStatus", + "type": "Enum", + "tags": [], + "label": "HostPolicyResponseActionStatus", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsFields", + "type": "Enum", + "tags": [], + "label": "HostsFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiQueries", + "type": "Enum", + "tags": [], + "label": "HostsKpiQueries", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/index.ts", + "lineNumber": 17 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsQueries", + "type": "Enum", + "tags": [], + "label": "HostsQueries", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/index.ts", + "lineNumber": 17 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.LastEventIndexKey", + "type": "Enum", + "tags": [], + "label": "LastEventIndexKey", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramType", + "type": "Enum", + "tags": [], + "label": "MatrixHistogramType", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 28 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDirectionEcs", + "type": "Enum", + "tags": [], + "label": "NetworkDirectionEcs", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDnsFields", + "type": "Enum", + "tags": [], + "label": "NetworkDnsFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/dns/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkHttpFields", + "type": "Enum", + "tags": [], + "label": "NetworkHttpFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/http/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiQueries", + "type": "Enum", + "tags": [], + "label": "NetworkKpiQueries", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/index.ts", + "lineNumber": 20 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkQueries", + "type": "Enum", + "tags": [], + "label": "NetworkQueries", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTopTablesFields", + "type": "Enum", + "tags": [], + "label": "NetworkTopTablesFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/common/index.ts", + "lineNumber": 22 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkUsersFields", + "type": "Enum", + "tags": [], + "label": "NetworkUsersFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/users/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RowRendererId", + "type": "Enum", + "tags": [], + "label": "RowRendererId", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 207 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortFieldTimeline", + "type": "Enum", + "tags": [], + "label": "SortFieldTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 512 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TemplateTimelineType", + "type": "Enum", + "tags": [], + "label": "TemplateTimelineType", + "description": [ + "\nTimeline template type" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 233 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsQueries", + "type": "Enum", + "tags": [], + "label": "TimelineEventsQueries", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/events/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineId", + "type": "Enum", + "tags": [], + "label": "TimelineId", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 305 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineStatus", + "type": "Enum", + "tags": [], + "label": "TimelineStatus", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 188 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineTabs", + "type": "Enum", + "tags": [], + "label": "TimelineTabs", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 453 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineType", + "type": "Enum", + "tags": [], + "label": "TimelineType", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 256 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AllTimelineSavedObject", + "type": "Type", + "tags": [], + "label": "AllTimelineSavedObject", + "description": [], + "signature": [ + "{ total: number; data: { columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 405 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.AllTimelinesResponse", + "type": "Type", + "tags": [], + "label": "AllTimelinesResponse", + "description": [], + "signature": [ + "{ timeline: ({ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; })[]; totalCount: number; } & { defaultTimelineCount: number; templateTimelineCount: number; elasticTemplateTimelineCount: number; customTemplateTimelineCount: number; favoriteCount: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 586 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BeatFields", + "type": "Type", + "tags": [], + "label": "BeatFields", + "description": [], + "signature": [ + "{ [x: string]: FieldInfo; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 51 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BeatFieldsFactoryQueryType", + "type": "Type", + "tags": [], + "label": "BeatFieldsFactoryQueryType", + "description": [], + "signature": [ + "\"beatFields\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.BrowserFields", + "type": "Type", + "tags": [], + "label": "BrowserFields", + "description": [], + "signature": [ + "{ readonly [x: string]: Partial<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 82 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.CellValueElementProps", + "type": "Type", + "tags": [], + "label": "CellValueElementProps", + "description": [ + "The following props are provided to the function called by `renderCellValue`" + ], + "signature": [ + "EuiDataGridCellValueElementProps", + " & { data: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]; eventId: string; header: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "; linkValues: string[] | undefined; timelineId: string; setFlyoutAlert?: ((data: any) => void) | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/cells/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderOptions", + "type": "Type", + "tags": [], + "label": "ColumnHeaderOptions", + "description": [ + "The specification of a column header" + ], + "signature": [ + "Pick<", + "EuiDataGridColumn", + ", \"id\" | \"display\" | \"displayAsText\" | \"initialWidth\"> & { aggregatable?: boolean | undefined; category?: string | undefined; columnHeaderType: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderType", + "text": "ColumnHeaderType" + }, + "; description?: string | undefined; example?: string | undefined; format?: string | undefined; linkField?: string | undefined; placeholder?: string | undefined; subType?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IFieldSubType", + "text": "IFieldSubType" + }, + " | undefined; type?: string | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnHeaderType", + "type": "Type", + "tags": [], + "label": "ColumnHeaderType", + "description": [], + "signature": [ + "\"not-filtered\" | \"text-filter\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ColumnId", + "type": "Type", + "tags": [], + "label": "ColumnId", + "description": [ + "Uniquely identifies a column" + ], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ControlColumnProps", + "type": "Type", + "tags": [], + "label": "ControlColumnProps", + "description": [], + "signature": [ + "Pick<", + "EuiDataGridControlColumn", + ", never> & Partial<AdditionalControlColumnProps>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 88 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProvidersAnd", + "type": "Type", + "tags": [], + "label": "DataProvidersAnd", + "description": [], + "signature": [ + "{ type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | undefined; enabled: boolean; id: string; name: string; excluded: boolean; kqlQuery: string; queryMatch: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.QueryMatch", + "text": "QueryMatch" + }, + "; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 65 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DocValueFields", + "type": "Type", + "tags": [], + "label": "DocValueFields", + "description": [], + "signature": [ + "SearchDocValueField" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 55 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EMPTY_DOCVALUE_FIELD", + "type": "Array", + "tags": [], + "label": "EMPTY_DOCVALUE_FIELD", + "description": [], + "signature": [ + "SearchDocValueField", + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 85 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EXISTS_OPERATOR", + "type": "string", + "tags": [], + "label": "EXISTS_OPERATOR", + "description": [ + "The `exists` operator in a KQL query" + ], + "signature": [ + "\":*\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportedEventNotes", + "type": "Type", + "tags": [], + "label": "ExportedEventNotes", + "description": [], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 412 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportedGlobalNotes", + "type": "Type", + "tags": [], + "label": "ExportedGlobalNotes", + "description": [ + "\nImport/export timelines" + ], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 411 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ExportedTimelines", + "type": "Type", + "tags": [], + "label": "ExportedTimelines", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; } & ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.ExportedNotes", + "text": "ExportedNotes" + }, + " & { pinnedEventIds: string[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 419 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FactoryQueryTypes", + "type": "Type", + "tags": [], + "label": "FactoryQueryTypes", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + " | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + " | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + " | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + " | ", + "CtiQueries", + " | \"matrixHistogram\" | \"matrixHistogramEntities\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 79 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FavoriteTimelineResult", + "type": "Type", + "tags": [], + "label": "FavoriteTimelineResult", + "description": [], + "signature": [ + "{ fullName?: string | null | undefined; userName?: string | null | undefined; favoriteDate?: number | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 542 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.FieldsEqlOptions", + "type": "Type", + "tags": [], + "label": "FieldsEqlOptions", + "description": [], + "signature": [ + "\"query\" | \"size\" | \"eventCategoryField\" | \"tiebreakerField\" | \"timestampField\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 46 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GenericActionRowCellRenderProps", + "type": "Type", + "tags": [], + "label": "GenericActionRowCellRenderProps", + "description": [], + "signature": [ + "{ columnId: string; rowIndex: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 57 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.GetTimelinesArgs", + "type": "Type", + "tags": [], + "label": "GetTimelinesArgs", + "description": [], + "signature": [ + "{ onlyUserFavorite?: boolean | null | undefined; pageInfo?: { pageIndex: number; pageSize: number; } | null | undefined; search?: string | null | undefined; sort?: { sortField: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + "; sortOrder: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + "; } | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 566 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HeaderCellRender", + "type": "Type", + "tags": [], + "label": "HeaderCellRender", + "description": [], + "signature": [ + "React.ComponentClass<{}, any> | React.FunctionComponent<{}> | React.ComponentClass<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.HeaderActionProps", + "text": "HeaderActionProps" + }, + ", any> | React.FunctionComponent<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.HeaderActionProps", + "text": "HeaderActionProps" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 62 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostHits", + "type": "Type", + "tags": [], + "label": "HostHits", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hits", + "text": "Hits" + }, + "<number, ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostHit", + "text": "HostHit" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/common/index.ts", + "lineNumber": 121 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostOverviewRequestOptions", + "type": "Type", + "tags": [], + "label": "HostOverviewRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/overview/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiAuthenticationsRequestOptions", + "type": "Type", + "tags": [], + "label": "HostsKpiAuthenticationsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/authentications/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiHostsRequestOptions", + "type": "Type", + "tags": [], + "label": "HostsKpiHostsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/hosts/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiStrategyResponse", + "type": "Type", + "tags": [], + "label": "HostsKpiStrategyResponse", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiAuthenticationsStrategyResponse", + "text": "HostsKpiAuthenticationsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"authenticationsSuccess\" | \"authenticationsSuccessHistogram\" | \"authenticationsFailure\" | \"authenticationsFailureHistogram\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\"> | Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHostsStrategyResponse", + "text": "HostsKpiHostsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"hosts\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"hostsHistogram\"> | Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiUniqueIpsStrategyResponse", + "text": "HostsKpiUniqueIpsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"uniqueSourceIps\" | \"uniqueSourceIpsHistogram\" | \"uniqueDestinationIps\" | \"uniqueDestinationIpsHistogram\">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.HostsKpiUniqueIpsRequestOptions", + "type": "Type", + "tags": [], + "label": "HostsKpiUniqueIpsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/kpi/unique_ips/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ImportTimelineResultSchema", + "type": "Type", + "tags": [], + "label": "ImportTimelineResultSchema", + "description": [], + "signature": [ + "{ success: boolean; success_count: number; timelines_installed: number; timelines_updated: number; errors: ({ id?: string | undefined; rule_id?: string | undefined; } & { error: { status_code: number; message: string; }; })[]; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 449 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.IS_OPERATOR", + "type": "string", + "tags": [], + "label": "IS_OPERATOR", + "description": [ + "Represents the Timeline data providers\nThe `is` operator in a KQL query" + ], + "signature": [ + "\":\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.KueryFilterQueryKind", + "type": "Type", + "tags": [], + "label": "KueryFilterQueryKind", + "description": [], + "signature": [ + "\"eql\" | \"lucene\" | \"kuery\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 21 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramDataConfig", + "type": "Type", + "tags": [], + "label": "MatrixHistogramDataConfig", + "description": [], + "signature": [ + "{ authentications: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ">; authenticationsEntities: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ">; anomalies: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ">; events: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ">; alerts: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ">; dns: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramSchema", + "text": "MatrixHistogramSchema" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 104 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramHit", + "type": "Type", + "tags": [], + "label": "MatrixHistogramHit", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".alerts ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EventHit", + "text": "EventHit" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".anomalies ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AnomalyHit", + "text": "AnomalyHit" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".dns ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EventHit", + "text": "EventHit" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".authentications ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationHit", + "text": "AuthenticationHit" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".events ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EventHit", + "text": "EventHit" + }, + " : never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 92 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramParseData", + "type": "Type", + "tags": [], + "label": "MatrixHistogramParseData", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".alerts ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AlertsGroupData", + "text": "AlertsGroupData" + }, + "[] : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".anomalies ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AnomaliesActionGroupData", + "text": "AnomaliesActionGroupData" + }, + "[] : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".dns ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DnsHistogramGroupData", + "text": "DnsHistogramGroupData" + }, + "[] : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".authentications ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.AuthenticationsActionGroupData", + "text": "AuthenticationsActionGroupData" + }, + "[] : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramType", + "text": "MatrixHistogramType" + }, + ".events ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.EventsActionGroupData", + "text": "EventsActionGroupData" + }, + "[] : never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 80 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramQuery", + "type": "string", + "tags": [], + "label": "MatrixHistogramQuery", + "description": [], + "signature": [ + "\"matrixHistogram\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.MatrixHistogramQueryEntities", + "type": "string", + "tags": [], + "label": "MatrixHistogramQueryEntities", + "description": [], + "signature": [ + "\"matrixHistogramEntities\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/matrix_histogram/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Maybe", + "type": "Type", + "tags": [], + "label": "Maybe", + "description": [], + "signature": [ + "T | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkDetailsHostHit", + "type": "Type", + "tags": [], + "label": "NetworkDetailsHostHit", + "description": [], + "signature": [ + "ResultHit<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/details/index.ts", + "lineNumber": 86 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiDnsRequestOptions", + "type": "Type", + "tags": [], + "label": "NetworkKpiDnsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/dns/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiNetworkEventsRequestOptions", + "type": "Type", + "tags": [], + "label": "NetworkKpiNetworkEventsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/network_events/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiStrategyResponse", + "type": "Type", + "tags": [], + "label": "NetworkKpiStrategyResponse", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiDnsStrategyResponse", + "text": "NetworkKpiDnsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"dnsQueries\"> | Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiNetworkEventsStrategyResponse", + "text": "NetworkKpiNetworkEventsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"networkEvents\"> | Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiTlsHandshakesStrategyResponse", + "text": "NetworkKpiTlsHandshakesStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"tlsHandshakes\"> | Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiUniqueFlowsStrategyResponse", + "text": "NetworkKpiUniqueFlowsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"uniqueFlowId\"> | Pick<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse", + "text": "NetworkKpiUniquePrivateIpsStrategyResponse" + }, + ", \"id\" | \"inspect\" | \"total\" | \"loaded\" | \"isRunning\" | \"isPartial\" | \"isRestored\" | \"uniqueSourcePrivateIps\" | \"uniqueSourcePrivateIpsHistogram\" | \"uniqueDestinationPrivateIps\" | \"uniqueDestinationPrivateIpsHistogram\">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/index.ts", + "lineNumber": 32 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiTlsHandshakesRequestOptions", + "type": "Type", + "tags": [], + "label": "NetworkKpiTlsHandshakesRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/tls_handshakes/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniqueFlowsRequestOptions", + "type": "Type", + "tags": [], + "label": "NetworkKpiUniqueFlowsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_flows/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkKpiUniquePrivateIpsRequestOptions", + "type": "Type", + "tags": [], + "label": "NetworkKpiUniquePrivateIpsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 17 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkOverviewRequestOptions", + "type": "Type", + "tags": [], + "label": "NetworkOverviewRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/overview/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NetworkTlsFields", + "type": "string", + "tags": [], + "label": "NetworkTlsFields", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/tls/index.ts", + "lineNumber": 42 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.NotesAndPinnedEventsByTimelineId", + "type": "Type", + "tags": [], + "label": "NotesAndPinnedEventsByTimelineId", + "description": [], + "signature": [ + "{ [x: string]: { notes: ", + "NoteSavedObject", + "[]; pinnedEvents: ", + "PinnedEventSavedObject", + "[]; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 434 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnChangePage", + "type": "Type", + "tags": [], + "label": "OnChangePage", + "description": [ + "Invoked when a user clicks to load more item" + ], + "signature": [ + "(nextPage: number) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 76 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnColumnRemoved", + "type": "Type", + "tags": [], + "label": "OnColumnRemoved", + "description": [], + "signature": [ + "(columnId: string) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 71 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnColumnResized", + "type": "Type", + "tags": [], + "label": "OnColumnResized", + "description": [], + "signature": [ + "({ columnId, delta }: { columnId: string; delta: number; }) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 73 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnColumnSorted", + "type": "Type", + "tags": [], + "label": "OnColumnSorted", + "description": [ + "Invoked when a column is sorted" + ], + "signature": [ + "(sorted: { columnId: string; sortDirection: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortDirection", + "text": "SortDirection" + }, + "; }) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 65 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnColumnsSorted", + "type": "Type", + "tags": [], + "label": "OnColumnsSorted", + "description": [], + "signature": [ + "(sorted: { columnId: string; sortDirection: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortDirection", + "text": "SortDirection" + }, + "; }[]) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 67 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnPinEvent", + "type": "Type", + "tags": [], + "label": "OnPinEvent", + "description": [ + "Invoked when a user pins an event" + ], + "signature": [ + "(eventId: string) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 94 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnRowSelected", + "type": "Type", + "tags": [], + "label": "OnRowSelected", + "description": [ + "Invoked when a user checks/un-checks a row" + ], + "signature": [ + "({ eventIds, isSelected, }: { eventIds: string[]; isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 79 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnSelectAll", + "type": "Type", + "tags": [], + "label": "OnSelectAll", + "description": [ + "Invoked when a user checks/un-checks the select all checkbox" + ], + "signature": [ + "({ isSelected }: { isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 88 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnUnPinEvent", + "type": "Type", + "tags": [], + "label": "OnUnPinEvent", + "description": [ + "Invoked when a user unpins an event" + ], + "signature": [ + "(eventId: string) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 97 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.OnUpdateColumns", + "type": "Type", + "tags": [], + "label": "OnUpdateColumns", + "description": [ + "Invoked when columns are updated" + ], + "signature": [ + "(columns: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]) => void" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 91 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ProcessHits", + "type": "Type", + "tags": [], + "label": "ProcessHits", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.Hits", + "text": "Hits" + }, + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TotalHit", + "text": "TotalHit" + }, + ", ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessHit", + "text": "HostsUncommonProcessHit" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/hosts/uncommon_processes/index.ts", + "lineNumber": 65 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.QueryOperator", + "type": "Type", + "tags": [], + "label": "QueryOperator", + "description": [ + "The operator applied to a field" + ], + "signature": [ + "\":\" | \":*\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 17 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ResponseFavoriteTimeline", + "type": "Type", + "tags": [], + "label": "ResponseFavoriteTimeline", + "description": [], + "signature": [ + "{ savedObjectId?: string | undefined; version?: string | undefined; code?: number | null | undefined; message?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; favorite?: { fullName?: string | null | undefined; userName?: string | null | undefined; favoriteDate?: number | null | undefined; }[] | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 555 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ResponseTimelines", + "type": "Type", + "tags": [], + "label": "ResponseTimelines", + "description": [], + "signature": [ + "{ timeline: ({ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; })[]; totalCount: number; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 573 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RowCellRender", + "type": "Type", + "tags": [], + "label": "RowCellRender", + "description": [], + "signature": [ + "((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.Component<Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">, any, any>) | ((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => JSX.Element) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.Component<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ", any, any>) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => JSX.Element)" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 63 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SavedTimeline", + "type": "Type", + "tags": [], + "label": "SavedTimeline", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 297 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SavedTimelineNote", + "type": "Type", + "tags": [], + "label": "SavedTimelineNote", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 299 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SearchHit", + "type": "Type", + "tags": [], + "label": "SearchHit", + "description": [], + "signature": [ + "SearchHit", + "<object>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SingleTimelineResponse", + "type": "Type", + "tags": [], + "label": "SingleTimelineResponse", + "description": [], + "signature": [ + "{ data: { getOneTimeline: { columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 369 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.Sort", + "type": "Type", + "tags": [], + "label": "Sort", + "description": [], + "signature": [ + "{ columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 182 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SortDirection", + "type": "Type", + "tags": [], + "label": "SortDirection", + "description": [], + "signature": [ + "\"none\" | \"asc\" | \"desc\" | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/store.ts", + "lineNumber": 33 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.StrategyRequestType", + "type": "Type", + "tags": [], + "label": "StrategyRequestType", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".hosts ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsRequestOptions", + "text": "HostsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".details ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostDetailsRequestOptions", + "text": "HostDetailsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".overview ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".authentications ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAuthenticationsRequestOptions", + "text": "HostAuthenticationsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".firstOrLastSeen ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostFirstLastSeenRequestOptions", + "text": "HostFirstLastSeenRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".uncommonProcesses ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessesRequestOptions", + "text": "HostsUncommonProcessesRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + ".kpiAuthentications ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + ".kpiHosts ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + ".kpiUniqueIps ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".details ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetailsRequestOptions", + "text": "NetworkDetailsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".dns ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsRequestOptions", + "text": "NetworkDnsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".http ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHttpRequestOptions", + "text": "NetworkHttpRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".overview ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".tls ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsRequestOptions", + "text": "NetworkTlsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".topCountries ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopCountriesRequestOptions", + "text": "NetworkTopCountriesRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".topNFlow ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopNFlowRequestOptions", + "text": "NetworkTopNFlowRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".users ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersRequestOptions", + "text": "NetworkUsersRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".dns ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".networkEvents ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".tlsHandshakes ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".uniqueFlows ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".uniquePrivateIps ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RequestBasicOptions", + "text": "RequestBasicOptions" + }, + " : T extends \"matrixHistogram\" ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramRequestOptions", + "text": "MatrixHistogramRequestOptions" + }, + " : T extends ", + "CtiQueries", + " ? ", + "CtiEventEnrichmentRequestOptions", + " : never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 158 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.StrategyResponseType", + "type": "Type", + "tags": [], + "label": "StrategyResponseType", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".hosts ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsStrategyResponse", + "text": "HostsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".details ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostDetailsStrategyResponse", + "text": "HostDetailsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".overview ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsOverviewStrategyResponse", + "text": "HostsOverviewStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".authentications ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostAuthenticationsStrategyResponse", + "text": "HostAuthenticationsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".firstOrLastSeen ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostFirstLastSeenStrategyResponse", + "text": "HostFirstLastSeenStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsQueries", + "text": "HostsQueries" + }, + ".uncommonProcesses ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsUncommonProcessesStrategyResponse", + "text": "HostsUncommonProcessesStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + ".kpiAuthentications ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiAuthenticationsStrategyResponse", + "text": "HostsKpiAuthenticationsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + ".kpiHosts ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiHostsStrategyResponse", + "text": "HostsKpiHostsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiQueries", + "text": "HostsKpiQueries" + }, + ".kpiUniqueIps ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.HostsKpiUniqueIpsStrategyResponse", + "text": "HostsKpiUniqueIpsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".details ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDetailsStrategyResponse", + "text": "NetworkDetailsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".dns ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkDnsStrategyResponse", + "text": "NetworkDnsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".http ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkHttpStrategyResponse", + "text": "NetworkHttpStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".overview ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkOverviewStrategyResponse", + "text": "NetworkOverviewStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".tls ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTlsStrategyResponse", + "text": "NetworkTlsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".topCountries ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopCountriesStrategyResponse", + "text": "NetworkTopCountriesStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".topNFlow ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkTopNFlowStrategyResponse", + "text": "NetworkTopNFlowStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkQueries", + "text": "NetworkQueries" + }, + ".users ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkUsersStrategyResponse", + "text": "NetworkUsersStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".dns ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiDnsStrategyResponse", + "text": "NetworkKpiDnsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".networkEvents ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiNetworkEventsStrategyResponse", + "text": "NetworkKpiNetworkEventsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".tlsHandshakes ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiTlsHandshakesStrategyResponse", + "text": "NetworkKpiTlsHandshakesStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".uniqueFlows ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiUniqueFlowsStrategyResponse", + "text": "NetworkKpiUniqueFlowsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiQueries", + "text": "NetworkKpiQueries" + }, + ".uniquePrivateIps ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.NetworkKpiUniquePrivateIpsStrategyResponse", + "text": "NetworkKpiUniquePrivateIpsStrategyResponse" + }, + " : T extends \"matrixHistogram\" ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.MatrixHistogramStrategyResponse", + "text": "MatrixHistogramStrategyResponse" + }, + " : T extends ", + "CtiQueries", + " ? ", + "CtiEventEnrichmentStrategyResponse", + " : never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts", + "lineNumber": 108 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.StringOrNumber", + "type": "Type", + "tags": [], + "label": "StringOrNumber", + "description": [], + "signature": [ + "string | number" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/common/index.ts", + "lineNumber": 75 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TemplateTimelineTypeLiteral", + "type": "Type", + "tags": [], + "label": "TemplateTimelineTypeLiteral", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 247 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TemplateTimelineTypeLiteralWithNull", + "type": "Type", + "tags": [], + "label": "TemplateTimelineTypeLiteralWithNull", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 248 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineErrorResponse", + "type": "Type", + "tags": [], + "label": "TimelineErrorResponse", + "description": [], + "signature": [ + "{ status_code: number; message: string; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 393 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineEventsType", + "type": "Type", + "tags": [], + "label": "TimelineEventsType", + "description": [], + "signature": [ + "\"all\" | \"custom\" | \"raw\" | \"alert\" | \"eql\" | \"signal\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 451 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineExpandedDetail", + "type": "Type", + "tags": [], + "label": "TimelineExpandedDetail", + "description": [], + "signature": [ + "{ query?: { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; } | undefined; graph?: { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; } | undefined; notes?: { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; } | undefined; pinned?: { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; } | undefined; eql?: { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 498 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineExpandedDetailType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedDetailType", + "description": [], + "signature": [ + "{ panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 493 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineExpandedEventType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedEventType", + "description": [], + "signature": [ + "{ panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | Record<any, never>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 464 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineExpandedHostType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedHostType", + "description": [], + "signature": [ + "Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 474 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineExpandedNetworkType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedNetworkType", + "description": [], + "signature": [ + "Record<any, never> | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 483 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineFactoryQueryTypes", + "type": "Type", + "tags": [], + "label": "TimelineFactoryQueryTypes", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineIdLiteral", + "type": "Type", + "tags": [], + "label": "TimelineIdLiteral", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageEvents | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageExternalAlerts | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsRulesDetailsPage | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsPage | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".networkPageExternalAlerts | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".active | ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".test" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 327 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResponse", + "type": "Type", + "tags": [], + "label": "TimelineResponse", + "description": [], + "signature": [ + "{ data: { persistTimeline: { code?: number | null | undefined; message?: string | null | undefined; } & { timeline: { columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }; }; }; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 394 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineSavedObject", + "type": "Type", + "tags": [], + "label": "TimelineSavedObject", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 359 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineStatusLiteral", + "type": "Type", + "tags": [], + "label": "TimelineStatusLiteral", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 202 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineStatusLiteralWithNull", + "type": "Type", + "tags": [], + "label": "TimelineStatusLiteralWithNull", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 203 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineStrategyRequestType", + "type": "Type", + "tags": [], + "label": "TimelineStrategyRequestType", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".all ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllRequestOptions", + "text": "TimelineEventsAllRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".details ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsRequestOptions", + "text": "TimelineEventsDetailsRequestOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".kpi ? ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".lastEventTime ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeRequestOptions", + "text": "TimelineEventsLastEventTimeRequestOptions" + }, + " : never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 68 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineStrategyResponseType", + "type": "Type", + "tags": [], + "label": "TimelineStrategyResponseType", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".all ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllStrategyResponse", + "text": "TimelineEventsAllStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".details ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsStrategyResponse", + "text": "TimelineEventsDetailsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".kpi ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineKpiStrategyResponse", + "text": "TimelineKpiStrategyResponse" + }, + " : T extends ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".lastEventTime ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeStrategyResponse", + "text": "TimelineEventsLastEventTimeStrategyResponse" + }, + " : never" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/timeline/index.ts", + "lineNumber": 56 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineTypeLiteral", + "type": "Type", + "tags": [], + "label": "TimelineTypeLiteral", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + } + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 268 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineTypeLiteralWithNull", + "type": "Type", + "tags": [], + "label": "TimelineTypeLiteralWithNull", + "description": [], + "signature": [ + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 269 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.ToggleDetailPanel", + "type": "Type", + "tags": [], + "label": "ToggleDetailPanel", + "description": [], + "signature": [ + "({ panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } & { tabType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; }) | (Record<any, never> & { tabType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; }) | ({ panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } & { tabType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; }) | ({ panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.FlowTarget", + "text": "FlowTarget" + }, + "; } | undefined; } & { tabType?: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; })" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 502 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.UniquePrivateAttributeQuery", + "type": "Type", + "tags": [], + "label": "UniquePrivateAttributeQuery", + "description": [], + "signature": [ + "\"source\" | \"destination\"" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/security_solution/network/kpi/unique_private_ips/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.AllTimelineSavedObjectRuntimeType", + "type": "Object", + "tags": [], + "label": "AllTimelineSavedObjectRuntimeType", + "description": [ + "\nAll Timeline Saved object type with metadata" + ], + "signature": [ + "TypeC", + "<{ total: ", + "NumberC", + "; data: ", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 400 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.allTimelinesResponse", + "type": "Object", + "tags": [], + "label": "allTimelinesResponse", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ timeline: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>>; totalCount: ", + "NumberC", + "; }>, ", + "TypeC", + "<{ defaultTimelineCount: ", + "NumberC", + "; templateTimelineCount: ", + "NumberC", + "; elasticTemplateTimelineCount: ", + "NumberC", + "; customTemplateTimelineCount: ", + "NumberC", + "; favoriteCount: ", + "NumberC", + "; }>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 575 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.DataProviderTypeLiteralRt", + "type": "Object", + "tags": [], + "label": "DataProviderTypeLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 75 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.direction", + "type": "Object", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".asc>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".desc>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 526 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EMPTY_BROWSER_FIELDS", + "type": "Object", + "tags": [], + "label": "EMPTY_BROWSER_FIELDS", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 84 + }, + "deprecated": false, + "children": [], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EMPTY_INDEX_PATTERN", + "type": "Object", + "tags": [], + "label": "EMPTY_INDEX_PATTERN", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 86 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "securitySolution", + "id": "def-common.EMPTY_INDEX_PATTERN.fields", + "type": "Array", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "never[]" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 87 + }, + "deprecated": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.EMPTY_INDEX_PATTERN.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "source": { + "path": "x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts", + "lineNumber": 88 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.getTimelinesArgs", + "type": "Object", + "tags": [], + "label": "getTimelinesArgs", + "description": [], + "signature": [ + "PartialC", + "<{ onlyUserFavorite: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; pageInfo: ", + "UnionC", + "<[", + "TypeC", + "<{ pageIndex: ", + "NumberC", + "; pageSize: ", + "NumberC", + "; }>, ", + "NullC", + "]>; search: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "TypeC", + "<{ sortField: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".title>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".description>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".updated>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".created>]>; sortOrder: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".asc>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".desc>]>; }>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 557 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.importTimelineResultSchema", + "type": "Object", + "tags": [], + "label": "importTimelineResultSchema", + "description": [], + "signature": [ + "ExactC", + "<", + "TypeC", + "<{ success: ", + "BooleanC", + "; success_count: ", + "Type", + "<number, number, unknown>; timelines_installed: ", + "Type", + "<number, number, unknown>; timelines_updated: ", + "Type", + "<number, number, unknown>; errors: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "ExactC", + "<", + "PartialC", + "<{ id: ", + "StringC", + "; rule_id: ", + "StringC", + "; }>>, ", + "ExactC", + "<", + "TypeC", + "<{ error: ", + "TypeC", + "<{ status_code: ", + "Type", + "<number, number, unknown>; message: ", + "StringC", + "; }>; }>>]>>; }>>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 439 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.pageInfoTimeline", + "type": "Object", + "tags": [], + "label": "pageInfoTimeline", + "description": [], + "signature": [ + "TypeC", + "<{ pageIndex: ", + "NumberC", + "; pageSize: ", + "NumberC", + "; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 507 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.responseFavoriteTimeline", + "type": "Object", + "tags": [], + "label": "responseFavoriteTimeline", + "description": [], + "signature": [ + "PartialC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; code: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; message: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 544 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.RowRendererIdRuntimeType", + "type": "Object", + "tags": [], + "label": "RowRendererIdRuntimeType", + "description": [], + "signature": [ + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 227 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SavedTimelineRuntimeType", + "type": "Object", + "tags": [], + "label": "SavedTimelineRuntimeType", + "description": [], + "signature": [ + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 271 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.SingleTimelineResponseType", + "type": "Object", + "tags": [], + "label": "SingleTimelineResponseType", + "description": [], + "signature": [ + "TypeC", + "<{ data: ", + "TypeC", + "<{ getOneTimeline: ", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>; }>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 363 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.sortFieldTimeline", + "type": "Object", + "tags": [], + "label": "sortFieldTimeline", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".title>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".description>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".updated>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".created>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 519 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.sortTimeline", + "type": "Object", + "tags": [], + "label": "sortTimeline", + "description": [], + "signature": [ + "TypeC", + "<{ sortField: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".title>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".description>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".updated>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".created>]>; sortOrder: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".asc>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".desc>]>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 531 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TemplateTimelineTypeLiteralRt", + "type": "Object", + "tags": [], + "label": "TemplateTimelineTypeLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".elastic>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".custom>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 238 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TemplateTimelineTypeLiteralWithNullRt", + "type": "Object", + "tags": [], + "label": "TemplateTimelineTypeLiteralWithNullRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".elastic>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".custom>]>, ", + "NullC", + "]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 243 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineErrorResponseType", + "type": "Object", + "tags": [], + "label": "TimelineErrorResponseType", + "description": [], + "signature": [ + "TypeC", + "<{ status_code: ", + "NumberC", + "; message: ", + "StringC", + "; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 388 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineIdLiteralRt", + "type": "Object", + "tags": [], + "label": "TimelineIdLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageEvents>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageExternalAlerts>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsRulesDetailsPage>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsPage>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".networkPageExternalAlerts>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".test>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 317 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineResponseType", + "type": "Object", + "tags": [], + "label": "TimelineResponseType", + "description": [ + "\nAll Timeline Saved object type with metadata" + ], + "signature": [ + "TypeC", + "<{ data: ", + "TypeC", + "<{ persistTimeline: ", + "IntersectionC", + "<[", + "PartialC", + "<{ code: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; message: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ timeline: ", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>; }>]>; }>; }>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 374 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineSavedObjectRuntimeType", + "type": "Object", + "tags": [], + "label": "TimelineSavedObjectRuntimeType", + "description": [ + "\nTimeline Saved object type with metadata" + ], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ id: ", + "StringC", + "; attributes: ", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ savedObjectId: ", + "StringC", + "; }>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 333 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineSavedToReturnObjectRuntimeType", + "type": "Object", + "tags": [], + "label": "TimelineSavedToReturnObjectRuntimeType", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 344 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineStatusLiteralRt", + "type": "Object", + "tags": [], + "label": "TimelineStatusLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 194 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineTypeLiteralRt", + "type": "Object", + "tags": [], + "label": "TimelineTypeLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 261 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "securitySolution", + "id": "def-common.TimelineTypeLiteralWithNullRt", + "type": "Object", + "tags": [], + "label": "TimelineTypeLiteralWithNullRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>]>, ", + "NullC", + "]>" + ], + "source": { + "path": "x-pack/plugins/security_solution/common/types/timeline/index.ts", + "lineNumber": 266 + }, + "deprecated": false, + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 0667a98e3762bf..26a12f990db1a1 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import securitySolutionObj from './security_solution.json'; @@ -19,7 +18,7 @@ import securitySolutionObj from './security_solution.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 32 | 0 | 32 | 6 | +| 1179 | 8 | 1130 | 27 | ## Client @@ -29,6 +28,9 @@ import securitySolutionObj from './security_solution.json'; ### Classes <DocDefinitionList data={securitySolutionObj.client.classes}/> +### Consts, variables and types +<DocDefinitionList data={securitySolutionObj.client.misc}/> + ## Server ### Setup @@ -46,3 +48,20 @@ import securitySolutionObj from './security_solution.json'; ### Consts, variables and types <DocDefinitionList data={securitySolutionObj.server.misc}/> +## Common + +### Objects +<DocDefinitionList data={securitySolutionObj.common.objects}/> + +### Functions +<DocDefinitionList data={securitySolutionObj.common.functions}/> + +### Interfaces +<DocDefinitionList data={securitySolutionObj.common.interfaces}/> + +### Enums +<DocDefinitionList data={securitySolutionObj.common.enums}/> + +### Consts, variables and types +<DocDefinitionList data={securitySolutionObj.common.misc}/> + diff --git a/api_docs/share.json b/api_docs/share.json index 41b7ecc38e1f05..696cfe6ef19263 100644 --- a/api_docs/share.json +++ b/api_docs/share.json @@ -406,128 +406,187 @@ "a Promise that resolves when all the downloads have been correctly started" ], "initialIsOpen": false - } - ], - "interfaces": [ + }, { "parentPluginId": "share", - "id": "def-public.ShareContext", - "type": "Interface", + "id": "def-public.useLocatorUrl", + "type": "Function", "tags": [], - "label": "ShareContext", + "label": "useLocatorUrl", "description": [], + "signature": [ + "<P extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + ">(locator: ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<P> | null | undefined, params: P, getUrlParams?: ", + "LocatorGetUrlParams", + " | undefined, deps?: React.DependencyList) => string" + ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 23 + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 14 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.ShareContext.objectType", - "type": "string", + "id": "def-public.useLocatorUrl.$1", + "type": "CompoundType", "tags": [], - "label": "objectType", + "label": "locator", "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<P> | null | undefined" + ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 24 + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 15 }, - "deprecated": false + "deprecated": false, + "isRequired": false }, { "parentPluginId": "share", - "id": "def-public.ShareContext.objectId", - "type": "string", + "id": "def-public.useLocatorUrl.$2", + "type": "Uncategorized", "tags": [], - "label": "objectId", + "label": "params", "description": [], "signature": [ - "string | undefined" + "P" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 25 + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 16 }, - "deprecated": false + "deprecated": false, + "isRequired": true }, { "parentPluginId": "share", - "id": "def-public.ShareContext.shareableUrl", - "type": "string", + "id": "def-public.useLocatorUrl.$3", + "type": "Object", "tags": [], - "label": "shareableUrl", - "description": [ - "\nCurrent url for sharing. This can be set in cases where `window.location.href`\ndoes not contain a shareable URL (e.g. if using session storage to store the current\napp state is enabled). In these cases the property should contain the URL in a\nformat which makes it possible to use it without having access to any other state\nlike the current session.\n\nIf not set it will default to `window.location.href`" + "label": "getUrlParams", + "description": [], + "signature": [ + "LocatorGetUrlParams", + " | undefined" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 35 + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 17 }, - "deprecated": false + "deprecated": false, + "isRequired": false }, { "parentPluginId": "share", - "id": "def-public.ShareContext.sharingData", + "id": "def-public.useLocatorUrl.$4", "type": "Object", "tags": [], - "label": "sharingData", + "label": "deps", "description": [], "signature": [ - "{ [key: string]: unknown; }" + "React.DependencyList" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 36 + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 18 }, - "deprecated": false - }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "share", + "id": "def-public.KibanaLocation", + "type": "Interface", + "tags": [], + "label": "KibanaLocation", + "description": [ + "\nThis interface represents a location in Kibana to which one can navigate\nusing the `core.application.navigateToApp()` method." + ], + "signature": [ + "KibanaLocation", + "<S>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 110 + }, + "deprecated": false, + "children": [ { "parentPluginId": "share", - "id": "def-public.ShareContext.isDirty", - "type": "boolean", + "id": "def-public.KibanaLocation.app", + "type": "string", "tags": [], - "label": "isDirty", - "description": [], + "label": "app", + "description": [ + "\nKibana application ID." + ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 37 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 114 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.ShareContext.onClose", - "type": "Function", + "id": "def-public.KibanaLocation.path", + "type": "string", "tags": [], - "label": "onClose", - "description": [], - "signature": [ - "() => void" + "label": "path", + "description": [ + "\nA relative URL path within a Kibana application." ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 38 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 119 }, - "deprecated": false, - "returnComment": [], - "children": [] + "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.ShareContext.showPublicUrlSwitch", - "type": "Function", + "id": "def-public.KibanaLocation.state", + "type": "Uncategorized", "tags": [], - "label": "showPublicUrlSwitch", - "description": [], + "label": "state", + "description": [ + "\nA serializable location state object, which the app can use to determine\nwhat should be displayed on the screen." + ], "signature": [ - "((anonymousUserCapabilities: ", - "Capabilities", - ") => boolean) | undefined" + "S" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 39 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 125 }, "deprecated": false } @@ -536,193 +595,363 @@ }, { "parentPluginId": "share", - "id": "def-public.ShareContextMenuPanelItem", + "id": "def-public.LocatorDefinition", "type": "Interface", "tags": [], - "label": "ShareContextMenuPanelItem", - "description": [], + "label": "LocatorDefinition", + "description": [ + "\nA convenience interface used to define and register a locator." + ], "signature": [ { "pluginId": "share", - "scope": "public", + "scope": "common", "docId": "kibSharePluginApi", - "section": "def-public.ShareContextMenuPanelItem", - "text": "ShareContextMenuPanelItem" + "section": "def-common.LocatorDefinition", + "text": "LocatorDefinition" }, - " extends Pick<", - "EuiContextMenuPanelItemDescriptorEntry", - ", \"onClick\" | \"key\" | \"size\" | \"className\" | \"aria-label\" | \"data-test-subj\" | \"disabled\" | \"target\" | \"href\" | \"icon\" | \"rel\" | \"buttonRef\" | \"toolTipContent\" | \"toolTipTitle\" | \"toolTipPosition\" | \"layoutAlign\" | \"panel\">" + "<P> extends Partial<", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.PersistableState", + "text": "PersistableState" + }, + "<P>>" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 48 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 34 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.ShareContextMenuPanelItem.name", + "id": "def-public.LocatorDefinition.id", "type": "string", "tags": [], - "label": "name", - "description": [], + "label": "id", + "description": [ + "\nUnique ID of the locator. Should be constant and unique across Kibana." + ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 50 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 39 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.ShareContextMenuPanelItem.sortOrder", - "type": "number", + "id": "def-public.LocatorDefinition.getLocation", + "type": "Function", "tags": [], - "label": "sortOrder", - "description": [], + "label": "getLocation", + "description": [ + "\nReturns a deep link, including location state, which can be used for\nnavigation in Kibana.\n" + ], "signature": [ - "number | undefined" + "(params: P) => Promise<", + "KibanaLocation", + "<object>>" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 51 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 47 }, - "deprecated": false + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.LocatorDefinition.getLocation.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "Parameters from which to generate a Kibana location." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 47 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false }, { "parentPluginId": "share", - "id": "def-public.ShareMenuItem", + "id": "def-public.LocatorPublic", "type": "Interface", "tags": [], - "label": "ShareMenuItem", - "description": [], + "label": "LocatorPublic", + "description": [ + "\nPublic interface of a registered locator." + ], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<P> extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.PersistableState", + "text": "PersistableState" + }, + "<P>" + ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 59 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 53 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.ShareMenuItem.shareMenuItem", - "type": "Object", + "id": "def-public.LocatorPublic.getLocation", + "type": "Function", "tags": [], - "label": "shareMenuItem", - "description": [], + "label": "getLocation", + "description": [ + "\nReturns a reference to a Kibana client-side location.\n" + ], "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.ShareContextMenuPanelItem", - "text": "ShareContextMenuPanelItem" - } + "(params: P) => Promise<", + "KibanaLocation", + "<object>>" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 60 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 59 }, - "deprecated": false + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.LocatorPublic.getLocation.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "URL locator parameters." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 59 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] }, { "parentPluginId": "share", - "id": "def-public.ShareMenuItem.panel", - "type": "Object", + "id": "def-public.LocatorPublic.getUrl", + "type": "Function", "tags": [], - "label": "panel", - "description": [], + "label": "getUrl", + "description": [ + "\nReturns a URL as a string.\n" + ], "signature": [ - "EuiContextMenuPanelDescriptor" + "(params: P, getUrlParams?: ", + "LocatorGetUrlParams", + " | undefined) => Promise<string>" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 61 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 67 }, - "deprecated": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "share", - "id": "def-public.ShareMenuProvider", - "type": "Interface", - "tags": [], - "label": "ShareMenuProvider", - "description": [], - "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 71 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.ShareMenuProvider.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 72 - }, - "deprecated": false + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.LocatorPublic.getUrl.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "URL locator parameters." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 67 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "share", + "id": "def-public.LocatorPublic.getUrl.$2", + "type": "Object", + "tags": [], + "label": "getUrlParams", + "description": [ + "URL construction parameters." + ], + "signature": [ + "LocatorGetUrlParams", + " | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 67 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] }, { "parentPluginId": "share", - "id": "def-public.ShareMenuProvider.getShareMenuItems", + "id": "def-public.LocatorPublic.navigate", "type": "Function", "tags": [], - "label": "getShareMenuItems", - "description": [], + "label": "navigate", + "description": [ + "\nNavigate using the `core.application.navigateToApp()` method to a Kibana\nlocation generated by this locator. This method is available only on the\nbrowser.\n" + ], "signature": [ - "(context: ", + "(params: P, navigationParams?: ", + "LocatorNavigationParams", + " | undefined) => Promise<void>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 77 + }, + "deprecated": false, + "children": [ { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.ShareContext", - "text": "ShareContext" + "parentPluginId": "share", + "id": "def-public.LocatorPublic.navigate.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "URL locator parameters." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 77 + }, + "deprecated": false, + "isRequired": true }, - ") => ", { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.ShareMenuItem", - "text": "ShareMenuItem" - }, - "[]" + "parentPluginId": "share", + "id": "def-public.LocatorPublic.navigate.$2", + "type": "Object", + "tags": [], + "label": "navigationParams", + "description": [ + "Navigation parameters." + ], + "signature": [ + "LocatorNavigationParams", + " | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 77 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "share", + "id": "def-public.LocatorPublic.useUrl", + "type": "Function", + "tags": [], + "label": "useUrl", + "description": [ + "\nReact hook which returns a URL string given locator parameters. Returns\nempty string if URL is being loaded or an error happened." + ], + "signature": [ + "(params: P, getUrlParams?: ", + "LocatorGetUrlParams", + " | undefined, deps?: React.DependencyList | undefined) => string" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 74 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 }, "deprecated": false, "returnComment": [], "children": [ { "parentPluginId": "share", - "id": "def-public.context", + "id": "def-public.params", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.getUrlParams", "type": "Object", "tags": [], - "label": "context", + "label": "getUrlParams", "description": [], "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.ShareContext", - "text": "ShareContext" - } + "LocatorGetUrlParams", + " | undefined" ], "source": { - "path": "src/plugins/share/public/types.ts", - "lineNumber": 74 + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.deps", + "type": "Object", + "tags": [], + "label": "deps", + "description": [], + "signature": [ + "React.DependencyList | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 }, "deprecated": false } @@ -733,91 +962,123 @@ }, { "parentPluginId": "share", - "id": "def-public.ShowShareMenuOptions", + "id": "def-public.ShareContext", "type": "Interface", "tags": [], - "label": "ShowShareMenuOptions", + "label": "ShareContext", "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.ShowShareMenuOptions", - "text": "ShowShareMenuOptions" - }, - " extends Pick<", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.ShareContext", - "text": "ShareContext" - }, - ", \"objectType\" | \"objectId\" | \"shareableUrl\" | \"sharingData\" | \"isDirty\" | \"showPublicUrlSwitch\">" - ], "source": { "path": "src/plugins/share/public/types.ts", - "lineNumber": 87 + "lineNumber": 23 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.ShowShareMenuOptions.anchorElement", - "type": "Object", + "id": "def-public.ShareContext.objectType", + "type": "string", "tags": [], - "label": "anchorElement", + "label": "objectType", + "description": [], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.ShareContext.objectId", + "type": "string", + "tags": [], + "label": "objectId", "description": [], "signature": [ - "HTMLElement" + "string | undefined" ], "source": { "path": "src/plugins/share/public/types.ts", - "lineNumber": 88 + "lineNumber": 25 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.ShowShareMenuOptions.allowEmbed", - "type": "boolean", + "id": "def-public.ShareContext.shareableUrl", + "type": "string", "tags": [], - "label": "allowEmbed", + "label": "shareableUrl", + "description": [ + "\nCurrent url for sharing. This can be set in cases where `window.location.href`\ndoes not contain a shareable URL (e.g. if using session storage to store the current\napp state is enabled). In these cases the property should contain the URL in a\nformat which makes it possible to use it without having access to any other state\nlike the current session.\n\nIf not set it will default to `window.location.href`" + ], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.ShareContext.sharingData", + "type": "Object", + "tags": [], + "label": "sharingData", "description": [], + "signature": [ + "{ [key: string]: unknown; }" + ], "source": { "path": "src/plugins/share/public/types.ts", - "lineNumber": 89 + "lineNumber": 36 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.ShowShareMenuOptions.allowShortUrl", + "id": "def-public.ShareContext.isDirty", "type": "boolean", "tags": [], - "label": "allowShortUrl", + "label": "isDirty", "description": [], "source": { "path": "src/plugins/share/public/types.ts", - "lineNumber": 90 + "lineNumber": 37 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.ShowShareMenuOptions.embedUrlParamExtensions", - "type": "Array", + "id": "def-public.ShareContext.onClose", + "type": "Function", "tags": [], - "label": "embedUrlParamExtensions", + "label": "onClose", "description": [], "signature": [ - "UrlParamExtension", - "[] | undefined" + "() => void" ], "source": { "path": "src/plugins/share/public/types.ts", - "lineNumber": 91 + "lineNumber": 38 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "share", + "id": "def-public.ShareContext.showPublicUrlSwitch", + "type": "Function", + "tags": [], + "label": "showPublicUrlSwitch", + "description": [], + "signature": [ + "((anonymousUserCapabilities: ", + "Capabilities", + ") => boolean) | undefined" + ], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 39 }, "deprecated": false } @@ -826,266 +1087,407 @@ }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract", + "id": "def-public.ShareContextMenuPanelItem", "type": "Interface", "tags": [], - "label": "UrlGeneratorContract", + "label": "ShareContextMenuPanelItem", "description": [], "signature": [ { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorContract", - "text": "UrlGeneratorContract" + "section": "def-public.ShareContextMenuPanelItem", + "text": "ShareContextMenuPanelItem" }, - "<Id>" + " extends Pick<", + "EuiContextMenuPanelItemDescriptorEntry", + ", \"onClick\" | \"key\" | \"size\" | \"className\" | \"aria-label\" | \"data-test-subj\" | \"disabled\" | \"target\" | \"href\" | \"icon\" | \"rel\" | \"buttonRef\" | \"toolTipContent\" | \"toolTipTitle\" | \"toolTipPosition\" | \"layoutAlign\" | \"panel\">" ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 11 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 48 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.id", - "type": "Uncategorized", + "id": "def-public.ShareContextMenuPanelItem.name", + "type": "string", "tags": [], - "label": "id", + "label": "name", "description": [], - "signature": [ - "Id" - ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 12 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 50 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.createUrl", - "type": "Function", + "id": "def-public.ShareContextMenuPanelItem.sortOrder", + "type": "number", "tags": [], - "label": "createUrl", + "label": "sortOrder", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 51 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "share", + "id": "def-public.ShareMenuItem", + "type": "Interface", + "tags": [], + "label": "ShareMenuItem", + "description": [], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 59 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.ShareMenuItem.shareMenuItem", + "type": "Object", + "tags": [], + "label": "shareMenuItem", "description": [], "signature": [ - "(state: ", { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]) => Promise<string>" + "section": "def-public.ShareContextMenuPanelItem", + "text": "ShareContextMenuPanelItem" + } ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 13 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 60 }, - "deprecated": false, - "children": [ - { - "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.createUrl.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]" - ], - "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 13 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [] + "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.isDeprecated", - "type": "boolean", + "id": "def-public.ShareMenuItem.panel", + "type": "Object", "tags": [], - "label": "isDeprecated", + "label": "panel", "description": [], + "signature": [ + "EuiContextMenuPanelDescriptor" + ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 14 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 61 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "share", + "id": "def-public.ShareMenuProvider", + "type": "Interface", + "tags": [], + "label": "ShareMenuProvider", + "description": [], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 71 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.ShareMenuProvider.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 72 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.migrate", + "id": "def-public.ShareMenuProvider.getShareMenuItems", "type": "Function", "tags": [], - "label": "migrate", + "label": "getShareMenuItems", "description": [], "signature": [ - "(state: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]) => Promise<{ state: ", + "(context: ", { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" + "section": "def-public.ShareContext", + "text": "ShareContext" }, - "[Id][\"MigratedState\"]; id: ", + ") => ", { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" + "section": "def-public.ShareMenuItem", + "text": "ShareMenuItem" }, - "[Id][\"MigratedId\"]; }>" + "[]" ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 15 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 74 }, "deprecated": false, + "returnComment": [], "children": [ { "parentPluginId": "share", - "id": "def-public.UrlGeneratorContract.migrate.$1", - "type": "Uncategorized", + "id": "def-public.context", + "type": "Object", "tags": [], - "label": "state", + "label": "context", "description": [], "signature": [ { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]" + "section": "def-public.ShareContext", + "text": "ShareContext" + } ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", - "lineNumber": 16 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 74 }, - "deprecated": false, - "isRequired": true + "deprecated": false } - ], - "returnComment": [] + ] } ], "initialIsOpen": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition", + "id": "def-public.ShowShareMenuOptions", "type": "Interface", "tags": [], - "label": "UrlGeneratorsDefinition", + "label": "ShowShareMenuOptions", "description": [], "signature": [ { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorsDefinition", - "text": "UrlGeneratorsDefinition" + "section": "def-public.ShowShareMenuOptions", + "text": "ShowShareMenuOptions" }, - "<Id>" + " extends Pick<", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.ShareContext", + "text": "ShareContext" + }, + ", \"objectType\" | \"objectId\" | \"shareableUrl\" | \"sharingData\" | \"isDirty\" | \"showPublicUrlSwitch\">" ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 30 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 87 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.id", - "type": "Uncategorized", + "id": "def-public.ShowShareMenuOptions.anchorElement", + "type": "Object", "tags": [], - "label": "id", + "label": "anchorElement", "description": [], "signature": [ - "Id" + "HTMLElement" ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 31 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 88 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.createUrl", - "type": "Function", + "id": "def-public.ShowShareMenuOptions.allowEmbed", + "type": "boolean", "tags": [], - "label": "createUrl", + "label": "allowEmbed", "description": [], - "signature": [ - "((state: ", - { - "pluginId": "share", - "scope": "public", - "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorStateMapping", - "text": "UrlGeneratorStateMapping" - }, - "[Id][\"State\"]) => Promise<string>) | undefined" - ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 32 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 89 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.isDeprecated", - "type": "CompoundType", + "id": "def-public.ShowShareMenuOptions.allowShortUrl", + "type": "boolean", "tags": [], - "label": "isDeprecated", + "label": "allowShortUrl", "description": [], - "signature": [ - "boolean | undefined" - ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 33 + "path": "src/plugins/share/public/types.ts", + "lineNumber": 90 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorsDefinition.migrate", - "type": "Function", + "id": "def-public.ShowShareMenuOptions.embedUrlParamExtensions", + "type": "Array", "tags": [], - "label": "migrate", + "label": "embedUrlParamExtensions", "description": [], "signature": [ - "((state: ", - { + "UrlParamExtension", + "[] | undefined" + ], + "source": { + "path": "src/plugins/share/public/types.ts", + "lineNumber": 91 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract", + "type": "Interface", + "tags": [], + "label": "UrlGeneratorContract", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorContract", + "text": "UrlGeneratorContract" + }, + "<Id>" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract.id", + "type": "Uncategorized", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "Id" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract.createUrl", + "type": "Function", + "tags": [], + "label": "createUrl", + "description": [], + "signature": [ + "(state: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"State\"]) => Promise<string>" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract.createUrl.$1", + "type": "Uncategorized", + "tags": [], + "label": "state", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"State\"]" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 13 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract.isDeprecated", + "type": "boolean", + "tags": [], + "label": "isDeprecated", + "description": [], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract.migrate", + "type": "Function", + "tags": [], + "label": "migrate", + "description": [], + "signature": [ + "(state: ", + { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", @@ -1108,85 +1510,160 @@ "section": "def-public.UrlGeneratorStateMapping", "text": "UrlGeneratorStateMapping" }, - "[Id][\"MigratedId\"]; }>) | undefined" + "[Id][\"MigratedId\"]; }>" ], "source": { - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 34 + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 15 }, - "deprecated": false + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorContract.migrate.$1", + "type": "Uncategorized", + "tags": [], + "label": "state", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"State\"]" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_contract.ts", + "lineNumber": 16 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorState", + "id": "def-public.UrlGeneratorsDefinition", "type": "Interface", "tags": [], - "label": "UrlGeneratorState", + "label": "UrlGeneratorsDefinition", "description": [], "signature": [ { "pluginId": "share", "scope": "public", "docId": "kibSharePluginApi", - "section": "def-public.UrlGeneratorState", - "text": "UrlGeneratorState" + "section": "def-public.UrlGeneratorsDefinition", + "text": "UrlGeneratorsDefinition" }, - "<S, I, MS>" + "<Id>" ], "source": { "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 11 + "lineNumber": 30 }, "deprecated": false, "children": [ { "parentPluginId": "share", - "id": "def-public.UrlGeneratorState.State", + "id": "def-public.UrlGeneratorsDefinition.id", "type": "Uncategorized", "tags": [], - "label": "State", + "label": "id", "description": [], "signature": [ - "S" + "Id" ], "source": { "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 16 + "lineNumber": 31 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorState.MigratedId", - "type": "Uncategorized", + "id": "def-public.UrlGeneratorsDefinition.createUrl", + "type": "Function", "tags": [], - "label": "MigratedId", + "label": "createUrl", "description": [], "signature": [ - "I | undefined" + "((state: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"State\"]) => Promise<string>) | undefined" ], "source": { "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 17 + "lineNumber": 32 }, "deprecated": false }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorState.MigratedState", - "type": "Uncategorized", + "id": "def-public.UrlGeneratorsDefinition.isDeprecated", + "type": "CompoundType", "tags": [], - "label": "MigratedState", + "label": "isDeprecated", "description": [], "signature": [ - "MS | undefined" + "boolean | undefined" ], "source": { "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 18 + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorsDefinition.migrate", + "type": "Function", + "tags": [], + "label": "migrate", + "description": [], + "signature": [ + "((state: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"State\"]) => Promise<{ state: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"MigratedState\"]; id: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorStateMapping", + "text": "UrlGeneratorStateMapping" + }, + "[Id][\"MigratedId\"]; }>) | undefined" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", + "lineNumber": 34 }, "deprecated": false } @@ -1195,15 +1672,89 @@ }, { "parentPluginId": "share", - "id": "def-public.UrlGeneratorStateMapping", + "id": "def-public.UrlGeneratorState", "type": "Interface", "tags": [], - "label": "UrlGeneratorStateMapping", + "label": "UrlGeneratorState", "description": [], - "source": { - "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", - "lineNumber": 21 - }, + "signature": [ + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.UrlGeneratorState", + "text": "UrlGeneratorState" + }, + "<S, I, MS>" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorState.State", + "type": "Uncategorized", + "tags": [], + "label": "State", + "description": [], + "signature": [ + "S" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorState.MigratedId", + "type": "Uncategorized", + "tags": [], + "label": "MigratedId", + "description": [], + "signature": [ + "I | undefined" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorState.MigratedState", + "type": "Uncategorized", + "tags": [], + "label": "MigratedState", + "description": [], + "signature": [ + "MS | undefined" + ], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", + "lineNumber": 18 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "share", + "id": "def-public.UrlGeneratorStateMapping", + "type": "Interface", + "tags": [], + "label": "UrlGeneratorStateMapping", + "description": [], + "source": { + "path": "src/plugins/share/public/url_generators/url_generator_definition.ts", + "lineNumber": 21 + }, "deprecated": false, "children": [ { @@ -1400,12 +1951,561 @@ "initialIsOpen": false } ], - "objects": [] + "objects": [], + "setup": { + "parentPluginId": "share", + "id": "def-server.SharePluginSetup", + "type": "Interface", + "tags": [], + "label": "SharePluginSetup", + "description": [], + "source": { + "path": "src/plugins/share/server/plugin.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-server.SharePluginSetup.url", + "type": "Object", + "tags": [], + "label": "url", + "description": [], + "signature": [ + "UrlService" + ], + "source": { + "path": "src/plugins/share/server/plugin.ts", + "lineNumber": 19 + }, + "deprecated": false + } + ], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "share", + "id": "def-server.SharePluginStart", + "type": "Interface", + "tags": [], + "label": "SharePluginStart", + "description": [], + "source": { + "path": "src/plugins/share/server/plugin.ts", + "lineNumber": 23 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-server.SharePluginStart.url", + "type": "Object", + "tags": [], + "label": "url", + "description": [], + "signature": [ + "UrlService" + ], + "source": { + "path": "src/plugins/share/server/plugin.ts", + "lineNumber": 24 + }, + "deprecated": false + } + ], + "lifecycle": "start", + "initialIsOpen": true + } }, "common": { "classes": [], - "functions": [], - "interfaces": [], + "functions": [ + { + "parentPluginId": "share", + "id": "def-common.useLocatorUrl", + "type": "Function", + "tags": [], + "label": "useLocatorUrl", + "description": [], + "signature": [ + "<P extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + ">(locator: ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<P> | null | undefined, params: P, getUrlParams?: ", + "LocatorGetUrlParams", + " | undefined, deps?: React.DependencyList) => string" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.useLocatorUrl.$1", + "type": "CompoundType", + "tags": [], + "label": "locator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<P> | null | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 15 + }, + "deprecated": false, + "isRequired": false + }, + { + "parentPluginId": "share", + "id": "def-common.useLocatorUrl.$2", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 16 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "share", + "id": "def-common.useLocatorUrl.$3", + "type": "Object", + "tags": [], + "label": "getUrlParams", + "description": [], + "signature": [ + "LocatorGetUrlParams", + " | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 17 + }, + "deprecated": false, + "isRequired": false + }, + { + "parentPluginId": "share", + "id": "def-common.useLocatorUrl.$4", + "type": "Object", + "tags": [], + "label": "deps", + "description": [], + "signature": [ + "React.DependencyList" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/use_locator_url.ts", + "lineNumber": 18 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorDefinition", + "type": "Interface", + "tags": [], + "label": "LocatorDefinition", + "description": [ + "\nA convenience interface used to define and register a locator." + ], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorDefinition", + "text": "LocatorDefinition" + }, + "<P> extends Partial<", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.PersistableState", + "text": "PersistableState" + }, + "<P>>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 34 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorDefinition.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "\nUnique ID of the locator. Should be constant and unique across Kibana." + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorDefinition.getLocation", + "type": "Function", + "tags": [], + "label": "getLocation", + "description": [ + "\nReturns a deep link, including location state, which can be used for\nnavigation in Kibana.\n" + ], + "signature": [ + "(params: P) => Promise<", + "KibanaLocation", + "<object>>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 47 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorDefinition.getLocation.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "Parameters from which to generate a Kibana location." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 47 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic", + "type": "Interface", + "tags": [], + "label": "LocatorPublic", + "description": [ + "\nPublic interface of a registered locator." + ], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<P> extends ", + { + "pluginId": "kibanaUtils", + "scope": "common", + "docId": "kibKibanaUtilsPluginApi", + "section": "def-common.PersistableState", + "text": "PersistableState" + }, + "<P>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 53 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.getLocation", + "type": "Function", + "tags": [], + "label": "getLocation", + "description": [ + "\nReturns a reference to a Kibana client-side location.\n" + ], + "signature": [ + "(params: P) => Promise<", + "KibanaLocation", + "<object>>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 59 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.getLocation.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "URL locator parameters." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 59 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.getUrl", + "type": "Function", + "tags": [], + "label": "getUrl", + "description": [ + "\nReturns a URL as a string.\n" + ], + "signature": [ + "(params: P, getUrlParams?: ", + "LocatorGetUrlParams", + " | undefined) => Promise<string>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 67 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.getUrl.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "URL locator parameters." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 67 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.getUrl.$2", + "type": "Object", + "tags": [], + "label": "getUrlParams", + "description": [ + "URL construction parameters." + ], + "signature": [ + "LocatorGetUrlParams", + " | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 67 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.navigate", + "type": "Function", + "tags": [], + "label": "navigate", + "description": [ + "\nNavigate using the `core.application.navigateToApp()` method to a Kibana\nlocation generated by this locator. This method is available only on the\nbrowser.\n" + ], + "signature": [ + "(params: P, navigationParams?: ", + "LocatorNavigationParams", + " | undefined) => Promise<void>" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 77 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.navigate.$1", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [ + "URL locator parameters." + ], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 77 + }, + "deprecated": false, + "isRequired": true + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.navigate.$2", + "type": "Object", + "tags": [], + "label": "navigationParams", + "description": [ + "Navigation parameters." + ], + "signature": [ + "LocatorNavigationParams", + " | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 77 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "share", + "id": "def-common.LocatorPublic.useUrl", + "type": "Function", + "tags": [], + "label": "useUrl", + "description": [ + "\nReact hook which returns a URL string given locator parameters. Returns\nempty string if URL is being loaded or an error happened." + ], + "signature": [ + "(params: P, getUrlParams?: ", + "LocatorGetUrlParams", + " | undefined, deps?: React.DependencyList | undefined) => string" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "share", + "id": "def-common.params", + "type": "Uncategorized", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "P" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-common.getUrlParams", + "type": "Object", + "tags": [], + "label": "getUrlParams", + "description": [], + "signature": [ + "LocatorGetUrlParams", + " | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "share", + "id": "def-common.deps", + "type": "Object", + "tags": [], + "label": "deps", + "description": [], + "signature": [ + "React.DependencyList | undefined" + ], + "source": { + "path": "src/plugins/share/common/url_service/locators/types.ts", + "lineNumber": 83 + }, + "deprecated": false + } + ] + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [], "objects": [] diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 58886148bd4a7b..aa4adb67e38bf0 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import shareObj from './share.json'; @@ -19,7 +18,7 @@ import shareObj from './share.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 67 | 1 | 61 | 4 | +| 119 | 1 | 81 | 7 | ## Client @@ -43,6 +42,20 @@ import shareObj from './share.json'; ## Server +### Setup +<DocDefinitionList data={[shareObj.server.setup]}/> + +### Start +<DocDefinitionList data={[shareObj.server.start]}/> + ### Consts, variables and types <DocDefinitionList data={shareObj.server.misc}/> +## Common + +### Functions +<DocDefinitionList data={shareObj.common.functions}/> + +### Interfaces +<DocDefinitionList data={shareObj.common.interfaces}/> + diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index ab2f9175987378..a0edd266161e99 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import snapshotRestoreObj from './snapshot_restore.json'; diff --git a/api_docs/spaces.json b/api_docs/spaces.json index 002145f3b48db6..bb609d31dddb8d 100644 --- a/api_docs/spaces.json +++ b/api_docs/spaces.json @@ -682,7 +682,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 29 + "lineNumber": 35 }, "deprecated": false, "children": [ @@ -716,7 +716,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 34 + "lineNumber": 40 }, "deprecated": false, "children": [ @@ -741,7 +741,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 34 + "lineNumber": 40 }, "deprecated": false, "isRequired": false @@ -771,7 +771,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 40 + "lineNumber": 46 }, "deprecated": false, "children": [ @@ -789,7 +789,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 40 + "lineNumber": 46 }, "deprecated": false, "isRequired": true @@ -827,7 +827,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 46 + "lineNumber": 52 }, "deprecated": false, "children": [ @@ -851,7 +851,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 46 + "lineNumber": 52 }, "deprecated": false, "isRequired": true @@ -889,7 +889,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 53 + "lineNumber": 59 }, "deprecated": false, "children": [ @@ -907,7 +907,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 53 + "lineNumber": 59 }, "deprecated": false, "isRequired": true @@ -932,7 +932,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 53 + "lineNumber": 59 }, "deprecated": false, "isRequired": true @@ -954,7 +954,7 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 59 + "lineNumber": 65 }, "deprecated": false, "children": [ @@ -972,7 +972,62 @@ ], "source": { "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", - "lineNumber": 59 + "lineNumber": 65 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "spaces", + "id": "def-server.ISpacesClient.disableLegacyUrlAliases", + "type": "Function", + "tags": [], + "label": "disableLegacyUrlAliases", + "description": [ + "\nDisables the specified legacy URL aliases." + ], + "signature": [ + "(aliases: ", + { + "pluginId": "spaces", + "scope": "common", + "docId": "kibSpacesPluginApi", + "section": "def-common.LegacyUrlAliasTarget", + "text": "LegacyUrlAliasTarget" + }, + "[]) => Promise<void>" + ], + "source": { + "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", + "lineNumber": 71 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "spaces", + "id": "def-server.ISpacesClient.disableLegacyUrlAliases.$1", + "type": "Array", + "tags": [], + "label": "aliases", + "description": [ + "the aliases to disable." + ], + "signature": [ + { + "pluginId": "spaces", + "scope": "common", + "docId": "kibSpacesPluginApi", + "section": "def-common.LegacyUrlAliasTarget", + "text": "LegacyUrlAliasTarget" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/spaces/server/spaces_client/spaces_client.ts", + "lineNumber": 71 }, "deprecated": false, "isRequired": true @@ -983,6 +1038,69 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "spaces", + "id": "def-server.LegacyUrlAliasTarget", + "type": "Interface", + "tags": [], + "label": "LegacyUrlAliasTarget", + "description": [ + "\nClient interface for interacting with legacy URL aliases." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 57 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "spaces", + "id": "def-server.LegacyUrlAliasTarget.targetSpace", + "type": "string", + "tags": [], + "label": "targetSpace", + "description": [ + "\nThe namespace that the object existed in when it was converted." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 61 + }, + "deprecated": false + }, + { + "parentPluginId": "spaces", + "id": "def-server.LegacyUrlAliasTarget.targetType", + "type": "string", + "tags": [], + "label": "targetType", + "description": [ + "\nThe type of the object when it was converted." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "spaces", + "id": "def-server.LegacyUrlAliasTarget.sourceId", + "type": "string", + "tags": [], + "label": "sourceId", + "description": [ + "\nThe original ID of the object, before it was converted." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 69 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "spaces", "id": "def-server.Space", @@ -1203,7 +1321,7 @@ "plugin": "security", "link": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 267 + "lineNumber": 266 } }, { @@ -1245,7 +1363,7 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 206 + "lineNumber": 190 } }, { @@ -1369,14 +1487,14 @@ "plugin": "security", "link": { "path": "x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts", - "lineNumber": 1000 + "lineNumber": 1004 } }, { "plugin": "security", "link": { "path": "x-pack/plugins/security/server/saved_objects/secure_saved_objects_client_wrapper.ts", - "lineNumber": 1027 + "lineNumber": 1031 } }, { @@ -2002,28 +2120,28 @@ "plugin": "security", "link": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 60 + "lineNumber": 59 } }, { "plugin": "security", "link": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 267 + "lineNumber": 266 } }, { "plugin": "security", "link": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 285 + "lineNumber": 284 } }, { "plugin": "security", "link": { "path": "x-pack/plugins/security/server/plugin.ts", - "lineNumber": 301 + "lineNumber": 300 } }, { @@ -2086,7 +2204,7 @@ "plugin": "securitySolution", "link": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 206 + "lineNumber": 190 } } ] @@ -2502,6 +2620,69 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "spaces", + "id": "def-common.LegacyUrlAliasTarget", + "type": "Interface", + "tags": [], + "label": "LegacyUrlAliasTarget", + "description": [ + "\nClient interface for interacting with legacy URL aliases." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 57 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "spaces", + "id": "def-common.LegacyUrlAliasTarget.targetSpace", + "type": "string", + "tags": [], + "label": "targetSpace", + "description": [ + "\nThe namespace that the object existed in when it was converted." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 61 + }, + "deprecated": false + }, + { + "parentPluginId": "spaces", + "id": "def-common.LegacyUrlAliasTarget.targetType", + "type": "string", + "tags": [], + "label": "targetType", + "description": [ + "\nThe type of the object when it was converted." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "spaces", + "id": "def-common.LegacyUrlAliasTarget.sourceId", + "type": "string", + "tags": [], + "label": "sourceId", + "description": [ + "\nThe original ID of the object, before it was converted." + ], + "source": { + "path": "x-pack/plugins/spaces/common/types.ts", + "lineNumber": 69 + }, + "deprecated": false + } + ], + "initialIsOpen": false } ], "enums": [], diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 197fe460b47d35..9f724afd37a6e7 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import spacesObj from './spaces.json'; +This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. - - +Contact [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 96 | 0 | 0 | 0 | +| 106 | 0 | 0 | 0 | ## Client diff --git a/api_docs/spaces_oss.json b/api_docs/spaces_oss.json index 55ccf4a02a9dda..67aeda20dc86d0 100644 --- a/api_docs/spaces_oss.json +++ b/api_docs/spaces_oss.json @@ -15,7 +15,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 250 + "lineNumber": 254 }, "deprecated": false, "children": [ @@ -33,7 +33,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 257 + "lineNumber": 261 }, "deprecated": false }, @@ -48,7 +48,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 261 + "lineNumber": 265 }, "deprecated": false }, @@ -63,7 +63,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 265 + "lineNumber": 269 }, "deprecated": false }, @@ -78,7 +78,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 269 + "lineNumber": 273 }, "deprecated": false } @@ -221,10 +221,10 @@ "tags": [], "label": "changeSpacesHandler", "description": [ - "\nOptional handler that is called when the user has saved changes and there are spaces to be added to and/or removed from the object. If\nthis is not defined, a default handler will be used that calls `/api/spaces/_update_objects_spaces` and displays a toast indicating\nwhat occurred." + "\nOptional handler that is called when the user has saved changes and there are spaces to be added to and/or removed from the object and\nits relatives. If this is not defined, a default handler will be used that calls `/api/spaces/_update_objects_spaces` and displays a\ntoast indicating what occurred." ], "signature": [ - "((spacesToAdd: string[], spacesToRemove: string[]) => Promise<void>) | undefined" + "((objects: { type: string; id: string; }[], spacesToAdd: string[], spacesToRemove: string[]) => Promise<void>) | undefined" ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", @@ -239,14 +239,14 @@ "tags": [], "label": "onUpdate", "description": [ - "\nOptional callback when the target object is updated." + "\nOptional callback when the target object and its relatives are updated." ], "signature": [ - "(() => void) | undefined" + "((updatedObjects: { type: string; id: string; }[]) => void) | undefined" ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 179 + "lineNumber": 183 }, "deprecated": false }, @@ -264,7 +264,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 183 + "lineNumber": 187 }, "deprecated": false } @@ -282,7 +282,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 189 + "lineNumber": 193 }, "deprecated": false, "children": [ @@ -297,7 +297,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 193 + "lineNumber": 197 }, "deprecated": false }, @@ -312,7 +312,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 197 + "lineNumber": 201 }, "deprecated": false }, @@ -330,7 +330,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 201 + "lineNumber": 205 }, "deprecated": false }, @@ -348,7 +348,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 207 + "lineNumber": 211 }, "deprecated": false }, @@ -366,7 +366,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 213 + "lineNumber": 217 }, "deprecated": false }, @@ -384,7 +384,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 219 + "lineNumber": 223 }, "deprecated": false } @@ -402,7 +402,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 275 + "lineNumber": 279 }, "deprecated": false, "children": [ @@ -420,7 +420,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 277 + "lineNumber": 281 }, "deprecated": false }, @@ -438,7 +438,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 280 + "lineNumber": 284 }, "deprecated": false }, @@ -456,7 +456,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 283 + "lineNumber": 287 }, "deprecated": false }, @@ -474,7 +474,25 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 290 + "lineNumber": 294 + }, + "deprecated": false + }, + { + "parentPluginId": "spacesOss", + "id": "def-public.SpaceAvatarProps.isDisabled", + "type": "CompoundType", + "tags": [], + "label": "isDisabled", + "description": [ + "\nWhether or not to render the avatar in a disabled state.\n\nDefault value is false." + ], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "src/plugins/spaces_oss/public/api.ts", + "lineNumber": 301 }, "deprecated": false } @@ -492,7 +510,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 225 + "lineNumber": 229 }, "deprecated": false, "children": [ @@ -510,7 +528,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 229 + "lineNumber": 233 }, "deprecated": false }, @@ -528,7 +546,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 236 + "lineNumber": 240 }, "deprecated": false }, @@ -546,7 +564,7 @@ ], "source": { "path": "src/plugins/spaces_oss/public/api.ts", - "lineNumber": 244 + "lineNumber": 248 }, "deprecated": false } diff --git a/api_docs/spaces_oss.mdx b/api_docs/spaces_oss.mdx index b36b0b4c19aff4..fa7433a203333d 100644 --- a/api_docs/spaces_oss.mdx +++ b/api_docs/spaces_oss.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spacesOss'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import spacesOssObj from './spaces_oss.json'; +This plugin exposes a limited set of spaces functionality to OSS plugins. - - +Contact [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 71 | 0 | 5 | 0 | +| 72 | 0 | 5 | 0 | ## Client diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index eefe0a2dc76fe7..78437b53630faf 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import stackAlertsObj from './stack_alerts.json'; diff --git a/api_docs/task_manager.json b/api_docs/task_manager.json index 34f16e8ad309b6..f64f8b5461bcc1 100644 --- a/api_docs/task_manager.json +++ b/api_docs/task_manager.json @@ -185,7 +185,7 @@ ], "source": { "path": "x-pack/plugins/task_manager/server/plugin.ts", - "lineNumber": 113 + "lineNumber": 111 }, "deprecated": false, "children": [ @@ -207,7 +207,7 @@ ], "source": { "path": "x-pack/plugins/task_manager/server/plugin.ts", - "lineNumber": 113 + "lineNumber": 111 }, "deprecated": false, "isRequired": true diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 5c6d5b3d08ba48..71c2961300c5e6 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import taskManagerObj from './task_manager.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index f8d632c0d97082..b30d876841e6cb 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import telemetryObj from './telemetry.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 749ec3ba2bd71e..6589f18a49c328 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import telemetryCollectionManagerObj from './telemetry_collection_manager.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 53914260b037f3..65154e792d98b3 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import telemetryCollectionXpackObj from './telemetry_collection_xpack.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 71831a66284fc5..a24305809ffc05 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import telemetryManagementSectionObj from './telemetry_management_section.json'; diff --git a/api_docs/timelines.json b/api_docs/timelines.json index 570c34d5271de8..09ec9db3f9b4f8 100644 --- a/api_docs/timelines.json +++ b/api_docs/timelines.json @@ -1,6 +1,2143 @@ { "id": "timelines", "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "timelines", + "id": "def-public.addFieldToTimelineColumns", + "type": "Function", + "tags": [], + "label": "addFieldToTimelineColumns", + "description": [], + "signature": [ + "({ browserFields, dispatch, result, timelineId, defaultsHeader, }: AddFieldToTimelineColumnsParams) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/public/components/drag_and_drop/helpers.ts", + "lineNumber": 160 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.addFieldToTimelineColumns.$1", + "type": "Object", + "tags": [], + "label": "{\n browserFields,\n dispatch,\n result,\n timelineId,\n defaultsHeader,\n}", + "description": [], + "signature": [ + "AddFieldToTimelineColumnsParams" + ], + "source": { + "path": "x-pack/plugins/timelines/public/components/drag_and_drop/helpers.ts", + "lineNumber": 160 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.arrayIndexToAriaIndex", + "type": "Function", + "tags": [], + "label": "arrayIndexToAriaIndex", + "description": [ + "Converts an array index, which starts at zero, to an aria index, which starts at one" + ], + "signature": [ + "(arrayIndex: number) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 52 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.arrayIndexToAriaIndex.$1", + "type": "number", + "tags": [], + "label": "arrayIndex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 52 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.elementOrChildrenHasFocus", + "type": "Function", + "tags": [], + "label": "elementOrChildrenHasFocus", + "description": [ + "Returns `true` when the element, or one of it's children has focus" + ], + "signature": [ + "(element: HTMLElement | null | undefined) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 649 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.elementOrChildrenHasFocus.$1", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "HTMLElement | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 649 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn", + "type": "Function", + "tags": [], + "label": "focusColumn", + "description": [ + "\nSIDE EFFECT: mutates the DOM by focusing the specified column\nreturns the `aria-colindex` of the newly-focused column" + ], + "signature": [ + "({ colindexAttribute, containerElement, ariaColindex, ariaRowindex, rowindexAttribute, }: { colindexAttribute: string; containerElement: Element | null; ariaColindex: number; ariaRowindex: number; rowindexAttribute: string; }) => FocusColumnResult" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 246 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n ariaColindex,\n ariaRowindex,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 252 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 253 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 254 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.ariaColindex", + "type": "number", + "tags": [], + "label": "ariaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 255 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.ariaRowindex", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 256 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 257 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedAriaColindexCell", + "type": "Function", + "tags": [], + "label": "getFocusedAriaColindexCell", + "description": [ + "\nReturns the focused cell for tables that use `aria-colindex`" + ], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 831 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedAriaColindexCell.$1.containerElementtableClassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n tableClassName,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 834 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedAriaColindexCell.$1.containerElementtableClassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 835 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedAriaColindexCell.$1.containerElementtableClassName.tableClassName", + "type": "string", + "tags": [], + "label": "tableClassName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 836 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedDataColindexCell", + "type": "Function", + "tags": [], + "label": "getFocusedDataColindexCell", + "description": [ + "\nReturns the focused cell for tables that use `data-colindex`" + ], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 845 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedDataColindexCell.$1.containerElementtableClassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n tableClassName,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 848 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedDataColindexCell.$1.containerElementtableClassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 849 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getFocusedDataColindexCell.$1.containerElementtableClassName.tableClassName", + "type": "string", + "tags": [], + "label": "tableClassName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 850 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getNotesContainerClassName", + "type": "Function", + "tags": [], + "label": "getNotesContainerClassName", + "description": [], + "signature": [ + "(ariaRowindex: number) => string" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 299 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getNotesContainerClassName.$1", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 299 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getRowRendererClassName", + "type": "Function", + "tags": [], + "label": "getRowRendererClassName", + "description": [], + "signature": [ + "(ariaRowindex: number) => string" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 296 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getRowRendererClassName.$1", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 296 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus", + "type": "Function", + "tags": [], + "label": "getTableSkipFocus", + "description": [ + "\nThis function, which works with tables that use the `aria-colindex` or\n`data-colindex` attributes, examines the focus state of the table, and\nreturns a `SkipFocus` enumeration.\n\nThe `SkipFocus` return value indicates whether the caller should skip focus\nto \"before\" the table, \"after\" the table, or take no action, and let the\nbrowser's \"natural\" focus management manage focus." + ], + "signature": [ + "({ containerElement, getFocusedCell, shiftKey, tableHasFocus, tableClassName, }: { containerElement: HTMLElement | null; getFocusedCell: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.GetFocusedCell", + "text": "GetFocusedCell" + }, + "; shiftKey: boolean; tableHasFocus: (containerElement: HTMLElement | null) => boolean; tableClassName: string; }) => ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SkipFocus", + "text": "SkipFocus" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 791 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n getFocusedCell,\n shiftKey,\n tableHasFocus,\n tableClassName,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 797 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 798 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.getFocusedCell", + "type": "Function", + "tags": [], + "label": "getFocusedCell", + "description": [], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 799 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ containerElement: HTMLElement | null; tableClassName: string; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 767 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.shiftKey", + "type": "boolean", + "tags": [], + "label": "shiftKey", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 800 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.tableHasFocus", + "type": "Function", + "tags": [], + "label": "tableHasFocus", + "description": [], + "signature": [ + "(containerElement: HTMLElement | null) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 801 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 801 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-public.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.tableClassName", + "type": "string", + "tags": [], + "label": "tableClassName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 802 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.getTimelineIdFromColumnDroppableId", + "type": "Function", + "tags": [], + "label": "getTimelineIdFromColumnDroppableId", + "description": [], + "signature": [ + "(droppableId: string) => string" + ], + "source": { + "path": "x-pack/plugins/timelines/public/components/drag_and_drop/helpers.ts", + "lineNumber": 210 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.getTimelineIdFromColumnDroppableId.$1", + "type": "string", + "tags": [], + "label": "droppableId", + "description": [], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/timelines/public/components/drag_and_drop/helpers.ts", + "lineNumber": 210 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.handleSkipFocus", + "type": "Function", + "tags": [], + "label": "handleSkipFocus", + "description": [ + "\nIf the value of `skipFocus` is `SKIP_FOCUS_BACKWARDS` or `SKIP_FOCUS_FORWARD`\nthis function will invoke the provided `onSkipFocusBackwards` or\n`onSkipFocusForward` functions respectively.\n\nIf `skipFocus` is `SKIP_FOCUS_NOOP`, the `onSkipFocusBackwards` and\n`onSkipFocusForward` functions will not be invoked." + ], + "signature": [ + "({ onSkipFocusBackwards, onSkipFocusForward, skipFocus, }: { onSkipFocusBackwards: () => void; onSkipFocusForward: () => void; skipFocus: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SkipFocus", + "text": "SkipFocus" + }, + "; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 701 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus", + "type": "Object", + "tags": [], + "label": "{\n onSkipFocusBackwards,\n onSkipFocusForward,\n skipFocus,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 705 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus.onSkipFocusBackwards", + "type": "Function", + "tags": [], + "label": "onSkipFocusBackwards", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 706 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-public.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus.onSkipFocusForward", + "type": "Function", + "tags": [], + "label": "onSkipFocusForward", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 707 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-public.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus.skipFocus", + "type": "CompoundType", + "tags": [], + "label": "skipFocus", + "description": [], + "signature": [ + "\"SKIP_FOCUS_BACKWARDS\" | \"SKIP_FOCUS_FORWARD\" | \"SKIP_FOCUS_NOOP\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 708 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.isArrowDownOrArrowUp", + "type": "Function", + "tags": [], + "label": "isArrowDownOrArrowUp", + "description": [ + "Returns `true` if the down or up arrow was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 65 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.isArrowDownOrArrowUp.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 65 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.isArrowUp", + "type": "Function", + "tags": [], + "label": "isArrowUp", + "description": [ + "Returns `true` if the up arrow key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 62 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.isArrowUp.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 62 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.isEscape", + "type": "Function", + "tags": [], + "label": "isEscape", + "description": [ + "Returns `true` if the escape key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 76 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.isEscape.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 76 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.isTab", + "type": "Function", + "tags": [], + "label": "isTab", + "description": [ + "Returns `true` if the tab key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 98 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.isTab.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 98 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onFocusReFocusDraggable", + "type": "Function", + "tags": [], + "label": "onFocusReFocusDraggable", + "description": [ + "\nAn `onFocus` event handler that focuses the first child draggable\nkeyboard handler" + ], + "signature": [ + "(event: React.FocusEvent<HTMLElement>) => void | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 645 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.onFocusReFocusDraggable.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.FocusEvent<HTMLElement>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 645 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler", + "type": "Function", + "tags": [], + "label": "onKeyDownFocusHandler", + "description": [ + "\nThis function adds keyboard accessability to any `containerElement` that\nrenders its rows with support for `aria-colindex` and `aria-rowindex`.\n\nTo use this function, invoke it in the `onKeyDown` handler of the specified\n`containerElement`.\n\nSee the `Keyboard Support` section of\nhttps://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html\nfor details of the behavior." + ], + "signature": [ + "({ colindexAttribute, containerElement, event, maxAriaColindex, maxAriaRowindex, onColumnFocused, rowindexAttribute, }: { colindexAttribute: string; containerElement: HTMLDivElement | null; event: React.KeyboardEvent<Element>; maxAriaColindex: number; maxAriaRowindex: number; onColumnFocused: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + "; rowindexAttribute: string; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 563 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n event,\n maxAriaColindex,\n maxAriaRowindex,\n onColumnFocused,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 571 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 572 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 573 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 574 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaColindex", + "type": "number", + "tags": [], + "label": "maxAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 575 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 576 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.onColumnFocused", + "type": "Function", + "tags": [], + "label": "onColumnFocused", + "description": [], + "signature": [ + "({ newFocusedColumn, newFocusedColumnAriaColindex, }: { newFocusedColumn: HTMLDivElement | null; newFocusedColumnAriaColindex: number | null; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 577 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ newFocusedColumn: HTMLDivElement | null; newFocusedColumnAriaColindex: number | null; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 288 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-public.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 578 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.skipFocusInContainerTo", + "type": "Function", + "tags": [], + "label": "skipFocusInContainerTo", + "description": [ + "\nThis function has a side effect. It focuses the first element with a\nmatching `className` in the `containerElement`." + ], + "signature": [ + "({ containerElement, className, }: { containerElement: HTMLElement | null; className: string; }) => void | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 668 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.skipFocusInContainerTo.$1.containerElementclassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n className,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 671 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.skipFocusInContainerTo.$1.containerElementclassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 672 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.skipFocusInContainerTo.$1.containerElementclassName.className", + "type": "string", + "tags": [], + "label": "className", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 673 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.stopPropagationAndPreventDefault", + "type": "Function", + "tags": [], + "label": "stopPropagationAndPreventDefault", + "description": [ + "\nThis function has side effects: It stops propagation of the provided\n`KeyboardEvent` and prevents the browser's default behavior." + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 547 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.stopPropagationAndPreventDefault.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 547 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.tGridReducer", + "type": "Function", + "tags": [], + "label": "tGridReducer", + "description": [ + "The reducer for all timeline actions" + ], + "signature": [ + "(state: ", + { + "pluginId": "timelines", + "scope": "public", + "docId": "kibTimelinesPluginApi", + "section": "def-public.TimelineState", + "text": "TimelineState" + }, + " | undefined, action: { type: any; }) => ", + { + "pluginId": "timelines", + "scope": "public", + "docId": "kibTimelinesPluginApi", + "section": "def-public.TimelineState", + "text": "TimelineState" + } + ], + "source": { + "path": "x-pack/plugins/timelines/public/store/t_grid/reducer.ts", + "lineNumber": 53 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.state", + "type": "Uncategorized", + "tags": [], + "label": "state", + "description": [], + "signature": [ + "PassedS" + ], + "source": { + "path": "node_modules/typescript-fsa-reducers/dist/index.d.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.action", + "type": "Object", + "tags": [], + "label": "action", + "description": [], + "signature": [ + "{ type: any; }" + ], + "source": { + "path": "node_modules/typescript-fsa-reducers/dist/index.d.ts", + "lineNumber": 17 + }, + "deprecated": false + } + ], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "timelines", + "id": "def-public.CursorType", + "type": "Interface", + "tags": [], + "label": "CursorType", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.CursorType.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.CursorType.tiebreaker", + "type": "CompoundType", + "tags": [], + "label": "tiebreaker", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 18 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.Inspect", + "type": "Interface", + "tags": [], + "label": "Inspect", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.Inspect.dsl", + "type": "Array", + "tags": [], + "label": "dsl", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.PaginationInputPaginated", + "type": "Interface", + "tags": [], + "label": "PaginationInputPaginated", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 44 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.PaginationInputPaginated.activePage", + "type": "number", + "tags": [], + "label": "activePage", + "description": [ + "The activePage parameter defines the page of results you want to fetch" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.PaginationInputPaginated.cursorStart", + "type": "number", + "tags": [], + "label": "cursorStart", + "description": [ + "The cursorStart parameter defines the start of the results to be displayed" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.PaginationInputPaginated.fakePossibleCount", + "type": "number", + "tags": [], + "label": "fakePossibleCount", + "description": [ + "The fakePossibleCount parameter determines the total count in order to show 5 additional pages" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.PaginationInputPaginated.querySize", + "type": "number", + "tags": [], + "label": "querySize", + "description": [ + "The querySize parameter is the number of items to be returned" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 52 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.SortField", + "type": "Interface", + "tags": [], + "label": "SortField", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.SortField.field", + "type": "Uncategorized", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "Field" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.SortField.direction", + "type": "Enum", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 32 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelineState", + "type": "Interface", + "tags": [], + "label": "TimelineState", + "description": [ + "The state of all timelines is stored here" + ], + "source": { + "path": "x-pack/plugins/timelines/public/store/t_grid/types.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.TimelineState.timelineById", + "type": "Object", + "tags": [], + "label": "timelineById", + "description": [], + "signature": [ + "TimelineById" + ], + "source": { + "path": "x-pack/plugins/timelines/public/store/t_grid/types.ts", + "lineNumber": 39 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimerangeInput", + "type": "Interface", + "tags": [], + "label": "TimerangeInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.TimerangeInput.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [ + "The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan." + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimerangeInput.to", + "type": "string", + "tags": [], + "label": "to", + "description": [ + "The end of the timerange" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimerangeInput.from", + "type": "string", + "tags": [], + "label": "from", + "description": [ + "The beginning of the timerange" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TotalValue", + "type": "Interface", + "tags": [], + "label": "TotalValue", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.TotalValue.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TotalValue.relation", + "type": "string", + "tags": [], + "label": "relation", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 13 + }, + "deprecated": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "timelines", + "id": "def-public.Direction", + "type": "Enum", + "tags": [], + "label": "Direction", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "timelines", + "id": "def-public.ARIA_COLINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "ARIA_COLINDEX_ATTRIBUTE", + "description": [ + "\nThe name of the ARIA attribute representing a column, used in conjunction with\nthe ARIA: grid role https://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html" + ], + "signature": [ + "\"aria-colindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 20 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.ARIA_ROWINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "ARIA_ROWINDEX_ATTRIBUTE", + "description": [ + "\nThe name of the ARIA attribute representing a row, used in conjunction with\nthe ARIA: grid role https://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html" + ], + "signature": [ + "\"aria-rowindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 35 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.DATA_COLINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "DATA_COLINDEX_ATTRIBUTE", + "description": [ + "\nThis alternative attribute to `aria-colindex` is used to decorate the data\nin existing `EuiTable`s to enable keyboard navigation with minimal\nrefactoring of existing code until we're ready to migrate to `EuiDataGrid`.\nIt may be applied directly to keyboard-focusable elements and thus doesn't\nhave exactly the same semantics as `aria-colindex`." + ], + "signature": [ + "\"data-colindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 29 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.DATA_ROWINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "DATA_ROWINDEX_ATTRIBUTE", + "description": [ + "\nThis alternative attribute to `aria-rowindex` is used to decorate the data\nin existing `EuiTable`s to enable keyboard navigation with minimal\nrefactoring of existing code until we're ready to migrate to `EuiDataGrid`.\nIt's typically applied to `<tr>` elements via `EuiTable`'s `rowProps` prop." + ], + "signature": [ + "\"data-rowindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 43 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.DocValueFields", + "type": "Type", + "tags": [], + "label": "DocValueFields", + "description": [], + "signature": [ + "SearchDocValueField" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 55 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.FIRST_ARIA_INDEX", + "type": "number", + "tags": [], + "label": "FIRST_ARIA_INDEX", + "description": [ + "`aria-colindex` and `aria-rowindex` start at one" + ], + "signature": [ + "1" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 46 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.OnColumnFocused", + "type": "Type", + "tags": [], + "label": "OnColumnFocused", + "description": [], + "signature": [ + "({ newFocusedColumn, newFocusedColumnAriaColindex, }: { newFocusedColumn: HTMLDivElement | null; newFocusedColumnAriaColindex: number | null; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 288 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.TGridModelForTimeline", + "type": "Type", + "tags": [], + "label": "TGridModelForTimeline", + "description": [], + "signature": [ + "{ columns: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]; filters?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined; title: string; id: string; sort: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortColumnTimeline", + "text": "SortColumnTimeline" + }, + "[]; version: string | null; isLoading: boolean; savedObjectId: string | null; dateRange: { start: string; end: string; }; deletedEventIds: string[]; excludedRowRendererIds: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[]; expandedDetail: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineExpandedDetail", + "text": "TimelineExpandedDetail" + }, + "; graphEventId?: string | undefined; kqlQuery: { filterQuery: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SerializedFilterQuery", + "text": "SerializedFilterQuery" + }, + " | null; }; indexNames: string[]; isSelectAllChecked: boolean; itemsPerPage: number; itemsPerPageOptions: number[]; loadingEventIds: string[]; showCheckboxes: boolean; selectedEventIds: Record<string, ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]>; }" + ], + "source": { + "path": "x-pack/plugins/timelines/public/store/t_grid/model.ts", + "lineNumber": 81 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "timelines", + "id": "def-public.tGridActions", + "type": "Object", + "tags": [], + "label": "tGridActions", + "description": [], + "signature": [ + "typeof ", + "x-pack/plugins/timelines/public/store/t_grid/actions" + ], + "source": { + "path": "x-pack/plugins/timelines/public/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-public.tGridSelectors", + "type": "Object", + "tags": [], + "label": "tGridSelectors", + "description": [], + "signature": [ + "typeof ", + "x-pack/plugins/timelines/public/store/t_grid/selectors" + ], + "source": { + "path": "x-pack/plugins/timelines/public/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "start": { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart", + "type": "Interface", + "tags": [], + "label": "TimelinesUIStart", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 20 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getTGrid", + "type": "Function", + "tags": [], + "label": "getTGrid", + "description": [], + "signature": [ + "<T extends ", + "TGridType", + " = \"embedded\">(props: ", + "GetTGridProps", + "<T>) => React.ReactElement<", + "GetTGridProps", + "<T>, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)>" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 21 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.props", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "T extends \"standalone\" ? TGridStandaloneCompProps : T extends \"embedded\" ? TGridIntegratedCompProps : TGridIntegratedCompProps" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getTGridReducer", + "type": "Function", + "tags": [], + "label": "getTGridReducer", + "description": [], + "signature": [ + "() => any" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 25 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getLoadingPanel", + "type": "Function", + "tags": [], + "label": "getLoadingPanel", + "description": [], + "signature": [ + "(props: ", + "LoadingPanelProps", + ") => React.ReactElement<", + "LoadingPanelProps", + ">" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 26 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.props", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "LoadingPanelProps" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getLastUpdated", + "type": "Function", + "tags": [], + "label": "getLastUpdated", + "description": [], + "signature": [ + "(props: ", + "LastUpdatedAtProps", + ") => React.ReactElement<", + "LastUpdatedAtProps", + ">" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 27 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.props", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "LastUpdatedAtProps" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 27 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getUseAddToTimeline", + "type": "Function", + "tags": [], + "label": "getUseAddToTimeline", + "description": [], + "signature": [ + "() => (props: ", + "UseAddToTimelineProps", + ") => ", + "UseAddToTimeline" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 28 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getUseAddToTimelineSensor", + "type": "Function", + "tags": [], + "label": "getUseAddToTimelineSensor", + "description": [], + "signature": [ + "() => (api: ", + "SensorAPI", + ") => void" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 29 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.getUseDraggableKeyboardWrapper", + "type": "Function", + "tags": [], + "label": "getUseDraggableKeyboardWrapper", + "description": [], + "signature": [ + "() => (props: ", + "UseDraggableKeyboardWrapperProps", + ") => ", + "UseDraggableKeyboardWrapper" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 30 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-public.TimelinesUIStart.setTGridEmbeddedStore", + "type": "Function", + "tags": [], + "label": "setTGridEmbeddedStore", + "description": [], + "signature": [ + "(store: ", + "Store", + "<any, ", + "AnyAction", + ">) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 33 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-public.store", + "type": "Object", + "tags": [], + "label": "store", + "description": [], + "signature": [ + "Store", + "<any, ", + "AnyAction", + ">" + ], + "source": { + "path": "x-pack/plugins/timelines/public/types.ts", + "lineNumber": 33 + }, + "deprecated": false + } + ] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { "classes": [], "functions": [], "interfaces": [], @@ -9,123 +2146,20915 @@ "objects": [], "setup": { "parentPluginId": "timelines", - "id": "def-public.TimelinesPluginSetup", + "id": "def-server.TimelinesPluginUI", "type": "Interface", "tags": [], - "label": "TimelinesPluginSetup", + "label": "TimelinesPluginUI", "description": [], "source": { - "path": "x-pack/plugins/timelines/public/types.ts", - "lineNumber": 10 + "path": "x-pack/plugins/timelines/server/types.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "timelines", + "id": "def-server.TimelinesPluginStart", + "type": "Interface", + "tags": [], + "label": "TimelinesPluginStart", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/server/types.ts", + "lineNumber": 14 + }, + "deprecated": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "timelines", + "id": "def-common.ariaIndexToArrayIndex", + "type": "Function", + "tags": [], + "label": "ariaIndexToArrayIndex", + "description": [ + "Converts an aria index, which starts at one, to an array index, which starts at zero" + ], + "signature": [ + "(ariaIndex: number) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 49 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ariaIndexToArrayIndex.$1", + "type": "number", + "tags": [], + "label": "ariaIndex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 49 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.arrayIndexToAriaIndex", + "type": "Function", + "tags": [], + "label": "arrayIndexToAriaIndex", + "description": [ + "Converts an array index, which starts at zero, to an aria index, which starts at one" + ], + "signature": [ + "(arrayIndex: number) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 52 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.arrayIndexToAriaIndex.$1", + "type": "number", + "tags": [], + "label": "arrayIndex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 52 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.elementOrChildrenHasFocus", + "type": "Function", + "tags": [], + "label": "elementOrChildrenHasFocus", + "description": [ + "Returns `true` when the element, or one of it's children has focus" + ], + "signature": [ + "(element: HTMLElement | null | undefined) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 649 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.elementOrChildrenHasFocus.$1", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "HTMLElement | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 649 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn", + "type": "Function", + "tags": [], + "label": "focusColumn", + "description": [ + "\nSIDE EFFECT: mutates the DOM by focusing the specified column\nreturns the `aria-colindex` of the newly-focused column" + ], + "signature": [ + "({ colindexAttribute, containerElement, ariaColindex, ariaRowindex, rowindexAttribute, }: { colindexAttribute: string; containerElement: Element | null; ariaColindex: number; ariaRowindex: number; rowindexAttribute: string; }) => FocusColumnResult" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 246 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n ariaColindex,\n ariaRowindex,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 252 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 253 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 254 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.ariaColindex", + "type": "number", + "tags": [], + "label": "ariaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 255 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.ariaRowindex", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 256 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusColumn.$1.colindexAttributecontainerElementariaColindexariaRowindexrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 257 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellHasAlwaysOpenHoverContent", + "type": "Function", + "tags": [], + "label": "focusedCellHasAlwaysOpenHoverContent", + "description": [ + "\nReturns `true` when the provided `focusedCell` has always-open hover\ncontent (i.e. a hover menu)\n\nWhen this function returns true, the caller should `NOT` move focus away\nfrom the table. Instead, the browser's \"natural\" focus management should\nbe allowed to manage focus between the table and the hover content." + ], + "signature": [ + "(focusedCell: HTMLElement | null) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 764 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellHasAlwaysOpenHoverContent.$1", + "type": "CompoundType", + "tags": [], + "label": "focusedCell", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 764 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellHasMoreFocusableChildren", + "type": "Function", + "tags": [], + "label": "focusedCellHasMoreFocusableChildren", + "description": [ + "\nThe provided `focusedCell` may contain multiple focusable children. For,\nexample, the cell may contain multiple `HTMLButtonElement`s that represent\nactions, or the cell may contain multiple draggables.\n\nThis function returns `true` when there are still more children of the cell\nthat should receive focus when the tab key is pressed.\n\nWhen this function returns `true`, the caller should NOT move focus away\nfrom the table. Instead, the browser's \"natural\" focus management should be\nallowed to automatically focus the next (or previous) focusable child of the\ncell." + ], + "signature": [ + "({ focusedCell, shiftKey, }: { focusedCell: HTMLElement | null; shiftKey: boolean; }) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 736 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellHasMoreFocusableChildren.$1.focusedCellshiftKey", + "type": "Object", + "tags": [], + "label": "{\n focusedCell,\n shiftKey,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 739 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellHasMoreFocusableChildren.$1.focusedCellshiftKey.focusedCell", + "type": "CompoundType", + "tags": [], + "label": "focusedCell", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 740 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellHasMoreFocusableChildren.$1.focusedCellshiftKey.shiftKey", + "type": "boolean", + "tags": [], + "label": "shiftKey", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 741 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellIsPlainColumnHeader", + "type": "Function", + "tags": [], + "label": "focusedCellIsPlainColumnHeader", + "description": [ + "\nReturns true if the focused cell is a plain, non-action `columnheader`" + ], + "signature": [ + "(focusedCell: HTMLDivElement | null) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 778 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.focusedCellIsPlainColumnHeader.$1", + "type": "CompoundType", + "tags": [], + "label": "focusedCell", + "description": [], + "signature": [ + "HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 778 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getColindex", + "type": "Function", + "tags": [], + "label": "getColindex", + "description": [ + "Returns the numeric `aria-colindex` of the specified element" + ], + "signature": [ + "({ colindexAttribute, element, }: { colindexAttribute: string; element: Element | null; }) => number | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 119 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getColindex.$1.colindexAttributeelement", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n element,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 122 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getColindex.$1.colindexAttributeelement.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 123 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getColindex.$1.colindexAttributeelement.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 124 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getElementWithMatchingAriaColindex", + "type": "Function", + "tags": [], + "label": "getElementWithMatchingAriaColindex", + "description": [ + "Returns the element at the specified `aria-colindex`" + ], + "signature": [ + "({ ariaColindex, colindexAttribute, element, }: { ariaColindex: number; colindexAttribute: string; element: HTMLDivElement | null; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 188 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getElementWithMatchingAriaColindex.$1.ariaColindexcolindexAttributeelement", + "type": "Object", + "tags": [], + "label": "{\n ariaColindex,\n colindexAttribute,\n element,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 192 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getElementWithMatchingAriaColindex.$1.ariaColindexcolindexAttributeelement.ariaColindex", + "type": "number", + "tags": [], + "label": "ariaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 193 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getElementWithMatchingAriaColindex.$1.ariaColindexcolindexAttributeelement.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 194 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getElementWithMatchingAriaColindex.$1.ariaColindexcolindexAttributeelement.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 195 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex", + "type": "Function", + "tags": [], + "label": "getFirstNonVisibleAriaRowindex", + "description": [], + "signature": [ + "({ focusedAriaRowindex, element, event, maxAriaRowindex, rowindexAttribute, }: { focusedAriaRowindex: number; element: HTMLDivElement | null; event: React.KeyboardEvent<Element>; maxAriaRowindex: number; rowindexAttribute: string; }) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 445 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex.$1.focusedAriaRowindexelementeventmaxAriaRowindexrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n focusedAriaRowindex,\n element,\n event,\n maxAriaRowindex,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 451 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex.$1.focusedAriaRowindexelementeventmaxAriaRowindexrowindexAttribute.focusedAriaRowindex", + "type": "number", + "tags": [], + "label": "focusedAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 452 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex.$1.focusedAriaRowindexelementeventmaxAriaRowindexrowindexAttribute.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 453 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex.$1.focusedAriaRowindexelementeventmaxAriaRowindexrowindexAttribute.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 454 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex.$1.focusedAriaRowindexelementeventmaxAriaRowindexrowindexAttribute.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 455 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstNonVisibleAriaRowindex.$1.focusedAriaRowindexelementeventmaxAriaRowindexrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 456 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstOrLastAriaRowindex", + "type": "Function", + "tags": [], + "label": "getFirstOrLastAriaRowindex", + "description": [ + "Returns the first `aria-rowindex` if the home key is pressed, otherwise the last `aria-rowindex` is returned" + ], + "signature": [ + "({ event, maxAriaRowindex, }: { event: React.KeyboardEvent<Element>; maxAriaRowindex: number; }) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 229 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFirstOrLastAriaRowindex.$1.eventmaxAriaRowindex", + "type": "Object", + "tags": [], + "label": "{\n event,\n maxAriaRowindex,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 232 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFirstOrLastAriaRowindex.$1.eventmaxAriaRowindex.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 233 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFirstOrLastAriaRowindex.$1.eventmaxAriaRowindex.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 234 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusableChidren", + "type": "Function", + "tags": [], + "label": "getFocusableChidren", + "description": [ + "\nReturns a table cell's focusable children, which may be one of the following\na) a `HTMLButtonElement` that does NOT have the `disabled` attribute\nb) an element with the `DRAGGABLE_KEYBOARD_WRAPPER_CLASS_NAME`" + ], + "signature": [ + "(cell: HTMLElement | null) => ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.FocusableElement", + "text": "FocusableElement" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 681 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusableChidren.$1", + "type": "CompoundType", + "tags": [], + "label": "cell", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 681 + }, + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedAriaColindexCell", + "type": "Function", + "tags": [], + "label": "getFocusedAriaColindexCell", + "description": [ + "\nReturns the focused cell for tables that use `aria-colindex`" + ], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 831 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedAriaColindexCell.$1.containerElementtableClassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n tableClassName,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 834 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedAriaColindexCell.$1.containerElementtableClassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 835 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedAriaColindexCell.$1.containerElementtableClassName.tableClassName", + "type": "string", + "tags": [], + "label": "tableClassName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 836 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedColumn", + "type": "Function", + "tags": [], + "label": "getFocusedColumn", + "description": [ + "\nReturns the column that directly owns focus, or contains a focused element,\nusing the `aria-colindex` attribute." + ], + "signature": [ + "({ colindexAttribute, element, }: { colindexAttribute: string; element: Element | null; }) => Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 108 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedColumn.$1.colindexAttributeelement", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n element,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 111 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedColumn.$1.colindexAttributeelement.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 112 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedColumn.$1.colindexAttributeelement.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 113 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedDataColindexCell", + "type": "Function", + "tags": [], + "label": "getFocusedDataColindexCell", + "description": [ + "\nReturns the focused cell for tables that use `data-colindex`" + ], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 845 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedDataColindexCell.$1.containerElementtableClassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n tableClassName,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 848 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedDataColindexCell.$1.containerElementtableClassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 849 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedDataColindexCell.$1.containerElementtableClassName.tableClassName", + "type": "string", + "tags": [], + "label": "tableClassName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 850 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedRow", + "type": "Function", + "tags": [], + "label": "getFocusedRow", + "description": [ + " Returns the row that directly owns focus, or contains a focused element" + ], + "signature": [ + "({ rowindexAttribute, element, }: { rowindexAttribute: string; element: Element | null; }) => Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 131 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedRow.$1.rowindexAttributeelement", + "type": "Object", + "tags": [], + "label": "{\n rowindexAttribute,\n element,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 134 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedRow.$1.rowindexAttributeelement.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 135 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusedRow.$1.rowindexAttributeelement.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 136 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getFocusOnFromArrowKey", + "type": "Function", + "tags": [], + "label": "getFocusOnFromArrowKey", + "description": [ + "Returns `previous` or `next`, depending on which arrow key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => \"previous\" | \"next\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 101 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getFocusOnFromArrowKey.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 101 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaColindex", + "type": "Function", + "tags": [], + "label": "getNewAriaColindex", + "description": [ + "Returns the `previous` or `next` `aria-colindex` relative to the currently focused `aria-colindex`" + ], + "signature": [ + "({ focusedAriaColindex, focusOn, maxAriaColindex, }: { focusedAriaColindex: number; focusOn: \"previous\" | \"next\"; maxAriaColindex: number; }) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 164 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaColindex.$1.focusedAriaColindexfocusOnmaxAriaColindex", + "type": "Object", + "tags": [], + "label": "{\n focusedAriaColindex,\n focusOn,\n maxAriaColindex,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 168 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaColindex.$1.focusedAriaColindexfocusOnmaxAriaColindex.focusedAriaColindex", + "type": "number", + "tags": [], + "label": "focusedAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 169 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaColindex.$1.focusedAriaColindexfocusOnmaxAriaColindex.focusOn", + "type": "CompoundType", + "tags": [], + "label": "focusOn", + "description": [], + "signature": [ + "\"previous\" | \"next\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 170 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaColindex.$1.focusedAriaColindexfocusOnmaxAriaColindex.maxAriaColindex", + "type": "number", + "tags": [], + "label": "maxAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 171 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaRowindex", + "type": "Function", + "tags": [], + "label": "getNewAriaRowindex", + "description": [ + "Returns the `previous` or `next` `aria-rowindex` relative to the currently focused `aria-rowindex`" + ], + "signature": [ + "({ focusedAriaRowindex, focusOn, maxAriaRowindex, }: { focusedAriaRowindex: number; focusOn: \"previous\" | \"next\"; maxAriaRowindex: number; }) => number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 205 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaRowindex.$1.focusedAriaRowindexfocusOnmaxAriaRowindex", + "type": "Object", + "tags": [], + "label": "{\n focusedAriaRowindex,\n focusOn,\n maxAriaRowindex,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 209 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaRowindex.$1.focusedAriaRowindexfocusOnmaxAriaRowindex.focusedAriaRowindex", + "type": "number", + "tags": [], + "label": "focusedAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 210 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaRowindex.$1.focusedAriaRowindexfocusOnmaxAriaRowindex.focusOn", + "type": "CompoundType", + "tags": [], + "label": "focusOn", + "description": [], + "signature": [ + "\"previous\" | \"next\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 211 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNewAriaRowindex.$1.focusedAriaRowindexfocusOnmaxAriaRowindex.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 212 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getNotesContainerClassName", + "type": "Function", + "tags": [], + "label": "getNotesContainerClassName", + "description": [], + "signature": [ + "(ariaRowindex: number) => string" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 299 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getNotesContainerClassName.$1", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 299 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getRowByAriaRowindex", + "type": "Function", + "tags": [], + "label": "getRowByAriaRowindex", + "description": [ + "Returns the row with the specified `aria-rowindex`" + ], + "signature": [ + "({ ariaRowindex, element, rowindexAttribute, }: { ariaRowindex: number; element: Element | null; rowindexAttribute: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 152 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getRowByAriaRowindex.$1.ariaRowindexelementrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n ariaRowindex,\n element,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 156 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getRowByAriaRowindex.$1.ariaRowindexelementrowindexAttribute.ariaRowindex", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 157 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getRowByAriaRowindex.$1.ariaRowindexelementrowindexAttribute.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 158 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getRowByAriaRowindex.$1.ariaRowindexelementrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 159 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getRowindex", + "type": "Function", + "tags": [], + "label": "getRowindex", + "description": [ + "Returns the numeric `aria-rowindex` of the specified element" + ], + "signature": [ + "({ rowindexAttribute, element, }: { rowindexAttribute: string; element: Element | null; }) => number | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 140 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getRowindex.$1.rowindexAttributeelement", + "type": "Object", + "tags": [], + "label": "{\n rowindexAttribute,\n element,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 143 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getRowindex.$1.rowindexAttributeelement.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 144 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getRowindex.$1.rowindexAttributeelement.element", + "type": "CompoundType", + "tags": [], + "label": "element", + "description": [], + "signature": [ + "Element | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 145 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getRowRendererClassName", + "type": "Function", + "tags": [], + "label": "getRowRendererClassName", + "description": [], + "signature": [ + "(ariaRowindex: number) => string" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 296 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getRowRendererClassName.$1", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "signature": [ + "number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 296 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus", + "type": "Function", + "tags": [], + "label": "getTableSkipFocus", + "description": [ + "\nThis function, which works with tables that use the `aria-colindex` or\n`data-colindex` attributes, examines the focus state of the table, and\nreturns a `SkipFocus` enumeration.\n\nThe `SkipFocus` return value indicates whether the caller should skip focus\nto \"before\" the table, \"after\" the table, or take no action, and let the\nbrowser's \"natural\" focus management manage focus." + ], + "signature": [ + "({ containerElement, getFocusedCell, shiftKey, tableHasFocus, tableClassName, }: { containerElement: HTMLElement | null; getFocusedCell: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.GetFocusedCell", + "text": "GetFocusedCell" + }, + "; shiftKey: boolean; tableHasFocus: (containerElement: HTMLElement | null) => boolean; tableClassName: string; }) => ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SkipFocus", + "text": "SkipFocus" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 791 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n getFocusedCell,\n shiftKey,\n tableHasFocus,\n tableClassName,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 797 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 798 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.getFocusedCell", + "type": "Function", + "tags": [], + "label": "getFocusedCell", + "description": [], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 799 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ containerElement: HTMLElement | null; tableClassName: string; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 767 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.shiftKey", + "type": "boolean", + "tags": [], + "label": "shiftKey", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 800 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.tableHasFocus", + "type": "Function", + "tags": [], + "label": "tableHasFocus", + "description": [], + "signature": [ + "(containerElement: HTMLElement | null) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 801 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 801 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.getTableSkipFocus.$1.containerElementgetFocusedCellshiftKeytableHasFocustableClassName.tableClassName", + "type": "string", + "tags": [], + "label": "tableClassName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 802 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getValidationErrors", + "type": "Function", + "tags": [], + "label": "getValidationErrors", + "description": [], + "signature": [ + "(response: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ErrorResponse", + "text": "ErrorResponse" + }, + ") => string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 32 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.getValidationErrors.$1", + "type": "Object", + "tags": [], + "label": "response", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ErrorResponse", + "text": "ErrorResponse" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 32 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.handleSkipFocus", + "type": "Function", + "tags": [], + "label": "handleSkipFocus", + "description": [ + "\nIf the value of `skipFocus` is `SKIP_FOCUS_BACKWARDS` or `SKIP_FOCUS_FORWARD`\nthis function will invoke the provided `onSkipFocusBackwards` or\n`onSkipFocusForward` functions respectively.\n\nIf `skipFocus` is `SKIP_FOCUS_NOOP`, the `onSkipFocusBackwards` and\n`onSkipFocusForward` functions will not be invoked." + ], + "signature": [ + "({ onSkipFocusBackwards, onSkipFocusForward, skipFocus, }: { onSkipFocusBackwards: () => void; onSkipFocusForward: () => void; skipFocus: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SkipFocus", + "text": "SkipFocus" + }, + "; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 701 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus", + "type": "Object", + "tags": [], + "label": "{\n onSkipFocusBackwards,\n onSkipFocusForward,\n skipFocus,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 705 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus.onSkipFocusBackwards", + "type": "Function", + "tags": [], + "label": "onSkipFocusBackwards", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 706 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-common.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus.onSkipFocusForward", + "type": "Function", + "tags": [], + "label": "onSkipFocusForward", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 707 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-common.handleSkipFocus.$1.onSkipFocusBackwardsonSkipFocusForwardskipFocus.skipFocus", + "type": "CompoundType", + "tags": [], + "label": "skipFocus", + "description": [], + "signature": [ + "\"SKIP_FOCUS_BACKWARDS\" | \"SKIP_FOCUS_FORWARD\" | \"SKIP_FOCUS_NOOP\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 708 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isArrowDown", + "type": "Function", + "tags": [], + "label": "isArrowDown", + "description": [ + "Returns `true` if the down arrow key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 59 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isArrowDown.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 59 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isArrowDownOrArrowUp", + "type": "Function", + "tags": [], + "label": "isArrowDownOrArrowUp", + "description": [ + "Returns `true` if the down or up arrow was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 65 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isArrowDownOrArrowUp.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 65 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isArrowKey", + "type": "Function", + "tags": [], + "label": "isArrowKey", + "description": [ + "Returns `true` if an arrow key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 69 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isArrowKey.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 69 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isArrowRight", + "type": "Function", + "tags": [], + "label": "isArrowRight", + "description": [ + "Returns `true` if the right arrow key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 73 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isArrowRight.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 73 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isArrowRightOrArrowLeft", + "type": "Function", + "tags": [], + "label": "isArrowRightOrArrowLeft", + "description": [ + "Returns `true` if the left or right arrow was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 55 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isArrowRightOrArrowLeft.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 55 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isArrowUp", + "type": "Function", + "tags": [], + "label": "isArrowUp", + "description": [ + "Returns `true` if the up arrow key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 62 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isArrowUp.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 62 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isEnd", + "type": "Function", + "tags": [], + "label": "isEnd", + "description": [ + "Returns `true` if the end key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 82 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isEnd.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 82 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isErrorResponse", + "type": "Function", + "tags": [], + "label": "isErrorResponse", + "description": [], + "signature": [ + "(response: unknown) => response is ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ErrorResponse", + "text": "ErrorResponse" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 26 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isErrorResponse.$1", + "type": "Unknown", + "tags": [], + "label": "response", + "description": [], + "signature": [ + "unknown" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 26 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isEscape", + "type": "Function", + "tags": [], + "label": "isEscape", + "description": [ + "Returns `true` if the escape key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 76 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isEscape.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 76 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isHome", + "type": "Function", + "tags": [], + "label": "isHome", + "description": [ + "Returns `true` if the home key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 79 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isHome.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 79 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isHomeOrEnd", + "type": "Function", + "tags": [], + "label": "isHomeOrEnd", + "description": [ + "Returns `true` if the home or end key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 85 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isHomeOrEnd.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 85 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isPageDown", + "type": "Function", + "tags": [], + "label": "isPageDown", + "description": [ + "Returns `true` if the page down key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 91 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isPageDown.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 91 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isPageDownOrPageUp", + "type": "Function", + "tags": [], + "label": "isPageDownOrPageUp", + "description": [ + "Returns `true` if the page up or page down key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 94 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isPageDownOrPageUp.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 94 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isPageUp", + "type": "Function", + "tags": [], + "label": "isPageUp", + "description": [ + "Returns `true` if the page up key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 88 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isPageUp.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 88 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isTab", + "type": "Function", + "tags": [], + "label": "isTab", + "description": [ + "Returns `true` if the tab key was pressed" + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 98 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isTab.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 98 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.isValidationErrorResponse", + "type": "Function", + "tags": [], + "label": "isValidationErrorResponse", + "description": [], + "signature": [ + "(response: unknown) => response is ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ErrorResponse", + "text": "ErrorResponse" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.isValidationErrorResponse.$1", + "type": "Unknown", + "tags": [], + "label": "response", + "description": [], + "signature": [ + "unknown" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 29 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown", + "type": "Function", + "tags": [], + "label": "onArrowKeyDown", + "description": [ + "\nThis function implements arrow key support for the `onKeyDownFocusHandler`.\n\nSee the `Keyboard Support` section of\nhttps://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html\nfor details" + ], + "signature": [ + "({ colindexAttribute, containerElement, event, focusedAriaColindex, focusedAriaRowindex, maxAriaColindex, maxAriaRowindex, onColumnFocused, rowindexAttribute, }: { colindexAttribute: string; containerElement: HTMLElement | null; event: React.KeyboardEvent<Element>; focusedAriaColindex: number; focusedAriaRowindex: number; maxAriaColindex: number; maxAriaRowindex: number; onColumnFocused?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + " | undefined; rowindexAttribute: string; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 309 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n event,\n focusedAriaColindex,\n focusedAriaRowindex,\n maxAriaColindex,\n maxAriaRowindex,\n onColumnFocused,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 319 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 320 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 321 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 322 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.focusedAriaColindex", + "type": "number", + "tags": [], + "label": "focusedAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 323 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.focusedAriaRowindex", + "type": "number", + "tags": [], + "label": "focusedAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 324 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaColindex", + "type": "number", + "tags": [], + "label": "maxAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 325 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 326 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.onColumnFocused", + "type": "Function", + "tags": [], + "label": "onColumnFocused", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 327 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onArrowKeyDown.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 328 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onFocusReFocusDraggable", + "type": "Function", + "tags": [], + "label": "onFocusReFocusDraggable", + "description": [ + "\nAn `onFocus` event handler that focuses the first child draggable\nkeyboard handler" + ], + "signature": [ + "(event: React.FocusEvent<HTMLElement>) => void | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 645 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onFocusReFocusDraggable.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.FocusEvent<HTMLElement>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 645 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown", + "type": "Function", + "tags": [], + "label": "onHomeEndDown", + "description": [ + "\nThis function implements `home` and `end` key support for the `onKeyDownFocusHandler`.\n\nSee the `Keyboard Support` section of\nhttps://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html\nfor details" + ], + "signature": [ + "({ colindexAttribute, containerElement, event, focusedAriaRowindex, maxAriaColindex, maxAriaRowindex, onColumnFocused, rowindexAttribute, }: { colindexAttribute: string; containerElement: HTMLElement | null; event: React.KeyboardEvent<Element>; focusedAriaRowindex: number; maxAriaColindex: number; maxAriaRowindex: number; onColumnFocused?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + " | undefined; rowindexAttribute: string; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 388 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n event,\n focusedAriaRowindex,\n maxAriaColindex,\n maxAriaRowindex,\n onColumnFocused,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 397 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 398 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 399 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 400 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.focusedAriaRowindex", + "type": "number", + "tags": [], + "label": "focusedAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 401 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaColindex", + "type": "number", + "tags": [], + "label": "maxAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 402 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 403 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.onColumnFocused", + "type": "Function", + "tags": [], + "label": "onColumnFocused", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 404 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onHomeEndDown.$1.colindexAttributecontainerElementeventfocusedAriaRowindexmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 405 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler", + "type": "Function", + "tags": [], + "label": "onKeyDownFocusHandler", + "description": [ + "\nThis function adds keyboard accessability to any `containerElement` that\nrenders its rows with support for `aria-colindex` and `aria-rowindex`.\n\nTo use this function, invoke it in the `onKeyDown` handler of the specified\n`containerElement`.\n\nSee the `Keyboard Support` section of\nhttps://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html\nfor details of the behavior." + ], + "signature": [ + "({ colindexAttribute, containerElement, event, maxAriaColindex, maxAriaRowindex, onColumnFocused, rowindexAttribute, }: { colindexAttribute: string; containerElement: HTMLDivElement | null; event: React.KeyboardEvent<Element>; maxAriaColindex: number; maxAriaRowindex: number; onColumnFocused: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + "; rowindexAttribute: string; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 563 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n event,\n maxAriaColindex,\n maxAriaRowindex,\n onColumnFocused,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 571 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 572 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 573 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 574 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaColindex", + "type": "number", + "tags": [], + "label": "maxAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 575 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 576 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.onColumnFocused", + "type": "Function", + "tags": [], + "label": "onColumnFocused", + "description": [], + "signature": [ + "({ newFocusedColumn, newFocusedColumnAriaColindex, }: { newFocusedColumn: HTMLDivElement | null; newFocusedColumnAriaColindex: number | null; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 577 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ newFocusedColumn: HTMLDivElement | null; newFocusedColumnAriaColindex: number | null; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 288 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.onKeyDownFocusHandler.$1.colindexAttributecontainerElementeventmaxAriaColindexmaxAriaRowindexonColumnFocusedrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 578 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp", + "type": "Function", + "tags": [], + "label": "onPageDownOrPageUp", + "description": [ + "\nThis function implements `page down` and `page up` key support for the `onKeyDownFocusHandler`.\n\nSee the `Keyboard Support` section of\nhttps://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html\nfor details" + ], + "signature": [ + "({ colindexAttribute, containerElement, event, focusedAriaColindex, focusedAriaRowindex, maxAriaRowindex, onColumnFocused, rowindexAttribute, }: { colindexAttribute: string; containerElement: HTMLDivElement | null; event: React.KeyboardEvent<Element>; focusedAriaColindex: number; focusedAriaRowindex: number; maxAriaRowindex: number; onColumnFocused?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + " | undefined; rowindexAttribute: string; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 503 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute", + "type": "Object", + "tags": [], + "label": "{\n colindexAttribute,\n containerElement,\n event,\n focusedAriaColindex,\n focusedAriaRowindex,\n maxAriaRowindex,\n onColumnFocused,\n rowindexAttribute,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 512 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.colindexAttribute", + "type": "string", + "tags": [], + "label": "colindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 513 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 514 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.event", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 515 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.focusedAriaColindex", + "type": "number", + "tags": [], + "label": "focusedAriaColindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 516 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.focusedAriaRowindex", + "type": "number", + "tags": [], + "label": "focusedAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 517 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.maxAriaRowindex", + "type": "number", + "tags": [], + "label": "maxAriaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 518 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.onColumnFocused", + "type": "Function", + "tags": [], + "label": "onColumnFocused", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.OnColumnFocused", + "text": "OnColumnFocused" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 519 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.onPageDownOrPageUp.$1.colindexAttributecontainerElementeventfocusedAriaColindexfocusedAriaRowindexmaxAriaRowindexonColumnFocusedrowindexAttribute.rowindexAttribute", + "type": "string", + "tags": [], + "label": "rowindexAttribute", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 520 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.skipFocusInContainerTo", + "type": "Function", + "tags": [], + "label": "skipFocusInContainerTo", + "description": [ + "\nThis function has a side effect. It focuses the first element with a\nmatching `className` in the `containerElement`." + ], + "signature": [ + "({ containerElement, className, }: { containerElement: HTMLElement | null; className: string; }) => void | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 668 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.skipFocusInContainerTo.$1.containerElementclassName", + "type": "Object", + "tags": [], + "label": "{\n containerElement,\n className,\n}", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 671 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.skipFocusInContainerTo.$1.containerElementclassName.containerElement", + "type": "CompoundType", + "tags": [], + "label": "containerElement", + "description": [], + "signature": [ + "HTMLElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 672 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.skipFocusInContainerTo.$1.containerElementclassName.className", + "type": "string", + "tags": [], + "label": "className", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 673 + }, + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.stopPropagationAndPreventDefault", + "type": "Function", + "tags": [], + "label": "stopPropagationAndPreventDefault", + "description": [ + "\nThis function has side effects: It stops propagation of the provided\n`KeyboardEvent` and prevents the browser's default behavior." + ], + "signature": [ + "(event: React.KeyboardEvent<Element>) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 547 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.stopPropagationAndPreventDefault.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + "React.KeyboardEvent<Element>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 547 + }, + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps", + "type": "Interface", + "tags": [], + "label": "ActionProps", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.ariaRowindex", + "type": "number", + "tags": [], + "label": "ariaRowindex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.action", + "type": "CompoundType", + "tags": [], + "label": "action", + "description": [], + "signature": [ + "((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.Component<Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">, any, any>) | ((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => JSX.Element) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.Component<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ", any, any>) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => JSX.Element) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.width", + "type": "number", + "tags": [], + "label": "width", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.columnId", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.columnValues", + "type": "string", + "tags": [], + "label": "columnValues", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.checked", + "type": "boolean", + "tags": [], + "label": "checked", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 22 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.onRowSelected", + "type": "Function", + "tags": [], + "label": "onRowSelected", + "description": [], + "signature": [ + "({ eventIds, isSelected, }: { eventIds: string[]; isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 23 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ eventIds: string[]; isSelected: boolean; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 80 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.eventId", + "type": "string", + "tags": [], + "label": "eventId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.loadingEventIds", + "type": "Object", + "tags": [], + "label": "loadingEventIds", + "description": [], + "signature": [ + "readonly string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.onEventDetailsPanelOpened", + "type": "Function", + "tags": [], + "label": "onEventDetailsPanelOpened", + "description": [], + "signature": [ + "() => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 26 + }, + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.showCheckboxes", + "type": "boolean", + "tags": [], + "label": "showCheckboxes", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.ecsData", + "type": "Object", + "tags": [], + "label": "ecsData", + "description": [], + "signature": [ + "Ecs" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.index", + "type": "number", + "tags": [], + "label": "index", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.eventIdToNoteIds", + "type": "Object", + "tags": [], + "label": "eventIdToNoteIds", + "description": [], + "signature": [ + "Readonly<Record<string, string[]>> | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.isEventPinned", + "type": "CompoundType", + "tags": [], + "label": "isEventPinned", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.isEventViewer", + "type": "CompoundType", + "tags": [], + "label": "isEventViewer", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.rowIndex", + "type": "number", + "tags": [], + "label": "rowIndex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.refetch", + "type": "Function", + "tags": [], + "label": "refetch", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.onRuleChange", + "type": "Function", + "tags": [], + "label": "onRuleChange", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.showNotes", + "type": "CompoundType", + "tags": [], + "label": "showNotes", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.tabType", + "type": "CompoundType", + "tags": [], + "label": "tabType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.timelineId", + "type": "string", + "tags": [], + "label": "timelineId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ActionProps.toggleShowNotes", + "type": "Function", + "tags": [], + "label": "toggleShowNotes", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 40 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BaseHit", + "type": "Interface", + "tags": [], + "label": "BaseHit", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BaseHit", + "text": "BaseHit" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 23 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.BaseHit._index", + "type": "string", + "tags": [], + "label": "_index", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 24 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BaseHit._id", + "type": "string", + "tags": [], + "label": "_id", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BaseHit._source", + "type": "Uncategorized", + "tags": [], + "label": "_source", + "description": [], + "signature": [ + "T" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BaseHit.fields", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "Record<string, ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SearchTypes", + "text": "SearchTypes" + }, + "[]> | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 27 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField", + "type": "Interface", + "tags": [], + "label": "BrowserField", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 63 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.aggregatable", + "type": "boolean", + "tags": [], + "label": "aggregatable", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 64 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.category", + "type": "string", + "tags": [], + "label": "category", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 65 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 66 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [], + "signature": [ + "string | number | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 67 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.fields", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "{ readonly [x: string]: Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 68 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.format", + "type": "string", + "tags": [], + "label": "format", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 69 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.indexes", + "type": "Array", + "tags": [], + "label": "indexes", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 70 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 71 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.searchable", + "type": "boolean", + "tags": [], + "label": "searchable", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 72 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 73 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserField.subType", + "type": "Object", + "tags": [], + "label": "subType", + "description": [], + "signature": [ + "{ [key: string]: unknown; nested?: { path: string; } | undefined; } | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 74 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BulkGetInput", + "type": "Interface", + "tags": [], + "label": "BulkGetInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 435 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.BulkGetInput.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 436 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BulkGetInput.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 437 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput", + "type": "Interface", + "tags": [], + "label": "ColumnHeaderInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 80 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.aggregatable", + "type": "CompoundType", + "tags": [], + "label": "aggregatable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 81 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.category", + "type": "CompoundType", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 82 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.columnHeaderType", + "type": "CompoundType", + "tags": [], + "label": "columnHeaderType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 83 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 84 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 85 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.indexes", + "type": "CompoundType", + "tags": [], + "label": "indexes", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 86 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 87 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 88 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.placeholder", + "type": "CompoundType", + "tags": [], + "label": "placeholder", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 89 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.searchable", + "type": "CompoundType", + "tags": [], + "label": "searchable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 90 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderInput.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 91 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult", + "type": "Interface", + "tags": [], + "label": "ColumnHeaderResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 607 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.aggregatable", + "type": "CompoundType", + "tags": [], + "label": "aggregatable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 608 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.category", + "type": "CompoundType", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 609 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.columnHeaderType", + "type": "CompoundType", + "tags": [], + "label": "columnHeaderType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 610 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 611 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 612 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.indexes", + "type": "CompoundType", + "tags": [], + "label": "indexes", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 613 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 614 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 615 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.placeholder", + "type": "CompoundType", + "tags": [], + "label": "placeholder", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 616 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.searchable", + "type": "CompoundType", + "tags": [], + "label": "searchable", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 617 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderResult.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 618 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnRenderer", + "type": "Interface", + "tags": [], + "label": "ColumnRenderer", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ColumnRenderer.isInstance", + "type": "Function", + "tags": [], + "label": "isInstance", + "description": [], + "signature": [ + "(columnName: string, data: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]) => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.columnName", + "type": "string", + "tags": [], + "label": "columnName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 36 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnRenderer.renderColumn", + "type": "Function", + "tags": [], + "label": "renderColumn", + "description": [], + "signature": [ + "({ columnName, eventId, field, timelineId, truncate, values, linkValues, }: { columnName: string; eventId: string; field: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "; timelineId: string; truncate?: boolean | undefined; values: string[] | null | undefined; linkValues?: string[] | null | undefined; }) => React.ReactNode" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ columnName: string; eventId: string; field: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "; timelineId: string; truncate?: boolean | undefined; values: string[] | null | undefined; linkValues?: string[] | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 37 + }, + "deprecated": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.CursorType", + "type": "Interface", + "tags": [], + "label": "CursorType", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.CursorType.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 17 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.CursorType.tiebreaker", + "type": "CompoundType", + "tags": [], + "label": "tiebreaker", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 18 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider", + "type": "Interface", + "tags": [], + "label": "DataProvider", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 32 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "Uniquely identifies a data provider" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "Human readable" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [ + "\nWhen `false`, a data provider is temporarily disabled, but not removed from\nthe timeline. default: `true`" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.excluded", + "type": "boolean", + "tags": [], + "label": "excluded", + "description": [ + "\nWhen `true`, a data provider is excluding the match, but not removed from\nthe timeline. default: `false`" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.kqlQuery", + "type": "string", + "tags": [], + "label": "kqlQuery", + "description": [ + "\nReturns the KQL query who have been added by user" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.queryMatch", + "type": "Object", + "tags": [], + "label": "queryMatch", + "description": [ + "\nReturns a query properties that, when executed, returns the data for this provider" + ], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.QueryMatch", + "text": "QueryMatch" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.and", + "type": "Array", + "tags": [], + "label": "and", + "description": [ + "\nAdditional query clauses that are ANDed with this query to narrow results" + ], + "signature": [ + "Pick<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProvider", + "text": "DataProvider" + }, + ", \"type\" | \"enabled\" | \"id\" | \"name\" | \"excluded\" | \"kqlQuery\" | \"queryMatch\">[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvider.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [ + "\nReturns a DataProviderType" + ], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 62 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput", + "type": "Interface", + "tags": [], + "label": "DataProviderInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 106 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 107 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 108 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.enabled", + "type": "CompoundType", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 109 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.excluded", + "type": "CompoundType", + "tags": [], + "label": "excluded", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 110 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 111 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.queryMatch", + "type": "CompoundType", + "tags": [], + "label": "queryMatch", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.QueryMatchInput", + "text": "QueryMatchInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 112 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.and", + "type": "CompoundType", + "tags": [], + "label": "and", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderInput", + "text": "DataProviderInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 113 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderInput.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 114 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult", + "type": "Interface", + "tags": [], + "label": "DataProviderResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 621 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.id", + "type": "CompoundType", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 622 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 623 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.enabled", + "type": "CompoundType", + "tags": [], + "label": "enabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 624 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.excluded", + "type": "CompoundType", + "tags": [], + "label": "excluded", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 625 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 626 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.queryMatch", + "type": "CompoundType", + "tags": [], + "label": "queryMatch", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.QueryMatchResult", + "text": "QueryMatchResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 627 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 628 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderResult.and", + "type": "CompoundType", + "tags": [], + "label": "and", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderResult", + "text": "DataProviderResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 629 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DateRangePickerInput", + "type": "Interface", + "tags": [], + "label": "DateRangePickerInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 163 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.DateRangePickerInput.start", + "type": "CompoundType", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 164 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DateRangePickerInput.end", + "type": "CompoundType", + "tags": [], + "label": "end", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 165 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DateRangePickerResult", + "type": "Interface", + "tags": [], + "label": "DateRangePickerResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 640 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.DateRangePickerResult.start", + "type": "Any", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 642 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DateRangePickerResult.end", + "type": "Any", + "tags": [], + "label": "end", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 644 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsData", + "type": "Interface", + "tags": [], + "label": "EqlOptionsData", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 32 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsData.keywordFields", + "type": "Array", + "tags": [], + "label": "keywordFields", + "description": [], + "signature": [ + "EuiComboBoxOptionOption", + "<string | number | string[] | undefined>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsData.dateFields", + "type": "Array", + "tags": [], + "label": "dateFields", + "description": [], + "signature": [ + "EuiComboBoxOptionOption", + "<string | number | string[] | undefined>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsData.nonDateFields", + "type": "Array", + "tags": [], + "label": "nonDateFields", + "description": [], + "signature": [ + "EuiComboBoxOptionOption", + "<string | number | string[] | undefined>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 35 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsInput", + "type": "Interface", + "tags": [], + "label": "EqlOptionsInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 117 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsInput.eventCategoryField", + "type": "CompoundType", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 118 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsInput.tiebreakerField", + "type": "CompoundType", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 119 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsInput.timestampField", + "type": "CompoundType", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 120 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsInput.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 121 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsInput.size", + "type": "CompoundType", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 122 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsResult", + "type": "Interface", + "tags": [], + "label": "EqlOptionsResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 647 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsResult.eventCategoryField", + "type": "CompoundType", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 648 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsResult.tiebreakerField", + "type": "CompoundType", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 649 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsResult.timestampField", + "type": "CompoundType", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 650 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsResult.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 651 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsResult.size", + "type": "Any", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 653 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsSelected", + "type": "Interface", + "tags": [], + "label": "EqlOptionsSelected", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsSelected.eventCategoryField", + "type": "string", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsSelected.tiebreakerField", + "type": "string", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsSelected.timestampField", + "type": "string", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsSelected.query", + "type": "string", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlOptionsSelected.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 43 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSearchResponse", + "type": "Interface", + "tags": [], + "label": "EqlSearchResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlSearchResponse", + "text": "EqlSearchResponse" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EqlSearchResponse.is_partial", + "type": "boolean", + "tags": [], + "label": "is_partial", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSearchResponse.is_running", + "type": "boolean", + "tags": [], + "label": "is_running", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSearchResponse.took", + "type": "number", + "tags": [], + "label": "took", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSearchResponse.timed_out", + "type": "boolean", + "tags": [], + "label": "timed_out", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSearchResponse.hits", + "type": "Object", + "tags": [], + "label": "hits", + "description": [], + "signature": [ + "{ total: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TotalValue", + "text": "TotalValue" + }, + "; sequences?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlSequence", + "text": "EqlSequence" + }, + "<T>[] | undefined; events?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BaseHit", + "text": "BaseHit" + }, + "<T>[] | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 40 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSequence", + "type": "Interface", + "tags": [], + "label": "EqlSequence", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlSequence", + "text": "EqlSequence" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EqlSequence.join_keys", + "type": "Array", + "tags": [], + "label": "join_keys", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SearchTypes", + "text": "SearchTypes" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EqlSequence.events", + "type": "Array", + "tags": [], + "label": "events", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BaseHit", + "text": "BaseHit" + }, + "<T>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 32 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ErrorResponse", + "type": "Interface", + "tags": [], + "label": "ErrorResponse", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 19 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ErrorResponse.error", + "type": "CompoundType", + "tags": [], + "label": "error", + "description": [], + "signature": [ + "ErrorCause & { root_cause: ErrorCause[]; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/validation/helpers.ts", + "lineNumber": 20 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EventHit", + "type": "Interface", + "tags": [], + "label": "EventHit", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EventHit", + "text": "EventHit" + }, + " extends ", + "SearchHit", + "<Record<string, any>>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 77 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EventHit.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 78 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EventHit.fields", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Fields", + "text": "Fields" + }, + "<unknown[]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 79 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EventSource", + "type": "Interface", + "tags": [], + "label": "EventSource", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 71 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EventSource.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 73 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportedNotes", + "type": "Interface", + "tags": [], + "label": "ExportedNotes", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 420 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ExportedNotes.eventNotes", + "type": "Array", + "tags": [], + "label": "eventNotes", + "description": [], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 421 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportedNotes.globalNotes", + "type": "Array", + "tags": [], + "label": "globalNotes", + "description": [], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 422 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportTimelineNotFoundError", + "type": "Interface", + "tags": [], + "label": "ExportTimelineNotFoundError", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 430 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ExportTimelineNotFoundError.statusCode", + "type": "number", + "tags": [], + "label": "statusCode", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 431 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportTimelineNotFoundError.message", + "type": "string", + "tags": [], + "label": "message", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 432 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.Fields", + "type": "Interface", + "tags": [], + "label": "Fields", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Fields", + "text": "Fields" + }, + "<T>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 67 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.Fields.Unnamed", + "type": "Any", + "tags": [], + "label": "Unnamed", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 68 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput", + "type": "Interface", + "tags": [], + "label": "FilterMetaTimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 125 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.alias", + "type": "CompoundType", + "tags": [], + "label": "alias", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 126 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.controlledBy", + "type": "CompoundType", + "tags": [], + "label": "controlledBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 127 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.disabled", + "type": "CompoundType", + "tags": [], + "label": "disabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 128 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 129 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.formattedValue", + "type": "CompoundType", + "tags": [], + "label": "formattedValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 130 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.index", + "type": "CompoundType", + "tags": [], + "label": "index", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 131 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.key", + "type": "CompoundType", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 132 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.negate", + "type": "CompoundType", + "tags": [], + "label": "negate", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 133 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.params", + "type": "CompoundType", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 134 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 135 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineInput.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 136 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult", + "type": "Interface", + "tags": [], + "label": "FilterMetaTimelineResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 666 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.alias", + "type": "CompoundType", + "tags": [], + "label": "alias", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 667 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.controlledBy", + "type": "CompoundType", + "tags": [], + "label": "controlledBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 668 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.disabled", + "type": "CompoundType", + "tags": [], + "label": "disabled", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 669 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 670 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.formattedValue", + "type": "CompoundType", + "tags": [], + "label": "formattedValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 671 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.index", + "type": "CompoundType", + "tags": [], + "label": "index", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 672 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.key", + "type": "CompoundType", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 673 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.negate", + "type": "CompoundType", + "tags": [], + "label": "negate", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 674 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.params", + "type": "CompoundType", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 675 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 676 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterMetaTimelineResult.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 677 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput", + "type": "Interface", + "tags": [], + "label": "FilterTimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 139 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.exists", + "type": "CompoundType", + "tags": [], + "label": "exists", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 140 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.meta", + "type": "CompoundType", + "tags": [], + "label": "meta", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.FilterMetaTimelineInput", + "text": "FilterMetaTimelineInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 141 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.match_all", + "type": "CompoundType", + "tags": [], + "label": "match_all", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 142 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.missing", + "type": "CompoundType", + "tags": [], + "label": "missing", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 143 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 144 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.range", + "type": "CompoundType", + "tags": [], + "label": "range", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 145 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineInput.script", + "type": "CompoundType", + "tags": [], + "label": "script", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 146 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult", + "type": "Interface", + "tags": [], + "label": "FilterTimelineResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 656 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.exists", + "type": "CompoundType", + "tags": [], + "label": "exists", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 657 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.meta", + "type": "CompoundType", + "tags": [], + "label": "meta", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.FilterMetaTimelineResult", + "text": "FilterMetaTimelineResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 658 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.match_all", + "type": "CompoundType", + "tags": [], + "label": "match_all", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 659 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.missing", + "type": "CompoundType", + "tags": [], + "label": "missing", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 660 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 661 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.range", + "type": "CompoundType", + "tags": [], + "label": "range", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 662 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FilterTimelineResult.script", + "type": "CompoundType", + "tags": [], + "label": "script", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 663 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables", + "type": "Interface", + "tags": [], + "label": "GetAllTimelineVariables", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 737 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.PageInfoTimeline", + "text": "PageInfoTimeline" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 738 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables.search", + "type": "CompoundType", + "tags": [], + "label": "search", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 739 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortTimeline", + "text": "SortTimeline" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 740 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables.onlyUserFavorite", + "type": "CompoundType", + "tags": [], + "label": "onlyUserFavorite", + "description": [], + "signature": [ + "boolean | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 741 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 742 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetAllTimelineVariables.status", + "type": "CompoundType", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 743 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps", + "type": "Interface", + "tags": [], + "label": "HeaderActionProps", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 43 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.width", + "type": "number", + "tags": [], + "label": "width", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.browserFields", + "type": "Object", + "tags": [], + "label": "browserFields", + "description": [], + "signature": [ + "{ readonly [x: string]: Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 45 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.columnHeaders", + "type": "Array", + "tags": [], + "label": "columnHeaders", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.isEventViewer", + "type": "CompoundType", + "tags": [], + "label": "isEventViewer", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.isSelectAllChecked", + "type": "boolean", + "tags": [], + "label": "isSelectAllChecked", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.onSelectAll", + "type": "Function", + "tags": [], + "label": "onSelectAll", + "description": [], + "signature": [ + "({ isSelected }: { isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 49 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ isSelected: boolean; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 49 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.showEventsSelect", + "type": "boolean", + "tags": [], + "label": "showEventsSelect", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.showSelectAllCheckbox", + "type": "boolean", + "tags": [], + "label": "showSelectAllCheckbox", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortColumnTimeline", + "text": "SortColumnTimeline" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.tabType", + "type": "Enum", + "tags": [], + "label": "tabType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderActionProps.timelineId", + "type": "string", + "tags": [], + "label": "timelineId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 54 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField", + "type": "Interface", + "tags": [], + "label": "IndexField", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.category", + "type": "string", + "tags": [], + "label": "category", + "description": [ + "Where the field belong" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.example", + "type": "CompoundType", + "tags": [], + "label": "example", + "description": [ + "Example of field's value" + ], + "signature": [ + "string | number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.indexes", + "type": "Array", + "tags": [], + "label": "indexes", + "description": [ + "whether the field's belong to an alias index" + ], + "signature": [ + "(string | null)[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "The name of the field" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 35 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.type", + "type": "string", + "tags": [], + "label": "type", + "description": [ + "The type of the field's values as recognized by Kibana" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.searchable", + "type": "boolean", + "tags": [], + "label": "searchable", + "description": [ + "Whether the field's values can be efficiently searched for" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.aggregatable", + "type": "boolean", + "tags": [], + "label": "aggregatable", + "description": [ + "Whether the field's values can be aggregated" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [ + "Description of the field" + ], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.format", + "type": "CompoundType", + "tags": [], + "label": "format", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.esTypes", + "type": "Array", + "tags": [], + "label": "esTypes", + "description": [ + "the elastic type as mapped in the index" + ], + "signature": [ + "string[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.subType", + "type": "Object", + "tags": [], + "label": "subType", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IFieldSubType", + "text": "IFieldSubType" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 47 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexField.readFromDocValues", + "type": "boolean", + "tags": [], + "label": "readFromDocValues", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 48 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexFieldsStrategyRequest", + "type": "Interface", + "tags": [], + "label": "IndexFieldsStrategyRequest", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.IndexFieldsStrategyRequest", + "text": "IndexFieldsStrategyRequest" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 53 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.IndexFieldsStrategyRequest.indices", + "type": "Array", + "tags": [], + "label": "indices", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexFieldsStrategyRequest.onlyCheckIfIndicesExist", + "type": "boolean", + "tags": [], + "label": "onlyCheckIfIndicesExist", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 55 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexFieldsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "IndexFieldsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.IndexFieldsStrategyResponse", + "text": "IndexFieldsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 58 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.IndexFieldsStrategyResponse.indexFields", + "type": "Array", + "tags": [], + "label": "indexFields", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.IndexField", + "text": "IndexField" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IndexFieldsStrategyResponse.indicesExist", + "type": "Array", + "tags": [], + "label": "indicesExist", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 60 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.Inspect", + "type": "Interface", + "tags": [], + "label": "Inspect", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 21 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.Inspect.dsl", + "type": "Array", + "tags": [], + "label": "dsl", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQuery", + "type": "Interface", + "tags": [], + "label": "KueryFilterQuery", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQuery.kind", + "type": "CompoundType", + "tags": [], + "label": "kind", + "description": [], + "signature": [ + "\"eql\" | \"lucene\" | \"kuery\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQuery.expression", + "type": "string", + "tags": [], + "label": "expression", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryInput", + "type": "Interface", + "tags": [], + "label": "KueryFilterQueryInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 158 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryInput.kind", + "type": "CompoundType", + "tags": [], + "label": "kind", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 159 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryInput.expression", + "type": "CompoundType", + "tags": [], + "label": "expression", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 160 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryResult", + "type": "Interface", + "tags": [], + "label": "KueryFilterQueryResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 689 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryResult.kind", + "type": "CompoundType", + "tags": [], + "label": "kind", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 690 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryResult.expression", + "type": "CompoundType", + "tags": [], + "label": "expression", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 691 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.LastTimeDetails", + "type": "Interface", + "tags": [], + "label": "LastTimeDetails", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.LastTimeDetails.hostName", + "type": "CompoundType", + "tags": [], + "label": "hostName", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.LastTimeDetails.ip", + "type": "CompoundType", + "tags": [], + "label": "ip", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 21 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PageInfoTimeline", + "type": "Interface", + "tags": [], + "label": "PageInfoTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 601 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.PageInfoTimeline.pageIndex", + "type": "number", + "tags": [], + "label": "pageIndex", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 602 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PageInfoTimeline.pageSize", + "type": "number", + "tags": [], + "label": "pageSize", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 604 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PaginationInputPaginated", + "type": "Interface", + "tags": [], + "label": "PaginationInputPaginated", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 44 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.PaginationInputPaginated.activePage", + "type": "number", + "tags": [], + "label": "activePage", + "description": [ + "The activePage parameter defines the page of results you want to fetch" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 46 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PaginationInputPaginated.cursorStart", + "type": "number", + "tags": [], + "label": "cursorStart", + "description": [ + "The cursorStart parameter defines the start of the results to be displayed" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PaginationInputPaginated.fakePossibleCount", + "type": "number", + "tags": [], + "label": "fakePossibleCount", + "description": [ + "The fakePossibleCount parameter determines the total count in order to show 5 additional pages" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PaginationInputPaginated.querySize", + "type": "number", + "tags": [], + "label": "querySize", + "description": [ + "The querySize parameter is the number of items to be returned" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 52 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatch", + "type": "Interface", + "tags": [], + "label": "QueryMatch", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatch.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatch.displayField", + "type": "string", + "tags": [], + "label": "displayField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatch.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | number" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatch.displayValue", + "type": "CompoundType", + "tags": [], + "label": "displayValue", + "description": [], + "signature": [ + "string | number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatch.operator", + "type": "CompoundType", + "tags": [], + "label": "operator", + "description": [], + "signature": [ + "\":\" | \":*\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 29 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchInput", + "type": "Interface", + "tags": [], + "label": "QueryMatchInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 94 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchInput.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 95 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchInput.displayField", + "type": "CompoundType", + "tags": [], + "label": "displayField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 97 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchInput.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 99 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchInput.displayValue", + "type": "CompoundType", + "tags": [], + "label": "displayValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 101 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchInput.operator", + "type": "CompoundType", + "tags": [], + "label": "operator", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 103 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchResult", + "type": "Interface", + "tags": [], + "label": "QueryMatchResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 632 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchResult.field", + "type": "CompoundType", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 633 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchResult.displayField", + "type": "CompoundType", + "tags": [], + "label": "displayField", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 634 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchResult.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 635 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchResult.displayValue", + "type": "CompoundType", + "tags": [], + "label": "displayValue", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 636 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryMatchResult.operator", + "type": "CompoundType", + "tags": [], + "label": "operator", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 637 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ResponseTimeline", + "type": "Interface", + "tags": [], + "label": "ResponseTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 727 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.ResponseTimeline.code", + "type": "CompoundType", + "tags": [], + "label": "code", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 728 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ResponseTimeline.message", + "type": "CompoundType", + "tags": [], + "label": "message", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 729 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ResponseTimeline.timeline", + "type": "Object", + "tags": [], + "label": "timeline", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineResult", + "text": "TimelineResult" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 730 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.RowRenderer", + "type": "Interface", + "tags": [], + "label": "RowRenderer", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.RowRenderer.id", + "type": "Enum", + "tags": [], + "label": "id", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.RowRenderer.isInstance", + "type": "Function", + "tags": [], + "label": "isInstance", + "description": [], + "signature": [ + "(data: ", + "Ecs", + ") => boolean" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.data", + "type": "Object", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "Ecs" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 14 + }, + "deprecated": false + } + ] + }, + { + "parentPluginId": "timelines", + "id": "def-common.RowRenderer.renderRow", + "type": "Function", + "tags": [], + "label": "renderRow", + "description": [], + "signature": [ + "({ browserFields, data, timelineId, }: { browserFields: Readonly<Record<string, Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">>>; data: ", + "Ecs", + "; timelineId: string; }) => React.ReactNode" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 15 + }, + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.__0", + "type": "Object", + "tags": [], + "label": "__0", + "description": [], + "signature": [ + "{ browserFields: Readonly<Record<string, Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">>>; data: ", + "Ecs", + "; timelineId: string; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/rows/index.ts", + "lineNumber": 15 + }, + "deprecated": false + } + ] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQuery", + "type": "Interface", + "tags": [], + "label": "SerializedFilterQuery", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQuery.kuery", + "type": "CompoundType", + "tags": [], + "label": "kuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.KueryFilterQuery", + "text": "KueryFilterQuery" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQuery.serializedQuery", + "type": "string", + "tags": [], + "label": "serializedQuery", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 31 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQueryInput", + "type": "Interface", + "tags": [], + "label": "SerializedFilterQueryInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 149 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQueryInput.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SerializedKueryQueryInput", + "text": "SerializedKueryQueryInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 150 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQueryResult", + "type": "Interface", + "tags": [], + "label": "SerializedFilterQueryResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 680 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SerializedFilterQueryResult.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SerializedKueryQueryResult", + "text": "SerializedKueryQueryResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 681 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedKueryQueryInput", + "type": "Interface", + "tags": [], + "label": "SerializedKueryQueryInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 153 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SerializedKueryQueryInput.kuery", + "type": "CompoundType", + "tags": [], + "label": "kuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.KueryFilterQueryInput", + "text": "KueryFilterQueryInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 154 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedKueryQueryInput.serializedQuery", + "type": "CompoundType", + "tags": [], + "label": "serializedQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 155 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedKueryQueryResult", + "type": "Interface", + "tags": [], + "label": "SerializedKueryQueryResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 684 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SerializedKueryQueryResult.kuery", + "type": "CompoundType", + "tags": [], + "label": "kuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.KueryFilterQueryResult", + "text": "KueryFilterQueryResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 685 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SerializedKueryQueryResult.serializedQuery", + "type": "CompoundType", + "tags": [], + "label": "serializedQuery", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 686 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortColumnTimeline", + "type": "Interface", + "tags": [], + "label": "SortColumnTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SortColumnTimeline.columnId", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 36 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortColumnTimeline.columnType", + "type": "string", + "tags": [], + "label": "columnType", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortColumnTimeline.sortDirection", + "type": "CompoundType", + "tags": [], + "label": "sortDirection", + "description": [], + "signature": [ + "\"none\" | \"asc\" | \"desc\" | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 38 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortField", + "type": "Interface", + "tags": [], + "label": "SortField", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SortField.field", + "type": "Uncategorized", + "tags": [], + "label": "field", + "description": [], + "signature": [ + "Field" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortField.direction", + "type": "Enum", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 32 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortTimeline", + "type": "Interface", + "tags": [], + "label": "SortTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 732 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SortTimeline.sortField", + "type": "Enum", + "tags": [], + "label": "sortField", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 733 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortTimeline.sortOrder", + "type": "Enum", + "tags": [], + "label": "sortOrder", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 734 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortTimelineInput", + "type": "Interface", + "tags": [], + "label": "SortTimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 168 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.SortTimelineInput.columnId", + "type": "CompoundType", + "tags": [], + "label": "columnId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 169 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortTimelineInput.sortDirection", + "type": "CompoundType", + "tags": [], + "label": "sortDirection", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 170 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEdges", + "type": "Interface", + "tags": [], + "label": "TimelineEdges", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEdges.node", + "type": "Object", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineItem", + "text": "TimelineItem" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEdges.cursor", + "type": "Object", + "tags": [], + "label": "cursor", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.CursorType", + "text": "CursorType" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 15 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEqlRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEqlRequestOptions", + "text": "TimelineEqlRequestOptions" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EqlSearchStrategyRequest", + "text": "EqlSearchStrategyRequest" + }, + ",Pick<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllRequestOptions", + "text": "TimelineEventsAllRequestOptions" + }, + ", \"id\" | \"sort\" | \"fields\" | \"language\" | \"timerange\" | \"defaultIndex\" | \"pagination\" | \"filterQuery\" | \"docValueFields\" | \"factoryQueryType\" | \"indexType\" | \"fieldRequested\" | \"excludeEcsData\">" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlRequestOptions.eventCategoryField", + "type": "string", + "tags": [], + "label": "eventCategoryField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlRequestOptions.tiebreakerField", + "type": "string", + "tags": [], + "label": "tiebreakerField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlRequestOptions.timestampField", + "type": "string", + "tags": [], + "label": "timestampField", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlRequestOptions.size", + "type": "number", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEqlResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEqlResponse", + "text": "TimelineEqlResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EqlSearchStrategyResponse", + "text": "EqlSearchStrategyResponse" + }, + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlSearchResponse", + "text": "EqlSearchResponse" + }, + "<unknown>>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEdges", + "text": "TimelineEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 27 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + "{ activePage: number; querySize: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 28 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEqlResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 29 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEventsAllRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllRequestOptions", + "text": "TimelineEventsAllRequestOptions" + }, + " extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestOptionsPaginated", + "text": "TimelineRequestOptionsPaginated" + }, + "<string>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 37 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllRequestOptions.fields", + "type": "CompoundType", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "string[] | { field: string; include_unmapped: boolean; }[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 38 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllRequestOptions.fieldRequested", + "type": "Array", + "tags": [], + "label": "fieldRequested", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllRequestOptions.language", + "type": "CompoundType", + "tags": [], + "label": "language", + "description": [], + "signature": [ + "\"eql\" | \"lucene\" | \"kuery\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllRequestOptions.excludeEcsData", + "type": "CompoundType", + "tags": [], + "label": "excludeEcsData", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEventsAllStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllStrategyResponse", + "text": "TimelineEventsAllStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 30 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllStrategyResponse.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEdges", + "text": "TimelineEdges" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllStrategyResponse.totalCount", + "type": "number", + "tags": [], + "label": "totalCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllStrategyResponse.pageInfo", + "type": "Object", + "tags": [], + "label": "pageInfo", + "description": [], + "signature": [ + "{ activePage: number; querySize: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsAllStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 34 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem", + "type": "Interface", + "tags": [], + "label": "TimelineEventsDetailsItem", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem.ariaRowindex", + "type": "CompoundType", + "tags": [], + "label": "ariaRowindex", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 13 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem.category", + "type": "string", + "tags": [], + "label": "category", + "description": [], + "signature": [ + "string | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 14 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 15 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem.values", + "type": "CompoundType", + "tags": [], + "label": "values", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 16 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem.originalValue", + "type": "Any", + "tags": [], + "label": "originalValue", + "description": [], + "signature": [ + "any" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 18 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsItem.isObjectArray", + "type": "boolean", + "tags": [], + "label": "isObjectArray", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 19 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEventsDetailsRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsRequestOptions", + "text": "TimelineEventsDetailsRequestOptions" + }, + " extends Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestOptionsPaginated", + "text": "TimelineRequestOptionsPaginated" + }, + "<string>>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 27 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsRequestOptions.indexName", + "type": "string", + "tags": [], + "label": "indexName", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 29 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsRequestOptions.eventId", + "type": "string", + "tags": [], + "label": "eventId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 30 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEventsDetailsStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsStrategyResponse", + "text": "TimelineEventsDetailsStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 22 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsStrategyResponse.data", + "type": "CompoundType", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsItem", + "text": "TimelineEventsDetailsItem" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 23 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsDetailsStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/details/index.ts", + "lineNumber": 24 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsLastEventTimeRequestOptions", + "type": "Interface", + "tags": [], + "label": "TimelineEventsLastEventTimeRequestOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeRequestOptions", + "text": "TimelineEventsLastEventTimeRequestOptions" + }, + " extends Pick<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + }, + ", \"id\" | \"params\" | \"defaultIndex\" | \"docValueFields\" | \"factoryQueryType\" | \"indexType\">" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsLastEventTimeRequestOptions.indexKey", + "type": "Enum", + "tags": [], + "label": "indexKey", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.LastEventIndexKey", + "text": "LastEventIndexKey" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsLastEventTimeRequestOptions.details", + "type": "Object", + "tags": [], + "label": "details", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.LastTimeDetails", + "text": "LastTimeDetails" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsLastEventTimeStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineEventsLastEventTimeStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeStrategyResponse", + "text": "TimelineEventsLastEventTimeStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 24 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsLastEventTimeStrategyResponse.lastSeen", + "type": "CompoundType", + "tags": [], + "label": "lastSeen", + "description": [], + "signature": [ + "string | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 25 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsLastEventTimeStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 26 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput", + "type": "Interface", + "tags": [], + "label": "TimelineInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 173 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.columns", + "type": "CompoundType", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderInput", + "text": "ColumnHeaderInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 174 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.dataProviders", + "type": "CompoundType", + "tags": [], + "label": "dataProviders", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderInput", + "text": "DataProviderInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 175 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 176 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.eqlOptions", + "type": "CompoundType", + "tags": [], + "label": "eqlOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlOptionsInput", + "text": "EqlOptionsInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 177 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.eventType", + "type": "CompoundType", + "tags": [], + "label": "eventType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 178 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.excludedRowRendererIds", + "type": "CompoundType", + "tags": [], + "label": "excludedRowRendererIds", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 179 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.filters", + "type": "CompoundType", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.FilterTimelineInput", + "text": "FilterTimelineInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 180 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.kqlMode", + "type": "CompoundType", + "tags": [], + "label": "kqlMode", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 181 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SerializedFilterQueryInput", + "text": "SerializedFilterQueryInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 182 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.indexNames", + "type": "CompoundType", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 183 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.title", + "type": "CompoundType", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 184 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.templateTimelineId", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 185 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.templateTimelineVersion", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineVersion", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 186 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 187 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.dateRange", + "type": "CompoundType", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DateRangePickerInput", + "text": "DateRangePickerInput" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 188 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.savedQueryId", + "type": "CompoundType", + "tags": [], + "label": "savedQueryId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 189 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortTimelineInput", + "text": "SortTimelineInput" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 190 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineInput.status", + "type": "CompoundType", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 191 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineItem", + "type": "Interface", + "tags": [], + "label": "TimelineItem", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 18 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineItem._id", + "type": "string", + "tags": [], + "label": "_id", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 19 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineItem._index", + "type": "CompoundType", + "tags": [], + "label": "_index", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 20 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineItem.data", + "type": "Array", + "tags": [], + "label": "data", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 21 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineItem.ecs", + "type": "Object", + "tags": [], + "label": "ecs", + "description": [], + "signature": [ + "Ecs" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 22 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse", + "type": "Interface", + "tags": [], + "label": "TimelineKpiStrategyResponse", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineKpiStrategyResponse", + "text": "TimelineKpiStrategyResponse" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchResponse", + "text": "IEsSearchResponse" + }, + "<any>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 29 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse.destinationIpCount", + "type": "number", + "tags": [], + "label": "destinationIpCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 30 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse.inspect", + "type": "CompoundType", + "tags": [], + "label": "inspect", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Inspect", + "text": "Inspect" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 31 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse.hostCount", + "type": "number", + "tags": [], + "label": "hostCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 32 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse.processCount", + "type": "number", + "tags": [], + "label": "processCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 33 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse.sourceIpCount", + "type": "number", + "tags": [], + "label": "sourceIpCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 34 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineKpiStrategyResponse.userCount", + "type": "number", + "tags": [], + "label": "userCount", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 35 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineNonEcsData", + "type": "Interface", + "tags": [], + "label": "TimelineNonEcsData", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineNonEcsData.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineNonEcsData.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/all/index.ts", + "lineNumber": 27 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput", + "type": "Interface", + "tags": [], + "label": "TimelinePersistInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 41 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.dataProviders", + "type": "Array", + "tags": [], + "label": "dataProviders", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProvider", + "text": "DataProvider" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 43 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.dateRange", + "type": "Object", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + "{ start: string; end: string; } | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 44 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.excludedRowRendererIds", + "type": "Array", + "tags": [], + "label": "excludedRowRendererIds", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 48 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.expandedDetail", + "type": "Object", + "tags": [], + "label": "expandedDetail", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineExpandedDetail", + "text": "TimelineExpandedDetail" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 49 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 50 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.columns", + "type": "Array", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 51 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.itemsPerPage", + "type": "number", + "tags": [], + "label": "itemsPerPage", + "description": [], + "signature": [ + "number | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.indexNames", + "type": "Array", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 53 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.kqlQuery", + "type": "Object", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + "{ filterQuery: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SerializedFilterQuery", + "text": "SerializedFilterQuery" + }, + " | null; } | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 54 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.show", + "type": "CompoundType", + "tags": [], + "label": "show", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 57 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "({ columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[])[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 58 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.showCheckboxes", + "type": "CompoundType", + "tags": [], + "label": "showCheckboxes", + "description": [], + "signature": [ + "boolean | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 59 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 60 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.templateTimelineId", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 61 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelinePersistInput.templateTimelineVersion", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineVersion", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 62 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestBasicOptions", + "type": "Interface", + "tags": [], + "label": "TimelineRequestBasicOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IEsSearchRequest", + "text": "IEsSearchRequest" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 38 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestBasicOptions.timerange", + "type": "Object", + "tags": [], + "label": "timerange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimerangeInput", + "text": "TimerangeInput" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestBasicOptions.filterQuery", + "type": "CompoundType", + "tags": [], + "label": "filterQuery", + "description": [], + "signature": [ + "string | ", + "JsonObject", + " | ", + "ESRangeQuery", + " | ", + "ESQueryStringQuery", + " | ", + "ESMatchQuery", + " | ", + "ESTermQuery", + " | ", + "ESBoolQuery", + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 40 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestBasicOptions.defaultIndex", + "type": "Array", + "tags": [], + "label": "defaultIndex", + "description": [], + "signature": [ + "string[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 41 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestBasicOptions.docValueFields", + "type": "Array", + "tags": [], + "label": "docValueFields", + "description": [], + "signature": [ + "SearchDocValueField", + "[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 42 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestBasicOptions.factoryQueryType", + "type": "CompoundType", + "tags": [], + "label": "factoryQueryType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + " | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 43 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestOptionsPaginated", + "type": "Interface", + "tags": [], + "label": "TimelineRequestOptionsPaginated", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestOptionsPaginated", + "text": "TimelineRequestOptionsPaginated" + }, + "<Field> extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 50 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestOptionsPaginated.pagination", + "type": "Object", + "tags": [], + "label": "pagination", + "description": [], + "signature": [ + "{ activePage: number; querySize: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 52 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestOptionsPaginated.sort", + "type": "Array", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestSortField", + "text": "TimelineRequestSortField" + }, + "<Field>[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 53 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestSortField", + "type": "Interface", + "tags": [], + "label": "TimelineRequestSortField", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestSortField", + "text": "TimelineRequestSortField" + }, + "<Field> extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortField", + "text": "SortField" + }, + "<Field>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 46 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineRequestSortField.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 47 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult", + "type": "Interface", + "tags": [], + "label": "TimelineResult", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 694 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.columns", + "type": "CompoundType", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderResult", + "text": "ColumnHeaderResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 695 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.created", + "type": "CompoundType", + "tags": [], + "label": "created", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 696 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.createdBy", + "type": "CompoundType", + "tags": [], + "label": "createdBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 697 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.dataProviders", + "type": "CompoundType", + "tags": [], + "label": "dataProviders", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderResult", + "text": "DataProviderResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 698 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.dateRange", + "type": "CompoundType", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DateRangePickerResult", + "text": "DateRangePickerResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 699 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.description", + "type": "CompoundType", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 700 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.eqlOptions", + "type": "CompoundType", + "tags": [], + "label": "eqlOptions", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.EqlOptionsResult", + "text": "EqlOptionsResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 701 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.eventIdToNoteIds", + "type": "CompoundType", + "tags": [], + "label": "eventIdToNoteIds", + "description": [], + "signature": [ + "NoteResult", + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 702 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.eventType", + "type": "CompoundType", + "tags": [], + "label": "eventType", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 703 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.excludedRowRendererIds", + "type": "CompoundType", + "tags": [], + "label": "excludedRowRendererIds", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 704 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.favorite", + "type": "CompoundType", + "tags": [], + "label": "favorite", + "description": [], + "signature": [ + "{ fullName?: string | null | undefined; userName?: string | null | undefined; favoriteDate?: number | null | undefined; }[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 705 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.filters", + "type": "CompoundType", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.FilterTimelineResult", + "text": "FilterTimelineResult" + }, + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 706 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.kqlMode", + "type": "CompoundType", + "tags": [], + "label": "kqlMode", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 707 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.kqlQuery", + "type": "CompoundType", + "tags": [], + "label": "kqlQuery", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SerializedFilterQueryResult", + "text": "SerializedFilterQueryResult" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 708 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.indexNames", + "type": "CompoundType", + "tags": [], + "label": "indexNames", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 709 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.notes", + "type": "CompoundType", + "tags": [], + "label": "notes", + "description": [], + "signature": [ + "NoteResult", + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 710 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.noteIds", + "type": "CompoundType", + "tags": [], + "label": "noteIds", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 711 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.pinnedEventIds", + "type": "CompoundType", + "tags": [], + "label": "pinnedEventIds", + "description": [], + "signature": [ + "string[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 712 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.pinnedEventsSaveObject", + "type": "CompoundType", + "tags": [], + "label": "pinnedEventsSaveObject", + "description": [], + "signature": [ + "PinnedEvent", + "[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 713 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.savedQueryId", + "type": "CompoundType", + "tags": [], + "label": "savedQueryId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 714 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.savedObjectId", + "type": "string", + "tags": [], + "label": "savedObjectId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 715 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + "{ columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 716 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.status", + "type": "CompoundType", + "tags": [], + "label": "status", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 717 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.title", + "type": "CompoundType", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 718 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.templateTimelineId", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineId", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 719 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.templateTimelineVersion", + "type": "CompoundType", + "tags": [], + "label": "templateTimelineVersion", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 720 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.timelineType", + "type": "CompoundType", + "tags": [], + "label": "timelineType", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 721 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.updated", + "type": "CompoundType", + "tags": [], + "label": "updated", + "description": [], + "signature": [ + "number | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 722 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.updatedBy", + "type": "CompoundType", + "tags": [], + "label": "updatedBy", + "description": [], + "signature": [ + "string | null | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 723 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResult.version", + "type": "string", + "tags": [], + "label": "version", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 724 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimerangeFilter", + "type": "Interface", + "tags": [], + "label": "TimerangeFilter", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 57 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimerangeFilter.range", + "type": "Object", + "tags": [], + "label": "range", + "description": [], + "signature": [ + "{ [timestamp: string]: { gte: string; lte: string; format: string; }; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 58 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimerangeInput", + "type": "Interface", + "tags": [], + "label": "TimerangeInput", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TimerangeInput.interval", + "type": "string", + "tags": [], + "label": "interval", + "description": [ + "The interval string to use for last bucket. The format is '{value}{unit}'. For example '5m' would return the metrics for the last 5 minutes of the timespan." + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 37 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimerangeInput.to", + "type": "string", + "tags": [], + "label": "to", + "description": [ + "The end of the timerange" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 39 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimerangeInput.from", + "type": "string", + "tags": [], + "label": "from", + "description": [ + "The beginning of the timerange" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 41 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TotalValue", + "type": "Interface", + "tags": [], + "label": "TotalValue", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.TotalValue.value", + "type": "number", + "tags": [], + "label": "value", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 12 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TotalValue.relation", + "type": "string", + "tags": [], + "label": "relation", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 13 + }, + "deprecated": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderType", + "type": "Enum", + "tags": [], + "label": "DataProviderType", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 74 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.Direction", + "type": "Enum", + "tags": [], + "label": "Direction", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 25 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FlowDirection", + "type": "Enum", + "tags": [], + "label": "FlowDirection", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 194 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.LastEventIndexKey", + "type": "Enum", + "tags": [], + "label": "LastEventIndexKey", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/last_event_time/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.RowRendererId", + "type": "Enum", + "tags": [], + "label": "RowRendererId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 211 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortFieldTimeline", + "type": "Enum", + "tags": [], + "label": "SortFieldTimeline", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 525 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TemplateTimelineType", + "type": "Enum", + "tags": [], + "label": "TemplateTimelineType", + "description": [ + "\nTimeline template type" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 237 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsQueries", + "type": "Enum", + "tags": [], + "label": "TimelineEventsQueries", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineId", + "type": "Enum", + "tags": [], + "label": "TimelineId", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 311 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineStatus", + "type": "Enum", + "tags": [], + "label": "TimelineStatus", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 192 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineTabs", + "type": "Enum", + "tags": [], + "label": "TimelineTabs", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 459 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineType", + "type": "Enum", + "tags": [], + "label": "TimelineType", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 260 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "timelines", + "id": "def-common.AllTimelineSavedObject", + "type": "Type", + "tags": [], + "label": "AllTimelineSavedObject", + "description": [], + "signature": [ + "{ total: number; data: { columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 411 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.AllTimelinesResponse", + "type": "Type", + "tags": [], + "label": "AllTimelinesResponse", + "description": [], + "signature": [ + "{ timeline: ({ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; })[]; totalCount: number; } & { defaultTimelineCount: number; templateTimelineCount: number; elasticTemplateTimelineCount: number; customTemplateTimelineCount: number; favoriteCount: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 599 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ARIA_COLINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "ARIA_COLINDEX_ATTRIBUTE", + "description": [ + "\nThe name of the ARIA attribute representing a column, used in conjunction with\nthe ARIA: grid role https://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html" + ], + "signature": [ + "\"aria-colindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 20 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ARIA_ROWINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "ARIA_ROWINDEX_ATTRIBUTE", + "description": [ + "\nThe name of the ARIA attribute representing a row, used in conjunction with\nthe ARIA: grid role https://www.w3.org/TR/wai-aria-practices-1.1/examples/grid/dataGrids.html" + ], + "signature": [ + "\"aria-rowindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 35 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BeatFields", + "type": "Type", + "tags": [], + "label": "BeatFields", + "description": [], + "signature": [ + "{ [x: string]: FieldInfo; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 51 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BeatFieldsFactoryQueryType", + "type": "Type", + "tags": [], + "label": "BeatFieldsFactoryQueryType", + "description": [], + "signature": [ + "\"beatFields\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.BrowserFields", + "type": "Type", + "tags": [], + "label": "BrowserFields", + "description": [], + "signature": [ + "{ readonly [x: string]: Partial<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.BrowserField", + "text": "BrowserField" + }, + ">; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 82 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.CellValueElementProps", + "type": "Type", + "tags": [], + "label": "CellValueElementProps", + "description": [ + "The following props are provided to the function called by `renderCellValue`" + ], + "signature": [ + "EuiDataGridCellValueElementProps", + " & { data: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineNonEcsData", + "text": "TimelineNonEcsData" + }, + "[]; eventId: string; header: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "; linkValues: string[] | undefined; timelineId: string; setFlyoutAlert?: ((data: any) => void) | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/cells/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderOptions", + "type": "Type", + "tags": [], + "label": "ColumnHeaderOptions", + "description": [ + "The specification of a column header" + ], + "signature": [ + "Pick<", + "EuiDataGridColumn", + ", \"id\" | \"display\" | \"displayAsText\" | \"initialWidth\"> & { aggregatable?: boolean | undefined; category?: string | undefined; columnHeaderType: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderType", + "text": "ColumnHeaderType" + }, + "; description?: string | undefined; example?: string | undefined; format?: string | undefined; linkField?: string | undefined; placeholder?: string | undefined; subType?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IFieldSubType", + "text": "IFieldSubType" + }, + " | undefined; type?: string | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 19 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnHeaderType", + "type": "Type", + "tags": [], + "label": "ColumnHeaderType", + "description": [], + "signature": [ + "\"not-filtered\" | \"text-filter\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ColumnId", + "type": "Type", + "tags": [], + "label": "ColumnId", + "description": [ + "Uniquely identifies a column" + ], + "signature": [ + "string" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/columns/index.ts", + "lineNumber": 16 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ControlColumnProps", + "type": "Type", + "tags": [], + "label": "ControlColumnProps", + "description": [], + "signature": [ + "Pick<", + "EuiDataGridControlColumn", + ", never> & Partial<AdditionalControlColumnProps>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 88 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DATA_COLINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "DATA_COLINDEX_ATTRIBUTE", + "description": [ + "\nThis alternative attribute to `aria-colindex` is used to decorate the data\nin existing `EuiTable`s to enable keyboard navigation with minimal\nrefactoring of existing code until we're ready to migrate to `EuiDataGrid`.\nIt may be applied directly to keyboard-focusable elements and thus doesn't\nhave exactly the same semantics as `aria-colindex`." + ], + "signature": [ + "\"data-colindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 29 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DATA_ROWINDEX_ATTRIBUTE", + "type": "string", + "tags": [], + "label": "DATA_ROWINDEX_ATTRIBUTE", + "description": [ + "\nThis alternative attribute to `aria-rowindex` is used to decorate the data\nin existing `EuiTable`s to enable keyboard navigation with minimal\nrefactoring of existing code until we're ready to migrate to `EuiDataGrid`.\nIt's typically applied to `<tr>` elements via `EuiTable`'s `rowProps` prop." + ], + "signature": [ + "\"data-rowindex\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 43 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProvidersAnd", + "type": "Type", + "tags": [], + "label": "DataProvidersAnd", + "description": [], + "signature": [ + "{ type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | undefined; enabled: boolean; id: string; name: string; excluded: boolean; kqlQuery: string; queryMatch: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.QueryMatch", + "text": "QueryMatch" + }, + "; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 65 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DocValueFields", + "type": "Type", + "tags": [], + "label": "DocValueFields", + "description": [], + "signature": [ + "SearchDocValueField" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 55 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EMPTY_DOCVALUE_FIELD", + "type": "Array", + "tags": [], + "label": "EMPTY_DOCVALUE_FIELD", + "description": [], + "signature": [ + "SearchDocValueField", + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 85 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ErrorSchema", + "type": "Type", + "tags": [], + "label": "ErrorSchema", + "description": [], + "signature": [ + "{ error: { status_code: number; message: string; }; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 35 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EXISTS_OPERATOR", + "type": "string", + "tags": [], + "label": "EXISTS_OPERATOR", + "description": [ + "The `exists` operator in a KQL query" + ], + "signature": [ + "\":*\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 14 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportedEventNotes", + "type": "Type", + "tags": [], + "label": "ExportedEventNotes", + "description": [], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 418 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportedGlobalNotes", + "type": "Type", + "tags": [], + "label": "ExportedGlobalNotes", + "description": [ + "\nImport/export timelines" + ], + "signature": [ + "NoteSavedObject", + "[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 417 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ExportedTimelines", + "type": "Type", + "tags": [], + "label": "ExportedTimelines", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; } & ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ExportedNotes", + "text": "ExportedNotes" + }, + " & { pinnedEventIds: string[]; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 425 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FavoriteTimelineResult", + "type": "Type", + "tags": [], + "label": "FavoriteTimelineResult", + "description": [], + "signature": [ + "{ fullName?: string | null | undefined; userName?: string | null | undefined; favoriteDate?: number | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 555 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FieldsEqlOptions", + "type": "Type", + "tags": [], + "label": "FieldsEqlOptions", + "description": [], + "signature": [ + "\"query\" | \"size\" | \"eventCategoryField\" | \"tiebreakerField\" | \"timestampField\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/events/eql/index.ts", + "lineNumber": 46 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FIRST_ARIA_INDEX", + "type": "number", + "tags": [], + "label": "FIRST_ARIA_INDEX", + "description": [ + "`aria-colindex` and `aria-rowindex` start at one" + ], + "signature": [ + "1" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 46 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.FocusableElement", + "type": "Type", + "tags": [], + "label": "FocusableElement", + "description": [], + "signature": [ + "HTMLDivElement | HTMLButtonElement | HTMLInputElement | HTMLAnchorElement | HTMLFormElement | HTMLAudioElement | HTMLAreaElement | HTMLSelectElement | HTMLTextAreaElement | HTMLVideoElement" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 652 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GenericActionRowCellRenderProps", + "type": "Type", + "tags": [], + "label": "GenericActionRowCellRenderProps", + "description": [], + "signature": [ + "{ columnId: string; rowIndex: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 57 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetFocusedCell", + "type": "Type", + "tags": [], + "label": "GetFocusedCell", + "description": [], + "signature": [ + "({ containerElement, tableClassName, }: { containerElement: HTMLElement | null; tableClassName: string; }) => HTMLDivElement | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 767 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.GetTimelinesArgs", + "type": "Type", + "tags": [], + "label": "GetTimelinesArgs", + "description": [], + "signature": [ + "{ onlyUserFavorite?: boolean | null | undefined; pageInfo?: { pageIndex: number; pageSize: number; } | null | undefined; search?: string | null | undefined; sort?: { sortField: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + "; sortOrder: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + "; } | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 579 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.HeaderCellRender", + "type": "Type", + "tags": [], + "label": "HeaderCellRender", + "description": [], + "signature": [ + "React.ComponentClass<{}, any> | React.FunctionComponent<{}> | React.ComponentClass<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.HeaderActionProps", + "text": "HeaderActionProps" + }, + ", any> | React.FunctionComponent<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.HeaderActionProps", + "text": "HeaderActionProps" + }, + ">" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 62 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ImportTimelineResultSchema", + "type": "Type", + "tags": [], + "label": "ImportTimelineResultSchema", + "description": [], + "signature": [ + "{ success: boolean; success_count: number; timelines_installed: number; timelines_updated: number; errors: { error: { status_code: number; message: string; }; }[]; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 455 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.IS_OPERATOR", + "type": "string", + "tags": [], + "label": "IS_OPERATOR", + "description": [ + "Represents the Timeline data providers\nThe `is` operator in a KQL query" + ], + "signature": [ + "\":\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 11 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.KueryFilterQueryKind", + "type": "Type", + "tags": [], + "label": "KueryFilterQueryKind", + "description": [], + "signature": [ + "\"eql\" | \"lucene\" | \"kuery\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 22 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.Maybe", + "type": "Type", + "tags": [], + "label": "Maybe", + "description": [], + "signature": [ + "T | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/common/index.ts", + "lineNumber": 9 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.NotesAndPinnedEventsByTimelineId", + "type": "Type", + "tags": [], + "label": "NotesAndPinnedEventsByTimelineId", + "description": [], + "signature": [ + "{ [x: string]: { notes: ", + "NoteSavedObject", + "[]; pinnedEvents: ", + "PinnedEventSavedObject", + "[]; }; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 440 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnChangePage", + "type": "Type", + "tags": [], + "label": "OnChangePage", + "description": [ + "Invoked when a user clicks to load more item" + ], + "signature": [ + "(nextPage: number) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 77 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnColumnFocused", + "type": "Type", + "tags": [], + "label": "OnColumnFocused", + "description": [], + "signature": [ + "({ newFocusedColumn, newFocusedColumnAriaColindex, }: { newFocusedColumn: HTMLDivElement | null; newFocusedColumnAriaColindex: number | null; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 288 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnColumnRemoved", + "type": "Type", + "tags": [], + "label": "OnColumnRemoved", + "description": [], + "signature": [ + "(columnId: string) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 72 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnColumnResized", + "type": "Type", + "tags": [], + "label": "OnColumnResized", + "description": [], + "signature": [ + "({ columnId, delta }: { columnId: string; delta: number; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 74 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnColumnSorted", + "type": "Type", + "tags": [], + "label": "OnColumnSorted", + "description": [ + "Invoked when a column is sorted" + ], + "signature": [ + "(sorted: { columnId: string; sortDirection: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortDirection", + "text": "SortDirection" + }, + "; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 66 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnColumnsSorted", + "type": "Type", + "tags": [], + "label": "OnColumnsSorted", + "description": [], + "signature": [ + "(sorted: { columnId: string; sortDirection: ", + { + "pluginId": "securitySolution", + "scope": "common", + "docId": "kibSecuritySolutionPluginApi", + "section": "def-common.SortDirection", + "text": "SortDirection" + }, + "; }[]) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 68 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnPinEvent", + "type": "Type", + "tags": [], + "label": "OnPinEvent", + "description": [ + "Invoked when a user pins an event" + ], + "signature": [ + "(eventId: string) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 95 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnRowSelected", + "type": "Type", + "tags": [], + "label": "OnRowSelected", + "description": [ + "Invoked when a user checks/un-checks a row" + ], + "signature": [ + "({ eventIds, isSelected, }: { eventIds: string[]; isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 80 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnSelectAll", + "type": "Type", + "tags": [], + "label": "OnSelectAll", + "description": [ + "Invoked when a user checks/un-checks the select all checkbox" + ], + "signature": [ + "({ isSelected }: { isSelected: boolean; }) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 89 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnUnPinEvent", + "type": "Type", + "tags": [], + "label": "OnUnPinEvent", + "description": [ + "Invoked when a user unpins an event" + ], + "signature": [ + "(eventId: string) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 98 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.OnUpdateColumns", + "type": "Type", + "tags": [], + "label": "OnUpdateColumns", + "description": [ + "Invoked when columns are updated" + ], + "signature": [ + "(columns: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ColumnHeaderOptions", + "text": "ColumnHeaderOptions" + }, + "[]) => void" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 92 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PLUGIN_ID", + "type": "string", + "tags": [], + "label": "PLUGIN_ID", + "description": [], + "signature": [ + "\"timelines\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.PLUGIN_NAME", + "type": "string", + "tags": [], + "label": "PLUGIN_NAME", + "description": [], + "signature": [ + "\"timelines\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/index.ts", + "lineNumber": 13 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.QueryOperator", + "type": "Type", + "tags": [], + "label": "QueryOperator", + "description": [ + "The operator applied to a field" + ], + "signature": [ + "\":\" | \":*\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/data_provider/index.ts", + "lineNumber": 17 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ResponseFavoriteTimeline", + "type": "Type", + "tags": [], + "label": "ResponseFavoriteTimeline", + "description": [], + "signature": [ + "{ savedObjectId?: string | undefined; version?: string | undefined; code?: number | null | undefined; message?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; favorite?: { fullName?: string | null | undefined; userName?: string | null | undefined; favoriteDate?: number | null | undefined; }[] | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 568 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ResponseTimelines", + "type": "Type", + "tags": [], + "label": "ResponseTimelines", + "description": [], + "signature": [ + "{ timeline: ({ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; })[]; totalCount: number; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 586 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.RowCellRender", + "type": "Type", + "tags": [], + "label": "RowCellRender", + "description": [], + "signature": [ + "((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => React.Component<Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">, any, any>) | ((props: Pick<", + "EuiDataGridCellValueElementProps", + ", \"columnId\" | \"rowIndex\">) => JSX.Element) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.ReactElement<any, string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => React.Component<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ", any, any>) | ((props: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.ActionProps", + "text": "ActionProps" + }, + ") => JSX.Element)" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/actions/index.ts", + "lineNumber": 63 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SavedTimeline", + "type": "Type", + "tags": [], + "label": "SavedTimeline", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 303 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SavedTimelineNote", + "type": "Type", + "tags": [], + "label": "SavedTimelineNote", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 305 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SearchTypes", + "type": "Type", + "tags": [], + "label": "SearchTypes", + "description": [], + "signature": [ + "string | number | boolean | object | string[] | number[] | boolean[] | object[] | undefined" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/eql/index.ts", + "lineNumber": 12 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SingleTimelineResponse", + "type": "Type", + "tags": [], + "label": "SingleTimelineResponse", + "description": [], + "signature": [ + "{ data: { getOneTimeline: { columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }; }; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 375 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SKIP_FOCUS_BACKWARDS", + "type": "Type", + "tags": [], + "label": "SKIP_FOCUS_BACKWARDS", + "description": [], + "signature": [ + "\"SKIP_FOCUS_BACKWARDS\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 688 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SKIP_FOCUS_FORWARD", + "type": "Type", + "tags": [], + "label": "SKIP_FOCUS_FORWARD", + "description": [], + "signature": [ + "\"SKIP_FOCUS_FORWARD\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 689 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SKIP_FOCUS_NOOP", + "type": "Type", + "tags": [], + "label": "SKIP_FOCUS_NOOP", + "description": [], + "signature": [ + "\"SKIP_FOCUS_NOOP\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 690 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SkipFocus", + "type": "Type", + "tags": [], + "label": "SkipFocus", + "description": [], + "signature": [ + "\"SKIP_FOCUS_BACKWARDS\" | \"SKIP_FOCUS_FORWARD\" | \"SKIP_FOCUS_NOOP\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/utils/accessibility/helpers.ts", + "lineNumber": 691 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.Sort", + "type": "Type", + "tags": [], + "label": "Sort", + "description": [], + "signature": [ + "{ columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 186 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SortDirection", + "type": "Type", + "tags": [], + "label": "SortDirection", + "description": [], + "signature": [ + "\"none\" | \"asc\" | \"desc\" | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/store.ts", + "lineNumber": 34 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TemplateTimelineTypeLiteral", + "type": "Type", + "tags": [], + "label": "TemplateTimelineTypeLiteral", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 251 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TemplateTimelineTypeLiteralWithNull", + "type": "Type", + "tags": [], + "label": "TemplateTimelineTypeLiteralWithNull", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 252 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineErrorResponse", + "type": "Type", + "tags": [], + "label": "TimelineErrorResponse", + "description": [], + "signature": [ + "{ status_code: number; message: string; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 399 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineEventsType", + "type": "Type", + "tags": [], + "label": "TimelineEventsType", + "description": [], + "signature": [ + "\"all\" | \"custom\" | \"raw\" | \"alert\" | \"eql\" | \"signal\"" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 457 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineExpandedDetail", + "type": "Type", + "tags": [], + "label": "TimelineExpandedDetail", + "description": [], + "signature": [ + "{ query?: Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; } | undefined; graph?: Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; } | undefined; notes?: Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; } | undefined; pinned?: Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; } | undefined; eql?: Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 511 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineExpandedDetailType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedDetailType", + "description": [], + "signature": [ + "Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 506 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineExpandedEventType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedEventType", + "description": [], + "signature": [ + "Record<any, never> | { panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 470 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineExpandedHostType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedHostType", + "description": [], + "signature": [ + "Record<any, never> | { panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 480 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineExpandedNetworkType", + "type": "Type", + "tags": [], + "label": "TimelineExpandedNetworkType", + "description": [], + "signature": [ + "Record<any, never> | { panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 496 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineFactoryQueryTypes", + "type": "Type", + "tags": [], + "label": "TimelineFactoryQueryTypes", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 36 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineIdLiteral", + "type": "Type", + "tags": [], + "label": "TimelineIdLiteral", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageEvents | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageExternalAlerts | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsRulesDetailsPage | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsPage | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".networkPageExternalAlerts | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".active | ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".test" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 333 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResponse", + "type": "Type", + "tags": [], + "label": "TimelineResponse", + "description": [], + "signature": [ + "{ data: { persistTimeline: { code?: number | null | undefined; message?: string | null | undefined; } & { timeline: { columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }; }; }; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 400 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineSavedObject", + "type": "Type", + "tags": [], + "label": "TimelineSavedObject", + "description": [], + "signature": [ + "{ columns?: { aggregatable?: boolean | null | undefined; category?: string | null | undefined; columnHeaderType?: string | null | undefined; description?: string | null | undefined; example?: string | null | undefined; indexes?: string[] | null | undefined; id?: string | null | undefined; name?: string | null | undefined; placeholder?: string | null | undefined; searchable?: boolean | null | undefined; type?: string | null | undefined; }[] | null | undefined; dataProviders?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; and?: { id?: string | null | undefined; name?: string | null | undefined; enabled?: boolean | null | undefined; excluded?: boolean | null | undefined; kqlQuery?: string | null | undefined; queryMatch?: { field?: string | null | undefined; displayField?: string | null | undefined; value?: string | null | undefined; displayValue?: string | null | undefined; operator?: string | null | undefined; } | null | undefined; }[] | null | undefined; type?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + " | null | undefined; }[] | null | undefined; description?: string | null | undefined; eqlOptions?: { eventCategoryField?: string | null | undefined; query?: string | null | undefined; tiebreakerField?: string | null | undefined; timestampField?: string | null | undefined; size?: string | number | null | undefined; } | null | undefined; eventType?: string | null | undefined; excludedRowRendererIds?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + "[] | null | undefined; favorite?: { keySearch?: string | null | undefined; favoriteDate?: number | null | undefined; fullName?: string | null | undefined; userName?: string | null | undefined; }[] | null | undefined; filters?: { exists?: string | null | undefined; meta?: { alias?: string | null | undefined; controlledBy?: string | null | undefined; disabled?: boolean | null | undefined; field?: string | null | undefined; formattedValue?: string | null | undefined; index?: string | null | undefined; key?: string | null | undefined; negate?: boolean | null | undefined; params?: string | null | undefined; type?: string | null | undefined; value?: string | null | undefined; } | null | undefined; match_all?: string | null | undefined; missing?: string | null | undefined; query?: string | null | undefined; range?: string | null | undefined; script?: string | null | undefined; }[] | null | undefined; indexNames?: string[] | null | undefined; kqlMode?: string | null | undefined; kqlQuery?: { filterQuery?: { kuery?: { kind?: string | null | undefined; expression?: string | null | undefined; } | null | undefined; serializedQuery?: string | null | undefined; } | null | undefined; } | null | undefined; title?: string | null | undefined; templateTimelineId?: string | null | undefined; templateTimelineVersion?: number | null | undefined; timelineType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null | undefined; dateRange?: { start?: string | number | null | undefined; end?: string | number | null | undefined; } | null | undefined; savedQueryId?: string | null | undefined; sort?: { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; } | { columnId?: string | null | undefined; columnType?: string | null | undefined; sortDirection?: string | null | undefined; }[] | null | undefined; status?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { savedObjectId: string; version: string; } & { eventIdToNoteIds?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; noteIds?: string[] | undefined; notes?: ({ timelineId: string | null; } & { eventId?: string | null | undefined; note?: string | null | undefined; created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { noteId: string; version: string; } & { timelineVersion?: string | null | undefined; })[] | undefined; pinnedEventIds?: string[] | undefined; pinnedEventsSaveObject?: ({ pinnedEventId: string; version: string; } & { timelineId: string; eventId: string; } & { created?: number | null | undefined; createdBy?: string | null | undefined; updated?: number | null | undefined; updatedBy?: string | null | undefined; } & { timelineVersion?: string | null | undefined; })[] | undefined; }" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 365 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineStatusLiteral", + "type": "Type", + "tags": [], + "label": "TimelineStatusLiteral", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 206 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineStatusLiteralWithNull", + "type": "Type", + "tags": [], + "label": "TimelineStatusLiteralWithNull", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 207 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineStrategyRequestType", + "type": "Type", + "tags": [], + "label": "TimelineStrategyRequestType", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".all ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllRequestOptions", + "text": "TimelineEventsAllRequestOptions" + }, + " : T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".details ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsRequestOptions", + "text": "TimelineEventsDetailsRequestOptions" + }, + " : T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".kpi ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineRequestBasicOptions", + "text": "TimelineRequestBasicOptions" + }, + " : T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".lastEventTime ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeRequestOptions", + "text": "TimelineEventsLastEventTimeRequestOptions" + }, + " : never" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 68 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineStrategyResponseType", + "type": "Type", + "tags": [], + "label": "TimelineStrategyResponseType", + "description": [], + "signature": [ + "T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".all ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsAllStrategyResponse", + "text": "TimelineEventsAllStrategyResponse" + }, + " : T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".details ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsDetailsStrategyResponse", + "text": "TimelineEventsDetailsStrategyResponse" + }, + " : T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".kpi ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineKpiStrategyResponse", + "text": "TimelineKpiStrategyResponse" + }, + " : T extends ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsQueries", + "text": "TimelineEventsQueries" + }, + ".lastEventTime ? ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineEventsLastEventTimeStrategyResponse", + "text": "TimelineEventsLastEventTimeStrategyResponse" + }, + " : never" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/timeline/index.ts", + "lineNumber": 56 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineTypeLiteral", + "type": "Type", + "tags": [], + "label": "TimelineTypeLiteral", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + } + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 274 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineTypeLiteralWithNull", + "type": "Type", + "tags": [], + "label": "TimelineTypeLiteralWithNull", + "description": [], + "signature": [ + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + " | null" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 275 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.ToggleDetailPanel", + "type": "Type", + "tags": [], + "label": "ToggleDetailPanel", + "description": [], + "signature": [ + "(Record<any, never> & { tabType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; }) | ({ panelView?: \"eventDetail\" | undefined; params?: { eventId: string; indexName: string; } | undefined; } & { tabType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; }) | ({ panelView?: \"hostDetail\" | undefined; params?: { hostName: string; } | undefined; } & { tabType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; }) | ({ panelView?: \"networkDetail\" | undefined; params?: { ip: string; flowTarget: FlowTarget; } | undefined; } & { tabType?: ", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineTabs", + "text": "TimelineTabs" + }, + " | undefined; timelineId: string; })" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 515 + }, + "deprecated": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "timelines", + "id": "def-common.AllTimelineSavedObjectRuntimeType", + "type": "Object", + "tags": [], + "label": "AllTimelineSavedObjectRuntimeType", + "description": [ + "\nAll Timeline Saved object type with metadata" + ], + "signature": [ + "TypeC", + "<{ total: ", + "NumberC", + "; data: ", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 406 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.allTimelinesResponse", + "type": "Object", + "tags": [], + "label": "allTimelinesResponse", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ timeline: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>>; totalCount: ", + "NumberC", + "; }>, ", + "TypeC", + "<{ defaultTimelineCount: ", + "NumberC", + "; templateTimelineCount: ", + "NumberC", + "; elasticTemplateTimelineCount: ", + "NumberC", + "; customTemplateTimelineCount: ", + "NumberC", + "; favoriteCount: ", + "NumberC", + "; }>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 588 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.DataProviderTypeLiteralRt", + "type": "Object", + "tags": [], + "label": "DataProviderTypeLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 79 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.direction", + "type": "Object", + "tags": [], + "label": "direction", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".asc>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".desc>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 539 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EMPTY_BROWSER_FIELDS", + "type": "Object", + "tags": [], + "label": "EMPTY_BROWSER_FIELDS", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 84 + }, + "deprecated": false, + "children": [], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EMPTY_INDEX_PATTERN", + "type": "Object", + "tags": [], + "label": "EMPTY_INDEX_PATTERN", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 86 + }, + "deprecated": false, + "children": [ + { + "parentPluginId": "timelines", + "id": "def-common.EMPTY_INDEX_PATTERN.fields", + "type": "Array", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "never[]" + ], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 87 + }, + "deprecated": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.EMPTY_INDEX_PATTERN.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "source": { + "path": "x-pack/plugins/timelines/common/search_strategy/index_fields/index.ts", + "lineNumber": 88 + }, + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.getTimelinesArgs", + "type": "Object", + "tags": [], + "label": "getTimelinesArgs", + "description": [], + "signature": [ + "PartialC", + "<{ onlyUserFavorite: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; pageInfo: ", + "UnionC", + "<[", + "TypeC", + "<{ pageIndex: ", + "NumberC", + "; pageSize: ", + "NumberC", + "; }>, ", + "NullC", + "]>; search: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "TypeC", + "<{ sortField: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".title>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".description>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".updated>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".created>]>; sortOrder: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".asc>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".desc>]>; }>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 570 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.importTimelineResultSchema", + "type": "Object", + "tags": [], + "label": "importTimelineResultSchema", + "description": [], + "signature": [ + "ExactC", + "<", + "TypeC", + "<{ success: ", + "BooleanC", + "; success_count: ", + "NumberC", + "; timelines_installed: ", + "NumberC", + "; timelines_updated: ", + "NumberC", + "; errors: ", + "ArrayC", + "<", + "ExactC", + "<", + "TypeC", + "<{ error: ", + "TypeC", + "<{ status_code: ", + "NumberC", + "; message: ", + "StringC", + "; }>; }>>>; }>>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 445 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.pageInfoTimeline", + "type": "Object", + "tags": [], + "label": "pageInfoTimeline", + "description": [], + "signature": [ + "TypeC", + "<{ pageIndex: ", + "NumberC", + "; pageSize: ", + "NumberC", + "; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 520 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.responseFavoriteTimeline", + "type": "Object", + "tags": [], + "label": "responseFavoriteTimeline", + "description": [], + "signature": [ + "PartialC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; code: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; message: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 557 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.RowRendererIdRuntimeType", + "type": "Object", + "tags": [], + "label": "RowRendererIdRuntimeType", + "description": [], + "signature": [ + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 231 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.SavedTimelineRuntimeType", + "type": "Object", + "tags": [], + "label": "SavedTimelineRuntimeType", + "description": [], + "signature": [ + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 277 + }, + "deprecated": false, + "initialIsOpen": false }, - "deprecated": false, - "children": [ - { - "parentPluginId": "timelines", - "id": "def-public.TimelinesPluginSetup.getTimeline", - "type": "Function", - "tags": [], - "label": "getTimeline", - "description": [], - "signature": [ - "((props: ", - "TimelineProps", - ") => React.ReactElement<", - "TimelineProps", - ", string | ((props: any) => React.ReactElement<any, string | any | (new (props: any) => React.Component<any, any, any>)> | null) | (new (props: any) => React.Component<any, any, any>)>) | undefined" - ], - "source": { - "path": "x-pack/plugins/timelines/public/types.ts", - "lineNumber": 11 + { + "parentPluginId": "timelines", + "id": "def-common.SingleTimelineResponseType", + "type": "Object", + "tags": [], + "label": "SingleTimelineResponseType", + "description": [], + "signature": [ + "TypeC", + "<{ data: ", + "TypeC", + "<{ getOneTimeline: ", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" }, - "deprecated": false - } - ], - "lifecycle": "setup", - "initialIsOpen": true - } - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [], - "setup": { - "parentPluginId": "timelines", - "id": "def-server.TimelinesPluginSetup", - "type": "Interface", - "tags": [], - "label": "TimelinesPluginSetup", - "description": [], - "source": { - "path": "x-pack/plugins/timelines/server/types.ts", - "lineNumber": 9 + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>; }>; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 369 + }, + "deprecated": false, + "initialIsOpen": false }, - "deprecated": false, - "children": [], - "lifecycle": "setup", - "initialIsOpen": true - }, - "start": { - "parentPluginId": "timelines", - "id": "def-server.TimelinesPluginStart", - "type": "Interface", - "tags": [], - "label": "TimelinesPluginStart", - "description": [], - "source": { - "path": "x-pack/plugins/timelines/server/types.ts", - "lineNumber": 11 + { + "parentPluginId": "timelines", + "id": "def-common.sortFieldTimeline", + "type": "Object", + "tags": [], + "label": "sortFieldTimeline", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".title>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".description>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".updated>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".created>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 532 + }, + "deprecated": false, + "initialIsOpen": false }, - "deprecated": false, - "children": [], - "lifecycle": "start", - "initialIsOpen": true - } - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [ { "parentPluginId": "timelines", - "id": "def-common.PLUGIN_ID", - "type": "string", + "id": "def-common.sortTimeline", + "type": "Object", "tags": [], - "label": "PLUGIN_ID", + "label": "sortTimeline", "description": [], "signature": [ - "\"timelines\"" + "TypeC", + "<{ sortField: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".title>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".description>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".updated>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.SortFieldTimeline", + "text": "SortFieldTimeline" + }, + ".created>]>; sortOrder: ", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".asc>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.Direction", + "text": "Direction" + }, + ".desc>]>; }>" ], "source": { - "path": "x-pack/plugins/timelines/common/index.ts", - "lineNumber": 8 + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 544 }, "deprecated": false, "initialIsOpen": false }, { "parentPluginId": "timelines", - "id": "def-common.PLUGIN_NAME", - "type": "string", + "id": "def-common.TemplateTimelineTypeLiteralRt", + "type": "Object", "tags": [], - "label": "PLUGIN_NAME", + "label": "TemplateTimelineTypeLiteralRt", "description": [], "signature": [ - "\"timelines\"" + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".elastic>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".custom>]>" ], "source": { - "path": "x-pack/plugins/timelines/common/index.ts", - "lineNumber": 9 + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 242 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TemplateTimelineTypeLiteralWithNullRt", + "type": "Object", + "tags": [], + "label": "TemplateTimelineTypeLiteralWithNullRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".elastic>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TemplateTimelineType", + "text": "TemplateTimelineType" + }, + ".custom>]>, ", + "NullC", + "]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 247 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineErrorResponseType", + "type": "Object", + "tags": [], + "label": "TimelineErrorResponseType", + "description": [], + "signature": [ + "TypeC", + "<{ status_code: ", + "NumberC", + "; message: ", + "StringC", + "; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 394 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineIdLiteralRt", + "type": "Object", + "tags": [], + "label": "TimelineIdLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageEvents>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".hostsPageExternalAlerts>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsRulesDetailsPage>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".detectionsPage>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".networkPageExternalAlerts>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineId", + "text": "TimelineId" + }, + ".test>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 323 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineResponseType", + "type": "Object", + "tags": [], + "label": "TimelineResponseType", + "description": [ + "\nAll Timeline Saved object type with metadata" + ], + "signature": [ + "TypeC", + "<{ data: ", + "TypeC", + "<{ persistTimeline: ", + "IntersectionC", + "<[", + "PartialC", + "<{ code: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; message: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ timeline: ", + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>; }>]>; }>; }>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 380 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineSavedObjectRuntimeType", + "type": "Object", + "tags": [], + "label": "TimelineSavedObjectRuntimeType", + "description": [ + "\nTimeline Saved object type with metadata" + ], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ id: ", + "StringC", + "; attributes: ", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ savedObjectId: ", + "StringC", + "; }>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 339 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineSavedToReturnObjectRuntimeType", + "type": "Object", + "tags": [], + "label": "TimelineSavedToReturnObjectRuntimeType", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "PartialC", + "<{ columns: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ aggregatable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; category: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnHeaderType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; example: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; indexes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; placeholder: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; searchable: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; dataProviders: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; and: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ id: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; name: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; enabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; excluded: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; queryMatch: ", + "UnionC", + "<[", + "PartialC", + "<{ field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; displayValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; operator: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.DataProviderType", + "text": "DataProviderType" + }, + ".template>]>, ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; description: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; eqlOptions: ", + "UnionC", + "<[", + "PartialC", + "<{ eventCategoryField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; tiebreakerField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; timestampField: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; size: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; eventType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; excludedRowRendererIds: ", + "UnionC", + "<[", + "ArrayC", + "<", + "Type", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.RowRendererId", + "text": "RowRendererId" + }, + ", string, unknown>>, ", + "NullC", + "]>; favorite: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ keySearch: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; favoriteDate: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; fullName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; userName: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; filters: ", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ exists: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; meta: ", + "UnionC", + "<[", + "PartialC", + "<{ alias: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; controlledBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; disabled: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; field: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; formattedValue: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; index: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; key: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; negate: ", + "UnionC", + "<[", + "BooleanC", + ", ", + "NullC", + "]>; params: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; type: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; value: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; match_all: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; missing: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; query: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; range: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; script: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "NullC", + "]>; indexNames: ", + "UnionC", + "<[", + "ArrayC", + "<", + "StringC", + ">, ", + "NullC", + "]>; kqlMode: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; kqlQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ filterQuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kuery: ", + "UnionC", + "<[", + "PartialC", + "<{ kind: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; expression: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; serializedQuery: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; title: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; templateTimelineVersion: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; timelineType: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>; dateRange: ", + "UnionC", + "<[", + "PartialC", + "<{ start: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; end: ", + "UnionC", + "<[", + "UnionC", + "<[", + "StringC", + ", ", + "NumberC", + "]>, ", + "NullC", + "]>; }>, ", + "NullC", + "]>; savedQueryId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sort: ", + "UnionC", + "<[", + "UnionC", + "<[", + "ArrayC", + "<", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>>, ", + "PartialC", + "<{ columnId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; columnType: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; sortDirection: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "NullC", + "]>; status: ", + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>, ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "TypeC", + "<{ savedObjectId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ eventIdToNoteIds: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; noteIds: ", + "ArrayC", + "<", + "StringC", + ">; notes: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>, ", + "PartialC", + "<{ eventId: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; note: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "TypeC", + "<{ noteId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; pinnedEventIds: ", + "ArrayC", + "<", + "StringC", + ">; pinnedEventsSaveObject: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ pinnedEventId: ", + "StringC", + "; version: ", + "StringC", + "; }>, ", + "IntersectionC", + "<[", + "TypeC", + "<{ timelineId: ", + "StringC", + "; eventId: ", + "StringC", + "; }>, ", + "PartialC", + "<{ created: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; createdBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; updated: ", + "UnionC", + "<[", + "NumberC", + ", ", + "NullC", + "]>; updatedBy: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>, ", + "PartialC", + "<{ timelineVersion: ", + "UnionC", + "<[", + "StringC", + ", ", + "NullC", + "]>; }>]>>; }>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 350 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineStatusLiteralRt", + "type": "Object", + "tags": [], + "label": "TimelineStatusLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".active>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".draft>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineStatus", + "text": "TimelineStatus" + }, + ".immutable>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 198 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineTypeLiteralRt", + "type": "Object", + "tags": [], + "label": "TimelineTypeLiteralRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 266 + }, + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "timelines", + "id": "def-common.TimelineTypeLiteralWithNullRt", + "type": "Object", + "tags": [], + "label": "TimelineTypeLiteralWithNullRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".template>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".default>, ", + "LiteralC", + "<", + { + "pluginId": "timelines", + "scope": "common", + "docId": "kibTimelinesPluginApi", + "section": "def-common.TimelineType", + "text": "TimelineType" + }, + ".test>]>, ", + "NullC", + "]>" + ], + "source": { + "path": "x-pack/plugins/timelines/common/types/timeline/index.ts", + "lineNumber": 272 }, "deprecated": false, "initialIsOpen": false } - ], - "objects": [] + ] } } \ No newline at end of file diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index e9d4a75e39991a..d1bfb86877898f 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import timelinesObj from './timelines.json'; @@ -19,12 +18,27 @@ import timelinesObj from './timelines.json'; | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 6 | 0 | 6 | 1 | +| 877 | 6 | 758 | 22 | ## Client -### Setup -<DocDefinitionList data={[timelinesObj.client.setup]}/> +### Start +<DocDefinitionList data={[timelinesObj.client.start]}/> + +### Objects +<DocDefinitionList data={timelinesObj.client.objects}/> + +### Functions +<DocDefinitionList data={timelinesObj.client.functions}/> + +### Interfaces +<DocDefinitionList data={timelinesObj.client.interfaces}/> + +### Enums +<DocDefinitionList data={timelinesObj.client.enums}/> + +### Consts, variables and types +<DocDefinitionList data={timelinesObj.client.misc}/> ## Server @@ -36,6 +50,18 @@ import timelinesObj from './timelines.json'; ## Common +### Objects +<DocDefinitionList data={timelinesObj.common.objects}/> + +### Functions +<DocDefinitionList data={timelinesObj.common.functions}/> + +### Interfaces +<DocDefinitionList data={timelinesObj.common.interfaces}/> + +### Enums +<DocDefinitionList data={timelinesObj.common.enums}/> + ### Consts, variables and types <DocDefinitionList data={timelinesObj.common.misc}/> diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 91327ad1f990f3..e682f3872becf2 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import triggersActionsUiObj from './triggers_actions_ui.json'; diff --git a/api_docs/ui_actions.json b/api_docs/ui_actions.json index cb35cacedf7bae..c10c800abb0542 100644 --- a/api_docs/ui_actions.json +++ b/api_docs/ui_actions.json @@ -774,22 +774,22 @@ { "plugin": "discover", "link": { - "path": "src/plugins/discover/public/application/embeddable/search_embeddable.ts", - "lineNumber": 115 + "path": "src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx", + "lineNumber": 101 } }, { "plugin": "discover", "link": { "path": "src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts", - "lineNumber": 25 + "lineNumber": 26 } }, { "plugin": "discover", "link": { "path": "src/plugins/discover/public/plugin.tsx", - "lineNumber": 387 + "lineNumber": 462 } } ], diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 9045dc736bb2f8..e0bacc4204bda5 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import uiActionsObj from './ui_actions.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 3e9c9247532290..57c3e1876a5553 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import uiActionsEnhancedObj from './ui_actions_enhanced.json'; diff --git a/api_docs/uptime.json b/api_docs/uptime.json deleted file mode 100644 index f132703c525dbd..00000000000000 --- a/api_docs/uptime.json +++ /dev/null @@ -1,151 +0,0 @@ -{ - "id": "uptime", - "client": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "server": { - "classes": [], - "functions": [ - { - "parentPluginId": "uptime", - "id": "def-server.initServerWithKibana", - "type": "Function", - "tags": [], - "label": "initServerWithKibana", - "description": [], - "signature": [ - "(server: ", - "UptimeCoreSetup", - ", plugins: ", - "UptimeCorePlugins", - ") => void" - ], - "source": { - "path": "x-pack/plugins/uptime/server/kibana.index.ts", - "lineNumber": 28 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "uptime", - "id": "def-server.initServerWithKibana.$1", - "type": "Object", - "tags": [], - "label": "server", - "description": [], - "signature": [ - "UptimeCoreSetup" - ], - "source": { - "path": "x-pack/plugins/uptime/server/kibana.index.ts", - "lineNumber": 28 - }, - "deprecated": false, - "isRequired": true - }, - { - "parentPluginId": "uptime", - "id": "def-server.initServerWithKibana.$2", - "type": "Object", - "tags": [], - "label": "plugins", - "description": [], - "signature": [ - "UptimeCorePlugins" - ], - "source": { - "path": "x-pack/plugins/uptime/server/kibana.index.ts", - "lineNumber": 28 - }, - "deprecated": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - } - ], - "interfaces": [ - { - "parentPluginId": "uptime", - "id": "def-server.KibanaServer", - "type": "Interface", - "tags": [], - "label": "KibanaServer", - "description": [], - "signature": [ - { - "pluginId": "uptime", - "scope": "server", - "docId": "kibUptimePluginApi", - "section": "def-server.KibanaServer", - "text": "KibanaServer" - }, - " extends ", - "Server" - ], - "source": { - "path": "x-pack/plugins/uptime/server/kibana.index.ts", - "lineNumber": 24 - }, - "deprecated": false, - "children": [ - { - "parentPluginId": "uptime", - "id": "def-server.KibanaServer.route", - "type": "Function", - "tags": [], - "label": "route", - "description": [], - "signature": [ - "(options: ", - "KibanaRouteOptions", - ") => void" - ], - "source": { - "path": "x-pack/plugins/uptime/server/kibana.index.ts", - "lineNumber": 25 - }, - "deprecated": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "uptime", - "id": "def-server.options", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - "KibanaRouteOptions" - ], - "source": { - "path": "x-pack/plugins/uptime/server/kibana.index.ts", - "lineNumber": 25 - }, - "deprecated": false - } - ] - } - ], - "initialIsOpen": false - } - ], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - } -} \ No newline at end of file diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx deleted file mode 100644 index ceb7d854a8fecc..00000000000000 --- a/api_docs/uptime.mdx +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: kibUptimePluginApi -slug: /kibana-dev-docs/uptimePluginApi -title: uptime -image: https://source.unsplash.com/400x175/?github -summary: API docs for the uptime plugin -date: 2020-11-16 -tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] -warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. ---- - -import uptimeObj from './uptime.json'; - - - - - -**Code health stats** - -| Public API count | Any count | Items lacking comments | Missing exports | -|-------------------|-----------|------------------------|-----------------| -| 6 | 0 | 6 | 3 | - -## Server - -### Functions -<DocDefinitionList data={uptimeObj.server.functions}/> - -### Interfaces -<DocDefinitionList data={uptimeObj.server.interfaces}/> - diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index b457ca9eb331fa..f76c8b4015cf23 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import urlForwardingObj from './url_forwarding.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 197cfc72f17afb..6070c24c62003b 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,6 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import usageCollectionObj from './usage_collection.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index a904e00ef0efc5..645c5e6e841bc8 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,12 +8,11 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import visTypeTimeseriesObj from './vis_type_timeseries.json'; +Registers the TSVB visualization. TSVB has its one editor, works with index patterns and index strings and contains 6 types of charts: timeseries, topN, table. markdown, metric and gauge. - - +Contact [Kibana App](https://github.com/orgs/elastic/teams/kibana-app) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/visualizations.json b/api_docs/visualizations.json index 83f9436420dcd2..eb8db4feff9ad7 100644 --- a/api_docs/visualizations.json +++ b/api_docs/visualizations.json @@ -3067,7 +3067,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 34 + "lineNumber": 36 }, "deprecated": false, "children": [ @@ -3080,7 +3080,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 35 + "lineNumber": 37 }, "deprecated": false }, @@ -3093,7 +3093,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 36 + "lineNumber": 38 }, "deprecated": false }, @@ -3106,7 +3106,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 37 + "lineNumber": 39 }, "deprecated": false }, @@ -3119,7 +3119,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 38 + "lineNumber": 40 }, "deprecated": false }, @@ -3132,7 +3132,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 39 + "lineNumber": 41 }, "deprecated": false }, @@ -3148,7 +3148,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 40 + "lineNumber": 42 }, "deprecated": false }, @@ -3161,7 +3161,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 41 + "lineNumber": 43 }, "deprecated": false }, @@ -3177,7 +3177,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 42 + "lineNumber": 44 }, "deprecated": false }, @@ -3193,7 +3193,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 43 + "lineNumber": 45 }, "deprecated": false }, @@ -3209,7 +3209,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 44 + "lineNumber": 46 }, "deprecated": false }, @@ -3227,7 +3227,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 46 + "lineNumber": 48 }, "deprecated": false } @@ -3821,7 +3821,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 13 + "lineNumber": 14 }, "deprecated": false, "children": [ @@ -3834,7 +3834,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 14 + "lineNumber": 15 }, "deprecated": false }, @@ -3850,7 +3850,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 15 + "lineNumber": 16 }, "deprecated": false }, @@ -3866,7 +3866,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 16 + "lineNumber": 17 }, "deprecated": false }, @@ -3879,7 +3879,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 17 + "lineNumber": 18 }, "deprecated": false }, @@ -3892,7 +3892,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 18 + "lineNumber": 19 }, "deprecated": false }, @@ -3908,7 +3908,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 19 + "lineNumber": 20 }, "deprecated": false }, @@ -3921,7 +3921,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 20 + "lineNumber": 21 }, "deprecated": false }, @@ -3934,7 +3934,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 21 + "lineNumber": 22 }, "deprecated": false }, @@ -3950,7 +3950,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 22 + "lineNumber": 23 }, "deprecated": false }, @@ -3966,7 +3966,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 23 + "lineNumber": 24 }, "deprecated": false }, @@ -3979,7 +3979,7 @@ "description": [], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 24 + "lineNumber": 25 }, "deprecated": false }, @@ -3995,7 +3995,39 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 25 + "lineNumber": 26 + }, + "deprecated": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizationListItem.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string | ", + { + "pluginId": "visualizations", + "scope": "public", + "docId": "kibVisualizationsPluginApi", + "section": "def-public.BaseVisType", + "text": "BaseVisType" + }, + "<", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.VisParams", + "text": "VisParams" + }, + "> | undefined" + ], + "source": { + "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", + "lineNumber": 27 }, "deprecated": false } @@ -4271,7 +4303,7 @@ ], "source": { "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "lineNumber": 11 + "lineNumber": 12 }, "deprecated": false, "initialIsOpen": false diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index c6d9bdc741d4af..a7dab0c029cc85 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,18 +8,17 @@ date: 2020-11-16 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. --- - import visualizationsObj from './visualizations.json'; +Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. - - +Contact [Kibana App](https://github.com/orgs/elastic/teams/kibana-app) for questions regarding this plugin. **Code health stats** | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 246 | 13 | 228 | 12 | +| 247 | 13 | 229 | 12 | ## Client From 1d99cae32b71486c399e7a6245709a4363878f34 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm <matthias.wilhelm@elastic.co> Date: Tue, 29 Jun 2021 18:33:27 +0200 Subject: [PATCH 104/227] [Discover] Improve brushing test (#97830) --- test/functional/apps/discover/_discover.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/functional/apps/discover/_discover.ts b/test/functional/apps/discover/_discover.ts index c68db8cbd797bd..bb75b4441f8802 100644 --- a/test/functional/apps/discover/_discover.ts +++ b/test/functional/apps/discover/_discover.ts @@ -120,6 +120,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); return actualCount === expectedCount; }); + const prevRowData = await PageObjects.discover.getDocTableField(1); + log.debug(`The first timestamp value in doc table before brushing: ${prevRowData}`); await PageObjects.discover.brushHistogram(); await PageObjects.discover.waitUntilSearchingHasFinished(); await retry.waitFor('chart rendering complete after being brushed', async () => { @@ -133,12 +135,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const newDurationHours = await PageObjects.timePicker.getTimeDurationInHours(); expect(Math.round(newDurationHours)).to.be(26); - await retry.waitFor('doc table to contain the right search result', async () => { + await retry.waitFor('doc table containing the documents of the brushed range', async () => { const rowData = await PageObjects.discover.getDocTableField(1); - log.debug(`The first timestamp value in doc table: ${rowData}`); - const dateParsed = Date.parse(rowData); - // compare against the parsed date of Sep 20, 2015 @ 17:30:00.000 and Sep 20, 2015 @ 23:30:00.000 - return dateParsed >= 1442770200000 && dateParsed <= 1442791800000; + log.debug(`The first timestamp value in doc table after brushing: ${rowData}`); + return prevRowData !== rowData; }); }); From 8c0407a9f6eb5b7f33129c9cd541466941527979 Mon Sep 17 00:00:00 2001 From: Elizabet Oliveira <elizabet.oliveira@elastic.co> Date: Tue, 29 Jun 2021 17:41:15 +0100 Subject: [PATCH 105/227] [Maps] Design updates for draw shape mode and timeslider (#103493) * Timeslider icons and styles * Exit feature editing. Animations for toolbar and timeslider * Removing unnecessary line * Adding padding to tooltip field popover * Adding pulse animation on open timeslider * Adding isDraggable to timeslider * More timeslider styles * Better positioning of the exit edit mode button * Enable edit mode when new vector layer added * Review feedback. Update action name. Remove unneeded component state * Minor updates. One more action for cancel. Type updates. Snapshot update * fixing tests and eslint error * Added new exit mode design. Renamed animations * Features instead of feature to be consistent with popover * fix type error Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Aaron Caldwell <aaron.caldwell@elastic.co> --- x-pack/plugins/maps/public/_animations.scss | 39 +++++++++++ x-pack/plugins/maps/public/_index.scss | 1 + .../maps/public/actions/layer_actions.ts | 7 +- .../maps/public/actions/map_actions.ts | 14 ++++ .../classes/layers/layer_wizard_registry.ts | 1 + .../layers/new_vector_layer_wizard/config.tsx | 1 + .../add_tooltip_field_popover.test.tsx.snap | 8 ++- .../add_tooltip_field_popover.tsx | 4 +- .../add_layer_panel/index.ts | 7 ++ .../add_layer_panel/view.tsx | 4 ++ .../layer_toc/toc_entry/_toc_entry.scss | 17 +++++ .../layer_toc/toc_entry/index.ts | 7 ++ .../layer_toc/toc_entry/toc_entry.test.tsx | 1 + .../layer_toc/toc_entry/toc_entry.tsx | 23 ++++++- .../timeslider/_index.scss | 64 +++++++------------ .../timeslider/timeslider.tsx | 27 ++++---- .../toolbar_overlay/_toolbar_overlay.scss | 4 ++ .../feature_edit_tools/feature_edit_tools.tsx | 19 ++---- .../feature_edit_tools/index.ts | 7 +- .../clock_play_icon.tsx | 36 ----------- .../timeslider_toggle_button.tsx | 6 +- 21 files changed, 175 insertions(+), 122 deletions(-) create mode 100644 x-pack/plugins/maps/public/_animations.scss delete mode 100644 x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/clock_play_icon.tsx diff --git a/x-pack/plugins/maps/public/_animations.scss b/x-pack/plugins/maps/public/_animations.scss new file mode 100644 index 00000000000000..fde47a7da36e1c --- /dev/null +++ b/x-pack/plugins/maps/public/_animations.scss @@ -0,0 +1,39 @@ +@keyframes mapAnimationHeadShake { + 0% { + transform: translateX(0); + } + + 6.5% { + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + transform: translateX(2px) rotateY(3deg); + } + + 50% { + transform: translateX(0); + } +} + +@keyframes mapAnimationPulse { + from { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.005, 1.005, 1.005); + } + + to { + transform: scale3d(1, 1, 1); + } +} \ No newline at end of file diff --git a/x-pack/plugins/maps/public/_index.scss b/x-pack/plugins/maps/public/_index.scss index 5332464ade9fba..01363209cfffd5 100644 --- a/x-pack/plugins/maps/public/_index.scss +++ b/x-pack/plugins/maps/public/_index.scss @@ -13,3 +13,4 @@ @import 'connected_components/index'; @import 'components/index'; @import 'classes/index'; +@import 'animations'; \ No newline at end of file diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index 1d239a75d1499e..0072fcceb0d2ea 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -256,9 +256,10 @@ export function setSelectedLayer(layerId: string | null) { } if (layerId) { dispatch(trackCurrentLayerState(layerId)); - } - if (getDrawMode(getState()) !== DRAW_MODE.NONE) { - dispatch(setDrawMode(DRAW_MODE.NONE)); + // Reset draw mode only if setting a new selected layer + if (getDrawMode(getState()) !== DRAW_MODE.NONE) { + dispatch(setDrawMode(DRAW_MODE.NONE)); + } } dispatch({ type: SET_SELECTED_LAYER, diff --git a/x-pack/plugins/maps/public/actions/map_actions.ts b/x-pack/plugins/maps/public/actions/map_actions.ts index 464e4dbc6d5ae9..a1c7e2f7b453cc 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.ts @@ -27,6 +27,7 @@ import { getSearchSessionMapBuffer, getLayerById, getEditState, + getSelectedLayerId, } from '../selectors/map_selectors'; import { CLEAR_GOTO, @@ -342,6 +343,19 @@ export function updateEditShape(shapeToDraw: DRAW_SHAPE | null) { }; } +export function setEditLayerToSelectedLayer() { + return async ( + dispatch: ThunkDispatch<MapStoreState, void, AnyAction>, + getState: () => MapStoreState + ) => { + const layerId = getSelectedLayerId(getState()); + if (!layerId) { + return; + } + dispatch(updateEditLayer(layerId)); + }; +} + export function updateEditLayer(layerId: string | null) { return (dispatch: Dispatch) => { if (layerId !== null) { diff --git a/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts b/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts index b14ba7cf693b04..4f43d0384940c1 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts +++ b/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts @@ -38,6 +38,7 @@ export type LayerWizard = { prerequisiteSteps?: Array<{ id: string; label: string }>; renderWizard(renderWizardArguments: RenderWizardArguments): ReactElement<any>; title: string; + showFeatureEditTools?: boolean; }; export type LayerWizardWithMeta = LayerWizard & { diff --git a/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx b/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx index c4464c8787c19e..5df11407b83bda 100644 --- a/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx +++ b/x-pack/plugins/maps/public/classes/layers/new_vector_layer_wizard/config.tsx @@ -45,6 +45,7 @@ export const newVectorLayerWizardConfig: LayerWizard = { renderWizard: (renderWizardArguments: RenderWizardArguments) => { return <NewVectorLayerEditor {...renderWizardArguments} />; }, + showFeatureEditTools: true, title: i18n.translate('xpack.maps.newVectorLayerWizard.title', { defaultMessage: 'Create new layer', }), diff --git a/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap b/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap index 84534515dfa57d..875f5df72b1bef 100644 --- a/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap +++ b/x-pack/plugins/maps/public/components/tooltip_selector/__snapshots__/add_tooltip_field_popover.test.tsx.snap @@ -54,7 +54,9 @@ exports[`Should remove selected fields from selectable 1`] = ` <EuiSpacer size="xs" /> - <EuiPopoverFooter> + <EuiPopoverFooter + paddingSize="s" + > <EuiTextAlign textAlign="right" > @@ -143,7 +145,9 @@ exports[`Should render 1`] = ` <EuiSpacer size="xs" /> - <EuiPopoverFooter> + <EuiPopoverFooter + paddingSize="s" + > <EuiTextAlign textAlign="right" > diff --git a/x-pack/plugins/maps/public/components/tooltip_selector/add_tooltip_field_popover.tsx b/x-pack/plugins/maps/public/components/tooltip_selector/add_tooltip_field_popover.tsx index 04ae7af62fddcf..3804e3873b47e9 100644 --- a/x-pack/plugins/maps/public/components/tooltip_selector/add_tooltip_field_popover.tsx +++ b/x-pack/plugins/maps/public/components/tooltip_selector/add_tooltip_field_popover.tsx @@ -164,14 +164,14 @@ export class AddTooltipFieldPopover extends Component<Props, State> { > {(list, search) => ( <div style={{ width: '300px' }}> - <EuiPopoverTitle>{search}</EuiPopoverTitle> + <EuiPopoverTitle paddingSize="s">{search}</EuiPopoverTitle> {list} </div> )} </EuiSelectable> <EuiSpacer size="xs" /> - <EuiPopoverFooter> + <EuiPopoverFooter paddingSize="s"> <EuiTextAlign textAlign="right"> <EuiButton fill diff --git a/x-pack/plugins/maps/public/connected_components/add_layer_panel/index.ts b/x-pack/plugins/maps/public/connected_components/add_layer_panel/index.ts index f91abc3856e05c..67f0c3664acdac 100644 --- a/x-pack/plugins/maps/public/connected_components/add_layer_panel/index.ts +++ b/x-pack/plugins/maps/public/connected_components/add_layer_panel/index.ts @@ -14,12 +14,15 @@ import { addPreviewLayers, promotePreviewLayers, removePreviewLayers, + setDrawMode, setFirstPreviewLayerToSelectedLayer, + setEditLayerToSelectedLayer, updateFlyout, } from '../../actions'; import { MapStoreState } from '../../reducers/store'; import { LayerDescriptor } from '../../../common/descriptor_types'; import { hasPreviewLayers, isLoadingPreviewLayers } from '../../selectors/map_selectors'; +import { DRAW_MODE } from '../../../common'; function mapStateToProps(state: MapStoreState) { return { @@ -42,6 +45,10 @@ function mapDispatchToProps(dispatch: ThunkDispatch<MapStoreState, void, AnyActi dispatch(updateFlyout(FLYOUT_STATE.NONE)); dispatch(removePreviewLayers()); }, + enableEditMode: () => { + dispatch(setEditLayerToSelectedLayer()); + dispatch(setDrawMode(DRAW_MODE.DRAW_SHAPES)); + }, }; } diff --git a/x-pack/plugins/maps/public/connected_components/add_layer_panel/view.tsx b/x-pack/plugins/maps/public/connected_components/add_layer_panel/view.tsx index 2b18d87f03c895..4b3b10889790a7 100644 --- a/x-pack/plugins/maps/public/connected_components/add_layer_panel/view.tsx +++ b/x-pack/plugins/maps/public/connected_components/add_layer_panel/view.tsx @@ -33,6 +33,7 @@ export interface Props { hasPreviewLayers: boolean; isLoadingPreviewLayers: boolean; promotePreviewLayers: () => void; + enableEditMode: () => void; } interface State { @@ -91,6 +92,9 @@ export class AddLayerPanel extends Component<Props, State> { if (this.state.layerSteps.length - 1 === this.state.currentStepIndex) { // last step this.props.promotePreviewLayers(); + if (this.state.layerWizard?.showFeatureEditTools) { + this.props.enableEditMode(); + } } else { this.setState((prevState) => { const nextIndex = prevState.currentStepIndex + 1; diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss index d49ce3f0b7530a..094d116b78623b 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/_toc_entry.scss @@ -32,6 +32,23 @@ .mapTocEntry-isInEditingMode { background-color: tintOrShade($euiColorPrimary, 90%, 70%) !important; + font-size: $euiFontSizeXS; + font-weight: $euiFontWeightMedium; + + &__row { + margin-left: $euiSizeL; + display: inline-flex; + align-items: center; + + > * { + margin-right: $euiSizeXS; + } + } + + &__editFeatureText { + line-height: 1; + padding-right: $euiSizeXS; + } } .mapTocEntry-isDragging { diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/index.ts b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/index.ts index e9c386ce5f8bdf..7f879e8501629f 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/index.ts +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/index.ts @@ -29,7 +29,10 @@ import { hideTOCDetails, showTOCDetails, toggleLayerVisible, + setDrawMode, + updateDrawState, } from '../../../../../actions'; +import { DRAW_MODE } from '../../../../../../common'; function mapStateToProps(state: MapStoreState, ownProps: OwnProps): ReduxStateProps { const flyoutDisplay = getFlyoutDisplay(state); @@ -63,6 +66,10 @@ function mapDispatchToProps(dispatch: ThunkDispatch<MapStoreState, void, AnyActi toggleVisible: (layerId: string) => { dispatch(toggleLayerVisible(layerId)); }, + cancelEditing: () => { + dispatch(updateDrawState(null)); + dispatch(setDrawMode(DRAW_MODE.NONE)); + }, }; } diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.test.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.test.tsx index e6439f80411d15..21688b4631f003 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.test.tsx @@ -63,6 +63,7 @@ const defaultProps = { hideTOCDetails: () => {}, showTOCDetails: () => {}, editModeActiveForLayer: false, + cancelEditing: () => {}, }; describe('TOCEntry', () => { diff --git a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx index 329e7751f67c52..2a933aab6c0981 100644 --- a/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx +++ b/x-pack/plugins/maps/public/connected_components/right_side_controls/layer_control/layer_toc/toc_entry/toc_entry.tsx @@ -8,8 +8,8 @@ import React, { Component } from 'react'; import classNames from 'classnames'; import type { DraggableProvidedDragHandleProps } from 'react-beautiful-dnd'; - -import { EuiIcon, EuiButtonIcon, EuiConfirmModal } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiIcon, EuiButtonIcon, EuiConfirmModal, EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { TOCEntryActionsPopover } from './toc_entry_actions_popover'; import { @@ -40,6 +40,7 @@ export interface ReduxDispatchProps { hideTOCDetails: (layerId: string) => void; showTOCDetails: (layerId: string) => void; toggleVisible: (layerId: string) => void; + cancelEditing: () => void; } export interface OwnProps { @@ -332,6 +333,24 @@ export class TOCEntry extends Component<Props, State> { {this._renderDetailsToggle()} {this._renderCancelModal()} + + {this.props.editModeActiveForLayer && ( + <div className="mapTocEntry-isInEditingMode__row"> + <EuiIcon type="vector" size="s" /> + <span className="mapTocEntry-isInEditingMode__editFeatureText"> + <FormattedMessage + id="xpack.maps.layerControl.tocEntry.EditFeatures" + defaultMessage="Edit features" + /> + </span> + <EuiButtonEmpty size="xs" flush="both" onClick={this.props.cancelEditing}> + <FormattedMessage + id="xpack.maps.layerControl.tocEntry.exitEditModeAriaLabel" + defaultMessage="Exit" + /> + </EuiButtonEmpty> + </div> + )} </div> ); } diff --git a/x-pack/plugins/maps/public/connected_components/timeslider/_index.scss b/x-pack/plugins/maps/public/connected_components/timeslider/_index.scss index 6e169615750955..cf000967eb23e2 100644 --- a/x-pack/plugins/maps/public/connected_components/timeslider/_index.scss +++ b/x-pack/plugins/maps/public/connected_components/timeslider/_index.scss @@ -1,53 +1,17 @@ +$timesliderWidth: 585px; + .mapTimeslider { @include euiBottomShadowLarge; position: fixed; left: 50%; bottom: $euiSize; - transform: translateX(-50%); - min-width: 530px; + // we could center with translateX but this would impact the animation + margin-left: -($timesliderWidth / 2); + width: $timesliderWidth; z-index: 99999; background: $euiColorEmptyShade; - padding: $euiSizeL $euiSizeXL; + padding: $euiSizeL $euiSize; border-radius: $euiSize; - - .euiRangeTick { - overflow-x: hidden; - text-overflow: ellipsis; - font-size: $euiFontSizeXS; - position: relative; - padding-top: $euiSize; - color: $euiColorDarkShade; - - &::before { - @include size($euiSizeXS); - width: 3px; - height: $euiSizeS; - content: ''; - background-color: $euiColorLightShade; - position: absolute; - top: $euiSizeXS; - left: calc(50% - #{($euiSizeXS/2)}); - } - - &--isCustom { - position: absolute; - transform: translateX(-50%); - } - - &:enabled:hover, - &:focus, - &--selected { - color: $euiColorPrimary; - } - - &--selected { - font-weight: $euiFontWeightMedium; - } - - &:disabled { - cursor: not-allowed; - } - } } .mapTimeslider__row { @@ -60,6 +24,10 @@ > * { align-items: center; } + + &:first-child { + padding: 0 $euiSize; + } } .mapTimeslider__close { @@ -77,6 +45,10 @@ .mapTimeslider__controls { margin-left: $euiSizeS; + + .euiButtonIcon + .euiButtonIcon { + margin-left: $euiSizeXS; + } } .mapTimeslider__innerPanel { @@ -87,3 +59,11 @@ display: inline-flex; align-items: center; } + +.mapTimeslider__playButton { + border-radius: 50%; +} + +.mapTimeslider--animation { + animation: mapAnimationPulse .6s ease-in-out; +} diff --git a/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx b/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx index fb3d87b3aa4322..08d3af09b60a1b 100644 --- a/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx +++ b/x-pack/plugins/maps/public/connected_components/timeslider/timeslider.tsx @@ -166,7 +166,7 @@ class KeyedTimeslider extends Component<Props, State> { render() { return ( - <div className="mapTimeslider"> + <div className="mapTimeslider mapTimeslider--animation"> <div className="mapTimeslider__row"> <EuiButtonIcon onClick={this.props.closeTimeslider} @@ -186,24 +186,18 @@ class KeyedTimeslider extends Component<Props, State> { <div className="mapTimeslider__controls"> <EuiButtonIcon onClick={this._onPrevious} - iconType="arrowLeft" + iconType="framePrevious" color="text" aria-label={i18n.translate('xpack.maps.timeslider.previousTimeWindowLabel', { defaultMessage: 'Previous time window', })} /> <EuiButtonIcon - onClick={this._onNext} - iconType="arrowRight" - color="text" - aria-label={i18n.translate('xpack.maps.timeslider.nextTimeWindowLabel', { - defaultMessage: 'Next time window', - })} - /> - <EuiButtonIcon + className="mapTimeslider__playButton" onClick={this.state.isPaused ? this._onPlay : this._onPause} - iconType={this.state.isPaused ? 'play' : 'pause'} - color="text" + iconType={this.state.isPaused ? 'playFilled' : 'pause'} + size="s" + display="fill" aria-label={ this.state.isPaused ? i18n.translate('xpack.maps.timeslider.playLabel', { @@ -214,6 +208,14 @@ class KeyedTimeslider extends Component<Props, State> { }) } /> + <EuiButtonIcon + onClick={this._onNext} + iconType="frameNext" + color="text" + aria-label={i18n.translate('xpack.maps.timeslider.nextTimeWindowLabel', { + defaultMessage: 'Next time window', + })} + /> </div> </div> </div> @@ -228,6 +230,7 @@ class KeyedTimeslider extends Component<Props, State> { max={this.state.max} step={1} ticks={this.state.ticks} + isDraggable /> </div> </div> diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/_toolbar_overlay.scss b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/_toolbar_overlay.scss index 459a22c82401c3..511de91e964b99 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/_toolbar_overlay.scss +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/_toolbar_overlay.scss @@ -52,6 +52,10 @@ } } +.mapToolbarOverlay__buttonGroupAnimated { + animation: mapAnimationHeadShake 1.2s ease-in-out; +} + .mapToolbarOverlay__button__exit { .euiButtonIcon { color: $euiColorDangerText !important; diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/feature_edit_tools.tsx b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/feature_edit_tools.tsx index a2b3b20ae18778..ce900cb1e9d651 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/feature_edit_tools.tsx +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/feature_edit_tools.tsx @@ -19,7 +19,6 @@ export interface ReduxStateProps { export interface ReduxDispatchProps { setDrawShape: (shapeToDraw: DRAW_SHAPE) => void; - cancelEditing: () => void; } export interface OwnProps { @@ -37,7 +36,10 @@ export function FeatureEditTools(props: Props) { const deleteSelected = props.drawShape === DRAW_SHAPE.DELETE; return ( - <EuiPanel paddingSize="none" className="mapToolbarOverlay__buttonGroup"> + <EuiPanel + paddingSize="none" + className="mapToolbarOverlay__buttonGroup mapToolbarOverlay__buttonGroupAnimated" + > {props.pointsOnly ? null : ( <> <EuiButtonIcon @@ -136,19 +138,6 @@ export function FeatureEditTools(props: Props) { isSelected={deleteSelected} display={deleteSelected ? 'fill' : 'empty'} /> - - <EuiButtonIcon - key="exit" - size="s" - onClick={props.cancelEditing} - iconType="exit" - aria-label={i18n.translate('xpack.maps.toolbarOverlay.featureDraw.cancelDraw', { - defaultMessage: 'Exit feature editing', - })} - title={i18n.translate('xpack.maps.toolbarOverlay.featureDraw.cancelDrawTitle', { - defaultMessage: 'Exit feature editing', - })} - /> </EuiPanel> ); } diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/index.ts b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/index.ts index 2e103eb2c8c095..727bbbb8c84a35 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/index.ts +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/feature_draw_controls/feature_edit_tools/index.ts @@ -14,9 +14,9 @@ import { ReduxStateProps, OwnProps, } from './feature_edit_tools'; -import { setDrawMode, updateEditShape } from '../../../../actions'; +import { updateEditShape } from '../../../../actions'; import { MapStoreState } from '../../../../reducers/store'; -import { DRAW_MODE, DRAW_SHAPE } from '../../../../../common'; +import { DRAW_SHAPE } from '../../../../../common'; import { getEditState } from '../../../../selectors/map_selectors'; function mapStateToProps(state: MapStoreState): ReduxStateProps { @@ -33,9 +33,6 @@ function mapDispatchToProps( setDrawShape: (shapeToDraw: DRAW_SHAPE) => { dispatch(updateEditShape(shapeToDraw)); }, - cancelEditing: () => { - dispatch(setDrawMode(DRAW_MODE.NONE)); - }, }; } diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/clock_play_icon.tsx b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/clock_play_icon.tsx deleted file mode 100644 index bc24889d2ec2c0..00000000000000 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/clock_play_icon.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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, { FunctionComponent } from 'react'; - -interface Props { - title?: string; - titleId?: string; -} - -export const ClockPlayIcon: FunctionComponent<Props> = ({ title, titleId, ...props }) => ( - <svg - width={16} - height={16} - viewBox="0 0 16 16" - xmlns="http://www.w3.org/2000/svg" - aria-labelledby={titleId} - {...props} - > - {title ? <title id={titleId}>{title} : null} - - - - -); diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/timeslider_toggle_button.tsx b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/timeslider_toggle_button.tsx index 9332c2baaa5029..5811d1e970a35f 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/timeslider_toggle_button.tsx +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/timeslider_toggle_button/timeslider_toggle_button.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonIcon, EuiPanel } from '@elastic/eui'; -import { ClockPlayIcon } from './clock_play_icon'; export interface Props { isTimesliderOpen: boolean; @@ -39,10 +38,11 @@ export function TimesliderToggleButton(props: Props) { size="s" onClick={onClick} data-test-subj="timesliderToggleButton" - iconType={ClockPlayIcon} - color={props.isTimesliderOpen ? 'primary' : 'text'} + iconType="timeslider" aria-label={label} title={label} + isSelected={props.isTimesliderOpen} + display={props.isTimesliderOpen ? 'fill' : 'empty'} /> ); From 9e52ebff9ec27051afa49c658b438d1653cc9f46 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 29 Jun 2021 18:43:11 +0200 Subject: [PATCH 106/227] purge all incomplete columns on closing flyout (#103454) --- .../indexpattern_datasource/indexpattern.test.ts | 4 ++-- .../public/indexpattern_datasource/indexpattern.tsx | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts index 64b0bdd7ca2a6a..de2da6bd05df16 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.test.ts @@ -1467,7 +1467,7 @@ describe('IndexPattern Data Source', () => { ).toBeUndefined(); }); - it('should clear the incomplete column', () => { + it('should clear all incomplete columns', () => { const state = { indexPatternRefs: [], existingFields: {}, @@ -1499,7 +1499,7 @@ describe('IndexPattern Data Source', () => { indexPatternId: '1', columnOrder: [], columns: {}, - incompleteColumns: { col2: { operationType: 'sum' } }, + incompleteColumns: undefined, }, }, }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx index 5f17ea74ae9924..34be770a7f50d6 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern.tsx @@ -43,7 +43,7 @@ import { import { isDraggedField, normalizeOperationDataType } from './utils'; import { LayerPanel } from './layerpanel'; -import { IndexPatternColumn, getErrorMessages, IncompleteColumn } from './operations'; +import { IndexPatternColumn, getErrorMessages } from './operations'; import { IndexPatternField, IndexPatternPrivateState, IndexPatternPersistedState } from './types'; import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; @@ -362,17 +362,14 @@ export function getIndexPatternDatasource({ // Reset the temporary invalid state when closing the editor, but don't // update the state if it's not needed updateStateOnCloseDimension: ({ state, layerId, columnId }) => { - const layer = { ...state.layers[layerId] }; - const current = state.layers[layerId].incompleteColumns || {}; - if (!Object.values(current).length) { + const layer = state.layers[layerId]; + if (!Object.values(layer.incompleteColumns || {}).length) { return; } - const newIncomplete: Record = { ...current }; - delete newIncomplete[columnId]; return mergeLayer({ state, layerId, - newLayer: { ...layer, incompleteColumns: newIncomplete }, + newLayer: { ...layer, incompleteColumns: undefined }, }); }, From a7b5d3533eb96987b4e52fc7d952c1a96c9f2832 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Tue, 29 Jun 2021 13:05:33 -0400 Subject: [PATCH 107/227] [Stack Monitoring] create alert per node instead of per cluster (#102544) * create alert per node instead of per cluster * add comment * fix test, replace alert state with empty array with no node is firing * update cpu usage action messaging * fix internationalization * update disk usage rule action messaging * update memory usage rule action messaging * update other action messaging * update missing monitoring data alert action messaging * remove comment * fix bug where threadpool alerts were not firing * fix bug with threadpool rejections and update alert action messaging to be per node * update comments * unit test for thread pool write rejections alert * update messaging for CCR read rejection * fix cluster level alerts to use the cluster id when its not node level * add more tests to nodes changed alert * update default message * update alert messaging for large shard size * update default messaging Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../plugins/monitoring/common/types/alerts.ts | 5 +- .../monitoring/server/alerts/alert_helpers.ts | 2 +- .../monitoring/server/alerts/base_alert.ts | 63 ++-- .../alerts/ccr_read_exceptions_alert.ts | 6 +- .../alerts/cluster_health_alert.test.ts | 2 +- .../server/alerts/cpu_usage_alert.test.ts | 28 +- .../server/alerts/cpu_usage_alert.ts | 109 +++---- .../server/alerts/disk_usage_alert.test.ts | 24 +- .../server/alerts/disk_usage_alert.ts | 114 +++---- ...asticsearch_version_mismatch_alert.test.ts | 2 +- .../server/alerts/large_shard_size_alert.ts | 37 +-- .../logstash_version_mismatch_alert.test.ts | 2 +- .../server/alerts/memory_usage_alert.test.ts | 290 +++++++++++++++++ .../server/alerts/memory_usage_alert.ts | 121 ++++--- .../missing_monitoring_data_alert.test.ts | 27 +- .../alerts/missing_monitoring_data_alert.ts | 116 +++---- .../server/alerts/nodes_changed_alert.test.ts | 116 ++++++- .../thread_pool_rejections_alert_base.ts | 64 ++-- ...hread_pool_search_rejections_alert.test.ts | 298 ++++++++++++++++++ ...thread_pool_write_rejections_alert.test.ts | 298 ++++++++++++++++++ .../server/lib/alerts/fetch_status.ts | 4 +- .../translations/translations/ja-JP.json | 22 -- .../translations/translations/zh-CN.json | 22 -- .../apps/infra/metrics_anomalies.ts | 1 - 24 files changed, 1371 insertions(+), 402 deletions(-) create mode 100644 x-pack/plugins/monitoring/server/alerts/memory_usage_alert.test.ts create mode 100644 x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_alert.test.ts create mode 100644 x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_alert.test.ts diff --git a/x-pack/plugins/monitoring/common/types/alerts.ts b/x-pack/plugins/monitoring/common/types/alerts.ts index 33c571110303fd..e13d791ca162b5 100644 --- a/x-pack/plugins/monitoring/common/types/alerts.ts +++ b/x-pack/plugins/monitoring/common/types/alerts.ts @@ -97,11 +97,9 @@ export interface AlertMemoryUsageState extends AlertNodeState { memoryUsage: number; } -export interface AlertThreadPoolRejectionsState extends AlertState { +export interface AlertThreadPoolRejectionsState extends AlertNodeState { rejectionCount: number; type: string; - nodeId: string; - nodeName?: string; } export interface AlertLicenseState extends AlertState { @@ -172,6 +170,7 @@ export interface AlertThreadPoolRejectionsStats { nodeId: string; nodeName: string; rejectionCount: number; + type: string; ccs?: string; } diff --git a/x-pack/plugins/monitoring/server/alerts/alert_helpers.ts b/x-pack/plugins/monitoring/server/alerts/alert_helpers.ts index 8329488694b6f0..d4a0ad2af2a944 100644 --- a/x-pack/plugins/monitoring/server/alerts/alert_helpers.ts +++ b/x-pack/plugins/monitoring/server/alerts/alert_helpers.ts @@ -43,7 +43,7 @@ export class AlertingDefaults { clusterName: { name: 'clusterName', description: i18n.translate('xpack.monitoring.alerts.actionVariables.clusterName', { - defaultMessage: 'The cluster to which the nodes belong.', + defaultMessage: 'The cluster to which the node(s) belongs.', }), }, action: { diff --git a/x-pack/plugins/monitoring/server/alerts/base_alert.ts b/x-pack/plugins/monitoring/server/alerts/base_alert.ts index 8954a4ae2486d5..cfd7630a65dbc4 100644 --- a/x-pack/plugins/monitoring/server/alerts/base_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/base_alert.ts @@ -274,46 +274,49 @@ export class BaseAlert { state: ExecutedState ) { const currentUTC = +new Date(); + // for each cluster filter the nodes that belong to this cluster for (const cluster of clusters) { const nodes = data.filter((node) => node.clusterUuid === cluster.clusterUuid); if (!nodes.length) { continue; } - const firingNodeUuids = nodes - .filter((node) => node.shouldFire) - .map((node) => node.meta.nodeId || node.meta.instanceId) - .join(','); - const instanceId = `${this.alertOptions.id}:${cluster.clusterUuid}:${firingNodeUuids}`; - const instance = services.alertInstanceFactory(instanceId); - const newAlertStates: AlertNodeState[] = []; const key = this.alertOptions.accessorKey; + + // for each node, update the alert's state with node state for (const node of nodes) { - if (!node.shouldFire) { - continue; + const newAlertStates: AlertNodeState[] = []; + // quick fix for now so that non node level alerts will use the cluster id + const instance = services.alertInstanceFactory( + node.meta.nodeId || node.meta.instanceId || cluster.clusterUuid + ); + + if (node.shouldFire) { + const { meta } = node; + // create a default alert state for this node and add data from node.meta and other data + const nodeState = this.getDefaultAlertState(cluster, node) as AlertNodeState; + if (key) { + nodeState[key] = meta[key]; + } + nodeState.nodeId = meta.nodeId || node.nodeId! || meta.instanceId; + // TODO: make these functions more generic, so it's node/item agnostic + nodeState.nodeName = meta.itemLabel || meta.nodeName || node.nodeName || nodeState.nodeId; + nodeState.itemLabel = meta.itemLabel; + nodeState.meta = meta; + nodeState.ui.triggeredMS = currentUTC; + nodeState.ui.isFiring = true; + nodeState.ui.severity = node.severity; + nodeState.ui.message = this.getUiMessage(nodeState, node); + // store the state of each node in array. + newAlertStates.push(nodeState); } - const { meta } = node; - const nodeState = this.getDefaultAlertState(cluster, node) as AlertNodeState; - if (key) { - nodeState[key] = meta[key]; + const alertInstanceState = { alertStates: newAlertStates }; + // update the alert's state with the new node states + instance.replaceState(alertInstanceState); + if (newAlertStates.length) { + this.executeActions(instance, alertInstanceState, null, cluster); + state.lastExecutedAction = currentUTC; } - nodeState.nodeId = meta.nodeId || node.nodeId! || meta.instanceId; - // TODO: make these functions more generic, so it's node/item agnostic - nodeState.nodeName = meta.itemLabel || meta.nodeName || node.nodeName || nodeState.nodeId; - nodeState.itemLabel = meta.itemLabel; - nodeState.meta = meta; - nodeState.ui.triggeredMS = currentUTC; - nodeState.ui.isFiring = true; - nodeState.ui.severity = node.severity; - nodeState.ui.message = this.getUiMessage(nodeState, node); - newAlertStates.push(nodeState); - } - - const alertInstanceState = { alertStates: newAlertStates }; - instance.replaceState(alertInstanceState); - if (newAlertStates.length) { - this.executeActions(instance, alertInstanceState, null, cluster); - state.lastExecutedAction = currentUTC; } } diff --git a/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_alert.ts b/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_alert.ts index 6401c5213ee7d8..2995566c7c096a 100644 --- a/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/ccr_read_exceptions_alert.ts @@ -240,7 +240,7 @@ export class CCRReadExceptionsAlert extends BaseAlert { 'xpack.monitoring.alerts.ccrReadExceptions.shortAction', { defaultMessage: - 'Verify follower and leader index relationships across the affected remote clusters.', + 'Verify follower and leader index relationships on the affected remote cluster.', } ); const fullActionText = i18n.translate('xpack.monitoring.alerts.ccrReadExceptions.fullAction', { @@ -258,7 +258,7 @@ export class CCRReadExceptionsAlert extends BaseAlert { const internalShortMessage = i18n.translate( 'xpack.monitoring.alerts.ccrReadExceptions.firing.internalShortMessage', { - defaultMessage: `CCR read exceptions alert is firing for the following remote clusters: {remoteClustersList}. {shortActionText}`, + defaultMessage: `CCR read exceptions alert is firing for the following remote cluster: {remoteClustersList}. {shortActionText}`, values: { remoteClustersList, shortActionText, @@ -268,7 +268,7 @@ export class CCRReadExceptionsAlert extends BaseAlert { const internalFullMessage = i18n.translate( 'xpack.monitoring.alerts.ccrReadExceptions.firing.internalFullMessage', { - defaultMessage: `CCR read exceptions alert is firing for the following remote clusters: {remoteClustersList}. Current 'follower_index' indices are affected: {followerIndicesList}. {action}`, + defaultMessage: `CCR read exceptions alert is firing for the following remote cluster: {remoteClustersList}. Current 'follower_index' index affected: {followerIndicesList}. {action}`, values: { action, remoteClustersList, diff --git a/x-pack/plugins/monitoring/server/alerts/cluster_health_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/cluster_health_alert.test.ts index 1c39d6d6b96295..68d0f7b1e0ce7e 100644 --- a/x-pack/plugins/monitoring/server/alerts/cluster_health_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/cluster_health_alert.test.ts @@ -52,7 +52,7 @@ describe('ClusterHealthAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts index be10ba15d2674e..81c51366cb8aa5 100644 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts @@ -19,11 +19,11 @@ jest.mock('../lib/alerts/fetch_cpu_usage_node_stats', () => ({ jest.mock('../lib/alerts/fetch_clusters', () => ({ fetchClusters: jest.fn(), })); - jest.mock('../static_globals', () => ({ Globals: { app: { getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', config: { ui: { ccs: { enabled: true }, @@ -43,8 +43,7 @@ describe('CpuUsageAlert', () => { expect(alert.alertOptions.throttle).toBe('1d'); expect(alert.alertOptions.defaultParams).toStrictEqual({ threshold: 85, duration: '5m' }); expect(alert.alertOptions.actionVariables).toStrictEqual([ - { name: 'nodes', description: 'The list of nodes reporting high cpu usage.' }, - { name: 'count', description: 'The number of nodes reporting high cpu usage.' }, + { name: 'node', description: 'The node reporting high cpu usage.' }, { name: 'internalShortMessage', description: 'The short internal message generated by Elastic.', @@ -54,7 +53,7 @@ describe('CpuUsageAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', @@ -140,8 +139,7 @@ describe('CpuUsageAlert', () => { ui: { isFiring: true, message: { - text: - 'Node #start_linkmyNodeName#end_link is reporting cpu usage of 91% at #absolute', + text: `Node #start_link${nodeName}#end_link is reporting cpu usage of ${cpuUsage}% at #absolute`, nextSteps: [ { text: '#start_linkCheck hot threads#end_link', @@ -192,13 +190,14 @@ describe('CpuUsageAlert', () => { ], }); expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `CPU usage alert is firing for ${count} node(s) in cluster: ${clusterName}. [View nodes](elasticsearch/nodes)`, - internalShortMessage: `CPU usage alert is firing for ${count} node(s) in cluster: ${clusterName}. Verify CPU levels across affected nodes.`, - action: `[View nodes](elasticsearch/nodes)`, - actionPlain: 'Verify CPU levels across affected nodes.', + internalFullMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify CPU level of node.', clusterName, count, nodes: `${nodeName}:${cpuUsage}`, + node: `${nodeName}:${cpuUsage}`, state: 'firing', }); }); @@ -242,13 +241,14 @@ describe('CpuUsageAlert', () => { } as any); const count = 1; expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `CPU usage alert is firing for ${count} node(s) in cluster: ${clusterName}. [View nodes](elasticsearch/nodes)`, - internalShortMessage: `CPU usage alert is firing for ${count} node(s) in cluster: ${clusterName}. Verify CPU levels across affected nodes.`, - action: `[View nodes](elasticsearch/nodes)`, - actionPlain: 'Verify CPU levels across affected nodes.', + internalFullMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `CPU usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify CPU level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + actionPlain: 'Verify CPU level of node.', clusterName, count, nodes: `${nodeName}:${cpuUsage}`, + node: `${nodeName}:${cpuUsage}`, state: 'firing', }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts index 438d350d366f84..44b3cb306bd9fa 100644 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts @@ -51,15 +51,9 @@ export class CpuUsageAlert extends BaseAlert { }, actionVariables: [ { - name: 'nodes', - description: i18n.translate('xpack.monitoring.alerts.cpuUsage.actionVariables.nodes', { - defaultMessage: 'The list of nodes reporting high cpu usage.', - }), - }, - { - name: 'count', - description: i18n.translate('xpack.monitoring.alerts.cpuUsage.actionVariables.count', { - defaultMessage: 'The number of nodes reporting high cpu usage.', + name: 'node', + description: i18n.translate('xpack.monitoring.alerts.cpuUsage.actionVariables.node', { + defaultMessage: 'The node reporting high cpu usage.', }), }, ...Object.values(AlertingDefaults.ALERT_TYPE.context), @@ -170,51 +164,58 @@ export class CpuUsageAlert extends BaseAlert { if (alertStates.length === 0) { return; } - - const firingNodes = alertStates.filter( - (alertState) => alertState.ui.isFiring - ) as AlertCpuUsageState[]; - const firingCount = firingNodes.length; - if (firingCount > 0) { - const shortActionText = i18n.translate('xpack.monitoring.alerts.cpuUsage.shortAction', { - defaultMessage: 'Verify CPU levels across affected nodes.', - }); - const fullActionText = i18n.translate('xpack.monitoring.alerts.cpuUsage.fullAction', { - defaultMessage: 'View nodes', - }); - const action = `[${fullActionText}](elasticsearch/nodes)`; - const internalShortMessage = i18n.translate( - 'xpack.monitoring.alerts.cpuUsage.firing.internalShortMessage', - { - defaultMessage: `CPU usage alert is firing for {count} node(s) in cluster: {clusterName}. {shortActionText}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - shortActionText, - }, - } - ); - const internalFullMessage = i18n.translate( - 'xpack.monitoring.alerts.cpuUsage.firing.internalFullMessage', - { - defaultMessage: `CPU usage alert is firing for {count} node(s) in cluster: {clusterName}. {action}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - action, - }, - } - ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - nodes: firingNodes.map(({ nodeName, cpuUsage }) => `${nodeName}:${cpuUsage}`).toString(), - count: firingCount, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, - }); + const firingNode = alertStates[0] as AlertCpuUsageState; + if (!firingNode || !firingNode.ui.isFiring) { + return; } + const shortActionText = i18n.translate('xpack.monitoring.alerts.cpuUsage.shortAction', { + defaultMessage: 'Verify CPU level of node.', + }); + const fullActionText = i18n.translate('xpack.monitoring.alerts.cpuUsage.fullAction', { + defaultMessage: 'View node', + }); + const ccs = firingNode.ccs; + const globalStateLink = this.createGlobalStateLink( + `elasticsearch/nodes/${firingNode.nodeId}`, + cluster.clusterUuid, + ccs + ); + const action = `[${fullActionText}](${globalStateLink})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.cpuUsage.firing.internalShortMessage', + { + defaultMessage: `CPU usage alert is firing for node {nodeName} in cluster: {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + shortActionText, + }, + } + ); + const internalFullMessage = i18n.translate( + 'xpack.monitoring.alerts.cpuUsage.firing.internalFullMessage', + { + defaultMessage: `CPU usage alert is firing for node {nodeName} in cluster: {clusterName}. {action}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + action, + }, + } + ); + instance.scheduleActions('default', { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 + */ + nodes: `${firingNode.nodeName}:${firingNode.cpuUsage}`, + count: 1, + node: `${firingNode.nodeName}:${firingNode.cpuUsage}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts index 4c40a170e40b42..0514e7b3cb0786 100644 --- a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts @@ -36,6 +36,7 @@ jest.mock('../static_globals', () => ({ Globals: { app: { getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', config: { ui: { ccs: { enabled: true }, @@ -55,8 +56,7 @@ describe('DiskUsageAlert', () => { expect(alert.alertOptions.throttle).toBe('1d'); expect(alert.alertOptions.defaultParams).toStrictEqual({ threshold: 80, duration: '5m' }); expect(alert.alertOptions.actionVariables).toStrictEqual([ - { name: 'nodes', description: 'The list of nodes reporting high disk usage.' }, - { name: 'count', description: 'The number of nodes reporting high disk usage.' }, + { name: 'node', description: 'The node reporting high disk usage.' }, { name: 'internalShortMessage', description: 'The short internal message generated by Elastic.', @@ -66,7 +66,7 @@ describe('DiskUsageAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', @@ -134,13 +134,14 @@ describe('DiskUsageAlert', () => { } as any); const count = 1; expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Disk usage alert is firing for ${count} node(s) in cluster: ${clusterName}. [View nodes](elasticsearch/nodes)`, - internalShortMessage: `Disk usage alert is firing for ${count} node(s) in cluster: ${clusterName}. Verify disk usage levels across affected nodes.`, - action: `[View nodes](elasticsearch/nodes)`, - actionPlain: 'Verify disk usage levels across affected nodes.', + internalFullMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify disk usage level of node.', clusterName, count, nodes: `${nodeName}:${diskUsage}`, + node: `${nodeName}:${diskUsage}`, state: 'firing', }); }); @@ -163,13 +164,14 @@ describe('DiskUsageAlert', () => { } as any); const count = 1; expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `Disk usage alert is firing for ${count} node(s) in cluster: ${clusterName}. [View nodes](elasticsearch/nodes)`, - internalShortMessage: `Disk usage alert is firing for ${count} node(s) in cluster: ${clusterName}. Verify disk usage levels across affected nodes.`, - action: `[View nodes](elasticsearch/nodes)`, - actionPlain: 'Verify disk usage levels across affected nodes.', + internalFullMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Disk usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify disk usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/myNodeId?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: 'Verify disk usage level of node.', clusterName, count, nodes: `${nodeName}:${diskUsage}`, + node: `${nodeName}:${diskUsage}`, state: 'firing', }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts index 8eb36f322168c4..ac7829d121a3ab 100644 --- a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts @@ -50,15 +50,9 @@ export class DiskUsageAlert extends BaseAlert { }, actionVariables: [ { - name: 'nodes', - description: i18n.translate('xpack.monitoring.alerts.diskUsage.actionVariables.nodes', { - defaultMessage: 'The list of nodes reporting high disk usage.', - }), - }, - { - name: 'count', - description: i18n.translate('xpack.monitoring.alerts.diskUsage.actionVariables.count', { - defaultMessage: 'The number of nodes reporting high disk usage.', + name: 'node', + description: i18n.translate('xpack.monitoring.alerts.diskUsage.actionVariables.node', { + defaultMessage: 'The node reporting high disk usage.', }), }, ...Object.values(AlertingDefaults.ALERT_TYPE.context), @@ -174,53 +168,63 @@ export class DiskUsageAlert extends BaseAlert { item: AlertData | null, cluster: AlertCluster ) { - const firingNodes = alertStates.filter( - (alertState) => alertState.ui.isFiring - ) as AlertDiskUsageState[]; - const firingCount = firingNodes.length; - - if (firingCount > 0) { - const shortActionText = i18n.translate('xpack.monitoring.alerts.diskUsage.shortAction', { - defaultMessage: 'Verify disk usage levels across affected nodes.', - }); - const fullActionText = i18n.translate('xpack.monitoring.alerts.diskUsage.fullAction', { - defaultMessage: 'View nodes', - }); + if (alertStates.length === 0) { + return; + } + const firingNode = alertStates[0] as AlertDiskUsageState; + if (!firingNode || !firingNode.ui.isFiring) { + return; + } - const action = `[${fullActionText}](elasticsearch/nodes)`; - const internalShortMessage = i18n.translate( - 'xpack.monitoring.alerts.diskUsage.firing.internalShortMessage', - { - defaultMessage: `Disk usage alert is firing for {count} node(s) in cluster: {clusterName}. {shortActionText}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - shortActionText, - }, - } - ); - const internalFullMessage = i18n.translate( - 'xpack.monitoring.alerts.diskUsage.firing.internalFullMessage', - { - defaultMessage: `Disk usage alert is firing for {count} node(s) in cluster: {clusterName}. {action}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - action, - }, - } - ); + const shortActionText = i18n.translate('xpack.monitoring.alerts.diskUsage.shortAction', { + defaultMessage: 'Verify disk usage level of node.', + }); + const fullActionText = i18n.translate('xpack.monitoring.alerts.diskUsage.fullAction', { + defaultMessage: 'View node', + }); + const ccs = firingNode.ccs; + const globalStateLink = this.createGlobalStateLink( + `elasticsearch/nodes/${firingNode.nodeId}`, + cluster.clusterUuid, + ccs + ); + const action = `[${fullActionText}](${globalStateLink})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.diskUsage.firing.internalShortMessage', + { + defaultMessage: `Disk usage alert is firing for node {nodeName} in cluster: {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + shortActionText, + }, + } + ); + const internalFullMessage = i18n.translate( + 'xpack.monitoring.alerts.diskUsage.firing.internalFullMessage', + { + defaultMessage: `Disk usage alert is firing for node {nodeName} in cluster: {clusterName}. {action}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + action, + }, + } + ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - nodes: firingNodes.map((state) => `${state.nodeName}:${state.diskUsage}`).join(','), - count: firingCount, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, - }); - } + instance.scheduleActions('default', { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 + */ + nodes: `${firingNode.nodeName}:${firingNode.diskUsage}`, + count: 1, + node: `${firingNode.nodeName}:${firingNode.diskUsage}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_alert.test.ts index 2bd67298e7b5ae..3ac15d795d0276 100644 --- a/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/elasticsearch_version_mismatch_alert.test.ts @@ -56,7 +56,7 @@ describe('ElasticsearchVersionMismatchAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', diff --git a/x-pack/plugins/monitoring/server/alerts/large_shard_size_alert.ts b/x-pack/plugins/monitoring/server/alerts/large_shard_size_alert.ts index a6a101bc42afa4..75e22fb41025c7 100644 --- a/x-pack/plugins/monitoring/server/alerts/large_shard_size_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/large_shard_size_alert.ts @@ -35,7 +35,6 @@ import { AlertingDefaults, createLink } from './alert_helpers'; import { appendMetricbeatIndex } from '../lib/alerts/append_mb_index'; import { Globals } from '../static_globals'; -const MAX_INDICES_LIST = 10; export class LargeShardSizeAlert extends BaseAlert { constructor(public rawAlert?: SanitizedAlert) { super(rawAlert, { @@ -45,11 +44,11 @@ export class LargeShardSizeAlert extends BaseAlert { defaultParams: { indexPattern: '-.*', threshold: 55 }, actionVariables: [ { - name: 'shardIndices', + name: 'shardIndex', description: i18n.translate( 'xpack.monitoring.alerts.shardSize.actionVariables.shardIndex', { - defaultMessage: 'List of indices which are experiencing large average shard size.', + defaultMessage: 'The index experiencing large average shard size.', } ), }, @@ -166,23 +165,11 @@ export class LargeShardSizeAlert extends BaseAlert { item: AlertData | null, cluster: AlertCluster ) { - let sortedAlertStates = alertStates.slice(0).sort((alertStateA, alertStateB) => { - const { meta: metaA } = alertStateA as { meta?: IndexShardSizeUIMeta }; - const { meta: metaB } = alertStateB as { meta?: IndexShardSizeUIMeta }; - return metaB!.shardSize - metaA!.shardSize; - }); - - let suffix = ''; - if (sortedAlertStates.length > MAX_INDICES_LIST) { - const diff = sortedAlertStates.length - MAX_INDICES_LIST; - sortedAlertStates = sortedAlertStates.slice(0, MAX_INDICES_LIST); - suffix = `, and ${diff} more`; + if (alertStates.length === 0) { + return; } - - const shardIndices = - sortedAlertStates - .map((alertState) => (alertState.meta as IndexShardSizeUIMeta).shardIndex) - .join(', ') + suffix; + const shardIndexMeta = alertStates[0].meta as IndexShardSizeUIMeta; + const { shardIndex } = shardIndexMeta; const shortActionText = i18n.translate('xpack.monitoring.alerts.shardSize.shortAction', { defaultMessage: 'Investigate indices with large shard sizes.', @@ -193,7 +180,7 @@ export class LargeShardSizeAlert extends BaseAlert { const ccs = alertStates.find((state) => state.ccs)?.ccs; const globalStateLink = this.createGlobalStateLink( - 'elasticsearch/indices', + `elasticsearch/indices/${shardIndex}`, cluster.clusterUuid, ccs ); @@ -202,9 +189,9 @@ export class LargeShardSizeAlert extends BaseAlert { const internalShortMessage = i18n.translate( 'xpack.monitoring.alerts.shardSize.firing.internalShortMessage', { - defaultMessage: `Large shard size alert is firing for the following indices: {shardIndices}. {shortActionText}`, + defaultMessage: `Large shard size alert is firing for the following index: {shardIndex}. {shortActionText}`, values: { - shardIndices, + shardIndex, shortActionText, }, } @@ -212,10 +199,10 @@ export class LargeShardSizeAlert extends BaseAlert { const internalFullMessage = i18n.translate( 'xpack.monitoring.alerts.shardSize.firing.internalFullMessage', { - defaultMessage: `Large shard size alert is firing for the following indices: {shardIndices}. {action}`, + defaultMessage: `Large shard size alert is firing for the following index: {shardIndex}. {action}`, values: { action, - shardIndices, + shardIndex, }, } ); @@ -224,7 +211,7 @@ export class LargeShardSizeAlert extends BaseAlert { internalShortMessage, internalFullMessage, state: AlertingDefaults.ALERT_STATE.firing, - shardIndices, + shardIndex, clusterName: cluster.clusterName, action, actionPlain: shortActionText, diff --git a/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_alert.test.ts index 7c73c63f293f36..9f0096a7e2981c 100644 --- a/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/logstash_version_mismatch_alert.test.ts @@ -57,7 +57,7 @@ describe('LogstashVersionMismatchAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', diff --git a/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.test.ts new file mode 100644 index 00000000000000..4076eff956ee91 --- /dev/null +++ b/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.test.ts @@ -0,0 +1,290 @@ +/* + * 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 { MemoryUsageAlert } from './memory_usage_alert'; +import { ALERT_MEMORY_USAGE } from '../../common/constants'; +import { fetchMemoryUsageNodeStats } from '../lib/alerts/fetch_memory_usage_node_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { elasticsearchServiceMock } from 'src/core/server/mocks'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_memory_usage_node_stats', () => ({ + fetchMemoryUsageNodeStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + ccs: { enabled: true }, + metricbeat: { index: 'metricbeat-*' }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('MemoryUsageAlert', () => { + it('should have defaults', () => { + const alert = new MemoryUsageAlert(); + expect(alert.alertOptions.id).toBe(ALERT_MEMORY_USAGE); + expect(alert.alertOptions.name).toBe('Memory Usage (JVM)'); + expect(alert.alertOptions.throttle).toBe('1d'); + expect(alert.alertOptions.defaultParams).toStrictEqual({ threshold: 85, duration: '5m' }); + expect(alert.alertOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high memory usage.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'myNodeId'; + const nodeName = 'myNodeName'; + const memoryUsage = 91; + const stat = { + clusterUuid, + nodeId, + nodeName, + memoryUsage, + }; + + const replaceState = jest.fn(); + const scheduleActions = jest.fn(); + const getState = jest.fn(); + const executorOptions = { + services: { + scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), + alertInstanceFactory: jest.fn().mockImplementation(() => { + return { + replaceState, + scheduleActions, + getState, + }; + }), + }, + state: {}, + }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { + return [stat]; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + replaceState.mockReset(); + scheduleActions.mockReset(); + getState.mockReset(); + }); + + it('should fire actions', async () => { + const alert = new MemoryUsageAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + params: alert.alertOptions.defaultParams, + } as any); + const count = 1; + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + ccs: undefined, + cluster: { clusterUuid, clusterName }, + memoryUsage, + itemLabel: undefined, + meta: { + clusterUuid, + memoryUsage, + nodeId, + nodeName, + }, + nodeId, + nodeName, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting JVM memory usage of ${memoryUsage}% at #absolute`, + nextSteps: [ + { + text: '#start_linkTune thread pools#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + { + text: '#start_linkManaging ES Heap#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: '{elasticWebsiteUrl}blog/a-heap-of-trouble', + }, + ], + }, + { + text: '#start_linkIdentify large indices/shards#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/indices', + }, + ], + }, + { + text: '#start_linkAdd more data nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/myNodeId', + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }); + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: 'Verify memory usage level of node.', + clusterName, + count, + nodes: `${nodeName}:${memoryUsage}.00`, + node: `${nodeName}:${memoryUsage}.00`, + state: 'firing', + }); + }); + + it('should not fire actions if under threshold', async () => { + (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + memoryUsage: 1, + }, + ]; + }); + const alert = new MemoryUsageAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + params: alert.alertOptions.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [], + }); + expect(scheduleActions).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchMemoryUsageNodeStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat, + ccs, + }, + ]; + }); + const alert = new MemoryUsageAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + params: alert.alertOptions.defaultParams, + } as any); + const count = 1; + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Memory usage alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify memory usage level of node.`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:testCluster))`, + actionPlain: 'Verify memory usage level of node.', + clusterName, + count, + nodes: `${nodeName}:${memoryUsage}.00`, + node: `${nodeName}:${memoryUsage}.00`, + state: 'firing', + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts index 06cd90ca80729f..86357e7b6f0ed6 100644 --- a/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts @@ -51,15 +51,9 @@ export class MemoryUsageAlert extends BaseAlert { }, actionVariables: [ { - name: 'nodes', - description: i18n.translate('xpack.monitoring.alerts.memoryUsage.actionVariables.nodes', { - defaultMessage: 'The list of nodes reporting high memory usage.', - }), - }, - { - name: 'count', - description: i18n.translate('xpack.monitoring.alerts.memoryUsage.actionVariables.count', { - defaultMessage: 'The number of nodes reporting high memory usage.', + name: 'node', + description: i18n.translate('xpack.monitoring.alerts.memoryUsage.actionVariables.node', { + defaultMessage: 'The node reporting high memory usage.', }), }, ...Object.values(AlertingDefaults.ALERT_TYPE.context), @@ -180,61 +174,64 @@ export class MemoryUsageAlert extends BaseAlert { item: AlertData | null, cluster: AlertCluster ) { - const firingNodes = alertStates.filter( - (alertState) => alertState.ui.isFiring - ) as AlertMemoryUsageState[]; - const firingCount = firingNodes.length; + if (alertStates.length === 0) { + return; + } + const firingNode = alertStates[0] as AlertMemoryUsageState; + if (!firingNode || !firingNode.ui.isFiring) { + return; + } - if (firingCount > 0) { - const shortActionText = i18n.translate('xpack.monitoring.alerts.memoryUsage.shortAction', { - defaultMessage: 'Verify memory usage levels across affected nodes.', - }); - const fullActionText = i18n.translate('xpack.monitoring.alerts.memoryUsage.fullAction', { - defaultMessage: 'View nodes', - }); + const shortActionText = i18n.translate('xpack.monitoring.alerts.memoryUsage.shortAction', { + defaultMessage: 'Verify memory usage level of node.', + }); + const fullActionText = i18n.translate('xpack.monitoring.alerts.memoryUsage.fullAction', { + defaultMessage: 'View node', + }); - const ccs = alertStates.find((state) => state.ccs)?.ccs; - const globalStateLink = this.createGlobalStateLink( - 'elasticsearch/nodes', - cluster.clusterUuid, - ccs - ); - const action = `[${fullActionText}](${globalStateLink})`; - const internalShortMessage = i18n.translate( - 'xpack.monitoring.alerts.memoryUsage.firing.internalShortMessage', - { - defaultMessage: `Memory usage alert is firing for {count} node(s) in cluster: {clusterName}. {shortActionText}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - shortActionText, - }, - } - ); - const internalFullMessage = i18n.translate( - 'xpack.monitoring.alerts.memoryUsage.firing.internalFullMessage', - { - defaultMessage: `Memory usage alert is firing for {count} node(s) in cluster: {clusterName}. {action}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - action, - }, - } - ); + const ccs = alertStates.find((state) => state.ccs)?.ccs; + const globalStateLink = this.createGlobalStateLink( + `elasticsearch/nodes/${firingNode.nodeId}`, + cluster.clusterUuid, + ccs + ); + const action = `[${fullActionText}](${globalStateLink})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.memoryUsage.firing.internalShortMessage', + { + defaultMessage: `Memory usage alert is firing for node {nodeName} in cluster: {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + shortActionText, + }, + } + ); + const internalFullMessage = i18n.translate( + 'xpack.monitoring.alerts.memoryUsage.firing.internalFullMessage', + { + defaultMessage: `Memory usage alert is firing for node {nodeName} in cluster: {clusterName}. {action}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + action, + }, + } + ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - nodes: firingNodes - .map((state) => `${state.nodeName}:${state.memoryUsage.toFixed(2)}`) - .join(','), - count: firingCount, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, - }); - } + instance.scheduleActions('default', { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 + */ + nodes: `${firingNode.nodeName}:${firingNode.memoryUsage.toFixed(2)}`, + count: 1, + node: `${firingNode.nodeName}:${firingNode.memoryUsage.toFixed(2)}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts index 87790ee1113261..c6bf853b7787c3 100644 --- a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts @@ -45,8 +45,7 @@ describe('MissingMonitoringDataAlert', () => { expect(alert.alertOptions.throttle).toBe('6h'); expect(alert.alertOptions.defaultParams).toStrictEqual({ limit: '1d', duration: '15m' }); expect(alert.alertOptions.actionVariables).toStrictEqual([ - { name: 'nodes', description: 'The list of nodes missing monitoring data.' }, - { name: 'count', description: 'The number of nodes missing monitoring data.' }, + { name: 'node', description: 'The node missing monitoring data.' }, { name: 'internalShortMessage', description: 'The short internal message generated by Elastic.', @@ -56,7 +55,7 @@ describe('MissingMonitoringDataAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', @@ -181,12 +180,13 @@ describe('MissingMonitoringDataAlert', () => { ], }); expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `We have not detected any monitoring data for 1 node(s) in cluster: testCluster. [View what monitoring data we do have for these nodes.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123))`, - internalShortMessage: `We have not detected any monitoring data for 1 node(s) in cluster: testCluster. Verify these nodes are up and running, then double check the monitoring settings.`, - nodes: 'node: esName1', - action: `[View what monitoring data we do have for these nodes.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123))`, + internalFullMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. [View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, + nodes: `node: ${nodeName}`, + node: `node: ${nodeName}`, + action: `[View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, actionPlain: - 'Verify these nodes are up and running, then double check the monitoring settings.', + 'Verify the node is up and running, then double check the monitoring settings.', clusterName, count, state: 'firing', @@ -234,12 +234,13 @@ describe('MissingMonitoringDataAlert', () => { } as any); const count = 1; expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `We have not detected any monitoring data for 1 node(s) in cluster: testCluster. [View what monitoring data we do have for these nodes.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, - internalShortMessage: `We have not detected any monitoring data for 1 node(s) in cluster: testCluster. Verify these nodes are up and running, then double check the monitoring settings.`, - nodes: 'node: esName1', - action: `[View what monitoring data we do have for these nodes.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, + internalFullMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. [View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `We have not detected any monitoring data for node ${nodeName} in cluster: ${clusterName}. Verify the node is up and running, then double check the monitoring settings.`, + nodes: `node: ${nodeName}`, + node: `node: ${nodeName}`, + action: `[View what monitoring data we do have for this node.](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, actionPlain: - 'Verify these nodes are up and running, then double check the monitoring settings.', + 'Verify the node is up and running, then double check the monitoring settings.', clusterName, count, state: 'firing', diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts index ed35f775b249cb..77581df2303bb6 100644 --- a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts @@ -17,6 +17,7 @@ import { AlertMessageTimeToken, CommonAlertParams, CommonAlertFilter, + AlertNodeState, } from '../../common/types/alerts'; import { AlertInstance } from '../../../alerting/server'; import { @@ -50,15 +51,9 @@ export class MissingMonitoringDataAlert extends BaseAlert { throttle: '6h', actionVariables: [ { - name: 'nodes', - description: i18n.translate('xpack.monitoring.alerts.missingData.actionVariables.nodes', { - defaultMessage: 'The list of nodes missing monitoring data.', - }), - }, - { - name: 'count', - description: i18n.translate('xpack.monitoring.alerts.missingData.actionVariables.count', { - defaultMessage: 'The number of nodes missing monitoring data.', + name: 'node', + description: i18n.translate('xpack.monitoring.alerts.missingData.actionVariables.node', { + defaultMessage: 'The node missing monitoring data.', }), }, ...Object.values(AlertingDefaults.ALERT_TYPE.context), @@ -158,53 +153,64 @@ export class MissingMonitoringDataAlert extends BaseAlert { item: AlertData | null, cluster: AlertCluster ) { - const firingNodes = alertStates.filter((alertState) => alertState.ui.isFiring); - const firingCount = firingNodes.length; + if (alertStates.length === 0) { + return; + } + const firingNode = alertStates[0] as AlertNodeState; + if (!firingNode || !firingNode.ui.isFiring) { + return; + } - if (firingCount > 0) { - const shortActionText = i18n.translate('xpack.monitoring.alerts.missingData.shortAction', { - defaultMessage: - 'Verify these nodes are up and running, then double check the monitoring settings.', - }); - const fullActionText = i18n.translate('xpack.monitoring.alerts.missingData.fullAction', { - defaultMessage: 'View what monitoring data we do have for these nodes.', - }); + const shortActionText = i18n.translate('xpack.monitoring.alerts.missingData.shortAction', { + defaultMessage: + 'Verify the node is up and running, then double check the monitoring settings.', + }); + const fullActionText = i18n.translate('xpack.monitoring.alerts.missingData.fullAction', { + defaultMessage: 'View what monitoring data we do have for this node.', + }); - const ccs = alertStates.find((state) => state.ccs)?.ccs; - const globalStateLink = this.createGlobalStateLink('overview', cluster.clusterUuid, ccs); - const action = `[${fullActionText}](${globalStateLink})`; - const internalShortMessage = i18n.translate( - 'xpack.monitoring.alerts.missingData.firing.internalShortMessage', - { - defaultMessage: `We have not detected any monitoring data for {count} node(s) in cluster: {clusterName}. {shortActionText}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - shortActionText, - }, - } - ); - const internalFullMessage = i18n.translate( - 'xpack.monitoring.alerts.missingData.firing.internalFullMessage', - { - defaultMessage: `We have not detected any monitoring data for {count} node(s) in cluster: {clusterName}. {action}`, - values: { - count: firingCount, - clusterName: cluster.clusterName, - action, - }, - } - ); - instance.scheduleActions('default', { - internalShortMessage, - internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, - state: AlertingDefaults.ALERT_STATE.firing, - nodes: firingNodes.map((state) => `node: ${state.nodeName}`).toString(), - count: firingCount, - clusterName: cluster.clusterName, - action, - actionPlain: shortActionText, - }); - } + const ccs = alertStates.find((state) => state.ccs)?.ccs; + const globalStateLink = this.createGlobalStateLink( + `elasticsearch/nodes/${firingNode.nodeId}`, + cluster.clusterUuid, + ccs + ); + const action = `[${fullActionText}](${globalStateLink})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.missingData.firing.internalShortMessage', + { + defaultMessage: `We have not detected any monitoring data for node {nodeName} in cluster: {clusterName}. {shortActionText}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + shortActionText, + }, + } + ); + const internalFullMessage = i18n.translate( + 'xpack.monitoring.alerts.missingData.firing.internalFullMessage', + { + defaultMessage: `We have not detected any monitoring data for node {nodeName} in cluster: {clusterName}. {action}`, + values: { + clusterName: cluster.clusterName, + nodeName: firingNode.nodeName, + action, + }, + } + ); + instance.scheduleActions('default', { + internalShortMessage, + internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + /* continue to send "nodes" and "count" values for users before https://github.com/elastic/kibana/pull/102544 + see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 + */ + nodes: `node: ${firingNode.nodeName}`, + count: 1, + node: `node: ${firingNode.nodeName}`, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }); } } diff --git a/x-pack/plugins/monitoring/server/alerts/nodes_changed_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/nodes_changed_alert.test.ts index fa97de364d7923..d628c1c30a7e1a 100644 --- a/x-pack/plugins/monitoring/server/alerts/nodes_changed_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/nodes_changed_alert.test.ts @@ -61,7 +61,7 @@ describe('NodesChangedAlert', () => { description: 'The full internal message generated by Elastic.', }, { name: 'state', description: 'The current state of the alert.' }, - { name: 'clusterName', description: 'The cluster to which the nodes belong.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, { name: 'action', description: 'The recommended action for this alert.' }, { name: 'actionPlain', @@ -81,7 +81,7 @@ describe('NodesChangedAlert', () => { const ccs = undefined; const clusterUuid = 'abc123'; const clusterName = 'testCluster'; - const nodes = [ + const nodesChanged = [ { recentNodes: [ { @@ -101,6 +101,36 @@ describe('NodesChangedAlert', () => { ccs, }, ]; + const nodesAddedChangedRemoved = [ + { + recentNodes: [ + { + nodeUuid, + nodeEphemeralId: nodeEphemeralIdChanged, + nodeName, + }, + { + nodeUuid: 'newNodeId', + nodeEphemeralId: 'newNodeEmpheralId', + nodeName: 'newNodeName', + }, + ], + priorNodes: [ + { + nodeUuid, + nodeEphemeralId, + nodeName, + }, + { + nodeUuid: 'removedNodeId', + nodeEphemeralId: 'removedNodeEmpheralId', + nodeName: 'removedNodeName', + }, + ], + clusterUuid, + ccs, + }, + ]; const replaceState = jest.fn(); const scheduleActions = jest.fn(); @@ -122,9 +152,6 @@ describe('NodesChangedAlert', () => { beforeEach(() => { // @ts-ignore Date = FakeDate; - (fetchNodesFromClusterStats as jest.Mock).mockImplementation(() => { - return nodes; - }); (fetchClusters as jest.Mock).mockImplementation(() => { return [{ clusterUuid, clusterName }]; }); @@ -137,7 +164,10 @@ describe('NodesChangedAlert', () => { getState.mockReset(); }); - it('should fire actions', async () => { + it('should fire actions when nodes change', async () => { + (fetchNodesFromClusterStats as jest.Mock).mockImplementation(() => { + return nodesChanged; + }); const alert = new NodesChangedAlert(); const type = alert.getAlertType(); await type.executor({ @@ -197,6 +227,80 @@ describe('NodesChangedAlert', () => { state: 'firing', }); }); + it('should fire actions when nodes added, changed, and removed', async () => { + (fetchNodesFromClusterStats as jest.Mock).mockImplementation(() => { + return nodesAddedChangedRemoved; + }); + const alert = new NodesChangedAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.alertOptions.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + cluster: { clusterUuid, clusterName }, + ccs, + itemLabel: undefined, + nodeId: undefined, + nodeName: undefined, + meta: { + ccs, + clusterUuid, + recentNodes: [ + { + nodeUuid, + nodeEphemeralId: nodeEphemeralIdChanged, + nodeName, + }, + { + nodeUuid: 'newNodeId', + nodeEphemeralId: 'newNodeEmpheralId', + nodeName: 'newNodeName', + }, + ], + priorNodes: [ + { + nodeUuid, + nodeEphemeralId, + nodeName, + }, + { + nodeUuid: 'removedNodeId', + nodeEphemeralId: 'removedNodeEmpheralId', + nodeName: 'removedNodeName', + }, + ], + }, + ui: { + isFiring: true, + message: { + text: + "Elasticsearch nodes 'newNodeName' added to this cluster. Elasticsearch nodes 'removedNodeName' removed from this cluster. Elasticsearch nodes 'test' restarted in this cluster.", + }, + severity: 'warning', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }); + expect(scheduleActions).toHaveBeenCalledWith('default', { + action: '[View nodes](elasticsearch/nodes)', + actionPlain: 'Verify that you added, removed, or restarted nodes.', + internalFullMessage: + 'Nodes changed alert is firing for testCluster. The following Elasticsearch nodes have been added:newNodeName removed:removedNodeName restarted:test. [View nodes](elasticsearch/nodes)', + internalShortMessage: + 'Nodes changed alert is firing for testCluster. Verify that you added, removed, or restarted nodes.', + added: 'newNodeName', + removed: 'removedNodeName', + restarted: 'test', + clusterName, + state: 'firing', + }); + }); it('should not fire actions if no nodes have changed', async () => { (fetchNodesFromClusterStats as jest.Mock).mockImplementation(() => { diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_alert_base.ts b/x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_alert_base.ts index bb91418fc20900..3b11d3464a2151 100644 --- a/x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_alert_base.ts +++ b/x-pack/plugins/monitoring/server/alerts/thread_pool_rejections_alert_base.ts @@ -17,6 +17,8 @@ import { AlertMessageLinkToken, ThreadPoolRejectionsAlertParams, CommonAlertFilter, + AlertState, + AlertThreadPoolRejectionsStats, } from '../../common/types/alerts'; import { AlertInstance } from '../../../alerting/server'; import { INDEX_PATTERN_ELASTICSEARCH } from '../../common/constants'; @@ -34,11 +36,11 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { protected static createActionVariables(type: string) { return [ { - name: 'count', + name: 'node', description: i18n.translate( - 'xpack.monitoring.alerts.threadPoolRejections.actionVariables.count', + 'xpack.monitoring.alerts.threadPoolRejections.actionVariables.node', { - defaultMessage: 'The number of nodes reporting high thread pool {type} rejections.', + defaultMessage: 'The node reporting high thread pool {type} rejections.', values: { type }, } ), @@ -88,11 +90,10 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { ); return stats.map((stat) => { - const { clusterUuid, rejectionCount, ccs } = stat; + const { clusterUuid, ccs } = stat; return { - shouldFire: rejectionCount > threshold, - rejectionCount, + shouldFire: stat.rejectionCount > threshold, severity: AlertSeverity.Danger, meta: stat, clusterUuid, @@ -105,14 +106,19 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { return super.filterAlertInstance(alertInstance, filters, true); } - protected getUiMessage(alertState: AlertThreadPoolRejectionsState): AlertMessage { - const { nodeName, nodeId, rejectionCount } = alertState; + protected getUiMessage(alertState: AlertState, item: AlertData): AlertMessage { + const { + nodeName, + nodeId, + type: threadPoolType, + rejectionCount, + } = item.meta as AlertThreadPoolRejectionsStats; return { text: i18n.translate('xpack.monitoring.alerts.threadPoolRejections.ui.firingMessage', { - defaultMessage: `Node #start_link{nodeName}#end_link is reporting {rejectionCount} {type} rejections at #absolute`, + defaultMessage: `Node #start_link{nodeName}#end_link is reporting {rejectionCount} {threadPoolType} rejections at #absolute`, values: { nodeName, - type: this.threadPoolType, + threadPoolType, rejectionCount, }, }), @@ -178,20 +184,28 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { ], }; } - protected executeActions( instance: AlertInstance, - alertStates: AlertThreadPoolRejectionsState[], + { alertStates }: { alertStates: AlertState[] }, + item: AlertData | null, cluster: AlertCluster ) { const type = this.threadPoolType; - const count = alertStates.length; const { clusterName: clusterKnownName, clusterUuid } = cluster; const clusterName = clusterKnownName || clusterUuid; + + if (alertStates.length === 0) { + return; + } + const firingNode = alertStates[0] as AlertThreadPoolRejectionsState; + const { nodeName, nodeId } = firingNode; + if (!firingNode || !firingNode.ui.isFiring) { + return; + } const shortActionText = i18n.translate( 'xpack.monitoring.alerts.threadPoolRejections.shortAction', { - defaultMessage: 'Verify thread pool {type} rejections across affected nodes.', + defaultMessage: 'Verify thread pool {type} rejections for the affected node.', values: { type, }, @@ -201,21 +215,25 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { const fullActionText = i18n.translate( 'xpack.monitoring.alerts.threadPoolRejections.fullAction', { - defaultMessage: 'View nodes', + defaultMessage: 'View node', } ); const ccs = alertStates.find((state) => state.ccs)?.ccs; - const globalStateLink = this.createGlobalStateLink('elasticsearch/nodes', clusterUuid, ccs); + const globalStateLink = this.createGlobalStateLink( + `elasticsearch/nodes/${nodeId}`, + cluster.clusterUuid, + ccs + ); const action = `[${fullActionText}](${globalStateLink})`; const internalShortMessage = i18n.translate( 'xpack.monitoring.alerts.threadPoolRejections.firing.internalShortMessage', { - defaultMessage: `Thread pool {type} rejections alert is firing for {count} node(s) in cluster: {clusterName}. {shortActionText}`, + defaultMessage: `Thread pool {type} rejections alert is firing for node {nodeName} in cluster: {clusterName}. {shortActionText}`, values: { - count, clusterName, + nodeName, shortActionText, type, }, @@ -224,10 +242,10 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { const internalFullMessage = i18n.translate( 'xpack.monitoring.alerts.threadPoolRejections.firing.internalFullMessage', { - defaultMessage: `Thread pool {type} rejections alert is firing for {count} node(s) in cluster: {clusterName}. {action}`, + defaultMessage: `Thread pool {type} rejections alert is firing for node {nodeName} in cluster: {clusterName}. {action}`, values: { - count, clusterName, + nodeName, action, type, }, @@ -239,7 +257,11 @@ export class ThreadPoolRejectionsAlertBase extends BaseAlert { internalFullMessage: Globals.app.isCloud ? internalShortMessage : internalFullMessage, threadPoolType: type, state: AlertingDefaults.ALERT_STATE.firing, - count, + /* continue to send "count" value for users before https://github.com/elastic/kibana/pull/102544 + see https://github.com/elastic/kibana/issues/100136#issuecomment-865229431 + */ + count: 1, + node: nodeName, clusterName, action, actionPlain: shortActionText, diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_alert.test.ts new file mode 100644 index 00000000000000..78f3e937016a40 --- /dev/null +++ b/x-pack/plugins/monitoring/server/alerts/thread_pool_search_rejections_alert.test.ts @@ -0,0 +1,298 @@ +/* + * 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 { ThreadPoolSearchRejectionsAlert } from './thread_pool_search_rejections_alert'; +import { ALERT_THREAD_POOL_SEARCH_REJECTIONS } from '../../common/constants'; +import { fetchThreadPoolRejectionStats } from '../lib/alerts/fetch_thread_pool_rejections_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { elasticsearchServiceMock } from 'src/core/server/mocks'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_thread_pool_rejections_stats', () => ({ + fetchThreadPoolRejectionStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + show_license_expiration: true, + ccs: { enabled: true }, + metricbeat: { index: 'metricbeat-*' }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('ThreadpoolSearchRejectionsAlert', () => { + it('should have defaults', () => { + const alert = new ThreadPoolSearchRejectionsAlert(); + expect(alert.alertOptions.id).toBe(ALERT_THREAD_POOL_SEARCH_REJECTIONS); + expect(alert.alertOptions.name).toBe('Thread pool search rejections'); + expect(alert.alertOptions.throttle).toBe('1d'); + expect(alert.alertOptions.defaultParams).toStrictEqual({ threshold: 300, duration: '5m' }); + expect(alert.alertOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high thread pool search rejections.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'esNode1'; + const nodeName = 'esName1'; + const threadPoolType = 'search'; + const rejectionCount = 400; + const stat = [ + { + rejectionCount, + type: threadPoolType, + clusterUuid, + nodeId, + nodeName, + ccs: null, + }, + ]; + + const replaceState = jest.fn(); + const scheduleActions = jest.fn(); + const getState = jest.fn(); + const executorOptions = { + services: { + scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), + alertInstanceFactory: jest.fn().mockImplementation(() => { + return { + replaceState, + scheduleActions, + getState, + }; + }), + }, + state: {}, + }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return stat; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + replaceState.mockReset(); + scheduleActions.mockReset(); + getState.mockReset(); + }); + + it('should fire actions', async () => { + const alert = new ThreadPoolSearchRejectionsAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + params: alert.alertOptions.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + ccs: null, + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + itemLabel: undefined, + meta: { + rejectionCount, + clusterUuid, + type: threadPoolType, + nodeId, + nodeName, + ccs: null, + }, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, + nextSteps: [ + { + text: '#start_linkMonitor this node#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/esNode1/advanced', + }, + ], + }, + { + text: '#start_linkOptimize complex queries#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', + }, + ], + }, + { + text: '#start_linkAdd more nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + { + text: '#start_linkThread pool settings#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: `elasticsearch/nodes/${nodeId}`, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }); + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count: 1, + threadPoolType, + state: 'firing', + }); + }); + it('should not fire actions if under threshold', async () => { + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + rejectionCount: 1, + }, + ]; + }); + const alert = new ThreadPoolSearchRejectionsAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.alertOptions.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [], + }); + expect(scheduleActions).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + ccs, + }, + ]; + }); + const alert = new ThreadPoolSearchRejectionsAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.alertOptions.defaultParams, + } as any); + const count = 1; + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Thread pool search rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/esNode1?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count, + state: 'firing', + threadPoolType, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_alert.test.ts new file mode 100644 index 00000000000000..83ba6fc7532a32 --- /dev/null +++ b/x-pack/plugins/monitoring/server/alerts/thread_pool_write_rejections_alert.test.ts @@ -0,0 +1,298 @@ +/* + * 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 { ThreadPoolWriteRejectionsAlert } from './thread_pool_write_rejections_alert'; +import { ALERT_THREAD_POOL_WRITE_REJECTIONS } from '../../common/constants'; +import { fetchThreadPoolRejectionStats } from '../lib/alerts/fetch_thread_pool_rejections_stats'; +import { fetchClusters } from '../lib/alerts/fetch_clusters'; +import { elasticsearchServiceMock } from 'src/core/server/mocks'; + +const RealDate = Date; + +jest.mock('../lib/alerts/fetch_thread_pool_rejections_stats', () => ({ + fetchThreadPoolRejectionStats: jest.fn(), +})); +jest.mock('../lib/alerts/fetch_clusters', () => ({ + fetchClusters: jest.fn(), +})); + +jest.mock('../static_globals', () => ({ + Globals: { + app: { + getLogger: () => ({ debug: jest.fn() }), + url: 'http://localhost:5601', + config: { + ui: { + show_license_expiration: true, + ccs: { enabled: true }, + metricbeat: { index: 'metricbeat-*' }, + container: { elasticsearch: { enabled: false } }, + }, + }, + }, + }, +})); + +describe('ThreadpoolWriteRejectionsAlert', () => { + it('should have defaults', () => { + const alert = new ThreadPoolWriteRejectionsAlert(); + expect(alert.alertOptions.id).toBe(ALERT_THREAD_POOL_WRITE_REJECTIONS); + expect(alert.alertOptions.name).toBe(`Thread pool write rejections`); + expect(alert.alertOptions.throttle).toBe('1d'); + expect(alert.alertOptions.defaultParams).toStrictEqual({ threshold: 300, duration: '5m' }); + expect(alert.alertOptions.actionVariables).toStrictEqual([ + { name: 'node', description: 'The node reporting high thread pool write rejections.' }, + { + name: 'internalShortMessage', + description: 'The short internal message generated by Elastic.', + }, + { + name: 'internalFullMessage', + description: 'The full internal message generated by Elastic.', + }, + { name: 'state', description: 'The current state of the alert.' }, + { name: 'clusterName', description: 'The cluster to which the node(s) belongs.' }, + { name: 'action', description: 'The recommended action for this alert.' }, + { + name: 'actionPlain', + description: 'The recommended action for this alert, without any markdown.', + }, + ]); + }); + describe('execute', () => { + function FakeDate() {} + FakeDate.prototype.valueOf = () => 1; + + const clusterUuid = 'abc123'; + const clusterName = 'testCluster'; + const nodeId = 'esNode1'; + const nodeName = 'esName1'; + const threadPoolType = 'write'; + const rejectionCount = 400; + const stat = [ + { + rejectionCount, + type: threadPoolType, + clusterUuid, + nodeId, + nodeName, + ccs: null, + }, + ]; + + const replaceState = jest.fn(); + const scheduleActions = jest.fn(); + const getState = jest.fn(); + const executorOptions = { + services: { + scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), + alertInstanceFactory: jest.fn().mockImplementation(() => { + return { + replaceState, + scheduleActions, + getState, + }; + }), + }, + state: {}, + }; + + beforeEach(() => { + // @ts-ignore + Date = FakeDate; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return stat; + }); + (fetchClusters as jest.Mock).mockImplementation(() => { + return [{ clusterUuid, clusterName }]; + }); + }); + + afterEach(() => { + Date = RealDate; + replaceState.mockReset(); + scheduleActions.mockReset(); + getState.mockReset(); + }); + + it('should fire actions', async () => { + const alert = new ThreadPoolWriteRejectionsAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + params: alert.alertOptions.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [ + { + ccs: null, + cluster: { clusterUuid, clusterName }, + nodeId, + nodeName, + itemLabel: undefined, + meta: { + rejectionCount, + clusterUuid, + type: threadPoolType, + nodeId, + nodeName, + ccs: null, + }, + ui: { + isFiring: true, + message: { + text: `Node #start_link${nodeName}#end_link is reporting ${rejectionCount} ${threadPoolType} rejections at #absolute`, + nextSteps: [ + { + text: '#start_linkMonitor this node#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: 'elasticsearch/nodes/esNode1/advanced', + }, + ], + }, + { + text: '#start_linkOptimize complex queries#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}blog/advanced-tuning-finding-and-fixing-slow-elasticsearch-queries', + }, + ], + }, + { + text: '#start_linkAdd more nodes#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html', + }, + ], + }, + { + text: '#start_linkResize your deployment (ECE)#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html', + }, + ], + }, + { + text: '#start_linkThread pool settings#end_link', + tokens: [ + { + startToken: '#start_link', + endToken: '#end_link', + type: 'docLink', + partialUrl: + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html', + }, + ], + }, + ], + tokens: [ + { + startToken: '#absolute', + type: 'time', + isAbsolute: true, + isRelative: false, + timestamp: 1, + }, + { + startToken: '#start_link', + endToken: '#end_link', + type: 'link', + url: `elasticsearch/nodes/${nodeId}`, + }, + ], + }, + severity: 'danger', + triggeredMS: 1, + lastCheckedMS: 0, + }, + }, + ], + }); + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + internalShortMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid}))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count: 1, + threadPoolType, + state: 'firing', + }); + }); + it('should not fire actions if under threshold', async () => { + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + rejectionCount: 1, + }, + ]; + }); + const alert = new ThreadPoolWriteRejectionsAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.alertOptions.defaultParams, + } as any); + expect(replaceState).toHaveBeenCalledWith({ + alertStates: [], + }); + expect(scheduleActions).not.toHaveBeenCalled(); + }); + + it('should handle ccs', async () => { + const ccs = 'testCluster'; + (fetchThreadPoolRejectionStats as jest.Mock).mockImplementation(() => { + return [ + { + ...stat[0], + ccs, + }, + ]; + }); + const alert = new ThreadPoolWriteRejectionsAlert(); + const type = alert.getAlertType(); + await type.executor({ + ...executorOptions, + // @ts-ignore + params: alert.alertOptions.defaultParams, + } as any); + const count = 1; + expect(scheduleActions).toHaveBeenCalledWith('default', { + internalFullMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. [View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/${nodeId}?_g=(cluster_uuid:${clusterUuid},ccs:${ccs}))`, + internalShortMessage: `Thread pool ${threadPoolType} rejections alert is firing for node ${nodeName} in cluster: ${clusterName}. Verify thread pool ${threadPoolType} rejections for the affected node.`, + node: `${nodeName}`, + action: `[View node](http://localhost:5601/app/monitoring#/elasticsearch/nodes/esNode1?_g=(cluster_uuid:abc123,ccs:testCluster))`, + actionPlain: `Verify thread pool ${threadPoolType} rejections for the affected node.`, + clusterName, + count, + state: 'firing', + threadPoolType, + }); + }); + }); +}); diff --git a/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts b/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts index 620f32014dae6e..a7b24571307446 100644 --- a/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts +++ b/x-pack/plugins/monitoring/server/lib/alerts/fetch_status.ts @@ -49,7 +49,9 @@ export async function fetchStatus( if (!states) { return result; } - + // puts all alert states associated with this rule into a flat array. this works with both the legacy alert + // of having multiple alert states per alert, each representing a firing node, and the current alert where each firing + // node is an alert with a single alert state, the node itself. https://github.com/elastic/kibana/pull/102544 result.states = Object.values(states).reduce((accum: CommonAlertState[], instance: any) => { const alertInstanceState = instance.state as AlertInstanceState; if (!alertInstanceState.alertStates) { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c76a762d962275..3e66830e8fc579 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -15712,11 +15712,7 @@ "xpack.monitoring.alerts.clusterHealth.ui.firingMessage": "Elasticsearchクラスターの正常性は{health}です。", "xpack.monitoring.alerts.clusterHealth.ui.nextSteps.message1": "{message}. #start_linkView now#end_link", "xpack.monitoring.alerts.clusterHealth.yellowMessage": "見つからないレプリカシャードを割り当て", - "xpack.monitoring.alerts.cpuUsage.actionVariables.count": "高CPU使用率を報告しているノード数。", - "xpack.monitoring.alerts.cpuUsage.actionVariables.nodes": "高 CPU 使用率を報告しているノードのリスト。", "xpack.monitoring.alerts.cpuUsage.description": "ノードの CPU 負荷が常に高いときにアラートを発行します。", - "xpack.monitoring.alerts.cpuUsage.firing.internalFullMessage": "CPU 使用状況アラートは、クラスター {clusterName} の {count} 個のノードで実行されています。{action}", - "xpack.monitoring.alerts.cpuUsage.firing.internalShortMessage": "CPU使用状況アラートは、クラスター{clusterName}の{count}個のノードで実行されています。{shortActionText}", "xpack.monitoring.alerts.cpuUsage.fullAction": "ノードの表示", "xpack.monitoring.alerts.cpuUsage.label": "CPU使用状況", "xpack.monitoring.alerts.cpuUsage.paramDetails.duration.label": "平均を確認", @@ -15725,11 +15721,7 @@ "xpack.monitoring.alerts.cpuUsage.ui.firingMessage": "ノード#start_link{nodeName}#end_linkは、#absoluteでCPU使用率{cpuUsage}%を報告しています", "xpack.monitoring.alerts.cpuUsage.ui.nextSteps.hotThreads": "#start_linkCheck hot threads#end_link", "xpack.monitoring.alerts.cpuUsage.ui.nextSteps.runningTasks": "#start_linkCheck long running tasks#end_link", - "xpack.monitoring.alerts.diskUsage.actionVariables.count": "高ディスク使用率を報告しているノード数。", - "xpack.monitoring.alerts.diskUsage.actionVariables.nodes": "高ディスク使用率を報告しているノードのリスト。", "xpack.monitoring.alerts.diskUsage.description": "ノードのディスク使用率が常に高いときにアラートを発行します。", - "xpack.monitoring.alerts.diskUsage.firing.internalFullMessage": "ディスク使用状況アラートは、クラスター {clusterName} の {count} 個のノードで実行されています。{action}", - "xpack.monitoring.alerts.diskUsage.firing.internalShortMessage": "ディスク使用状況アラートは、クラスター{clusterName}の{count}個のノードで実行されています。{shortActionText}", "xpack.monitoring.alerts.diskUsage.fullAction": "ノードの表示", "xpack.monitoring.alerts.diskUsage.label": "ディスク使用量", "xpack.monitoring.alerts.diskUsage.paramDetails.duration.label": "平均を確認", @@ -15775,11 +15767,7 @@ "xpack.monitoring.alerts.logstashVersionMismatch.label": "Logstash バージョン不一致", "xpack.monitoring.alerts.logstashVersionMismatch.shortAction": "すべてのノードのバージョンが同じことを確認してください。", "xpack.monitoring.alerts.logstashVersionMismatch.ui.firingMessage": "このクラスターでは、複数のバージョンの Logstash ({versions}) が実行されています。", - "xpack.monitoring.alerts.memoryUsage.actionVariables.count": "高メモリー使用率を報告しているノード数。", - "xpack.monitoring.alerts.memoryUsage.actionVariables.nodes": "高メモリー使用率を報告しているノードのリスト。", "xpack.monitoring.alerts.memoryUsage.description": "ノードが高いメモリ使用率を報告するときにアラートを発行します。", - "xpack.monitoring.alerts.memoryUsage.firing.internalFullMessage": "メモリー使用状況アラートは、クラスター {clusterName} の {count} 個のノードで実行されています。{action}", - "xpack.monitoring.alerts.memoryUsage.firing.internalShortMessage": "メモリー使用状況アラートは、クラスター{clusterName}の{count}個のノードで実行されています。{shortActionText}", "xpack.monitoring.alerts.memoryUsage.fullAction": "ノードの表示", "xpack.monitoring.alerts.memoryUsage.label": "メモリー使用状況 (JVM) ", "xpack.monitoring.alerts.memoryUsage.paramDetails.duration.label": "平均を確認", @@ -15792,11 +15780,7 @@ "xpack.monitoring.alerts.memoryUsage.ui.nextSteps.resizeYourDeployment": "#start_linkデプロイのサイズを変更 (ECE) #end_link", "xpack.monitoring.alerts.memoryUsage.ui.nextSteps.tuneThreadPools": "#start_linkスレッドプールの微調整#end_link", "xpack.monitoring.alerts.migrate.manageAction.requiredFieldError": "{field} は必須フィールドです。", - "xpack.monitoring.alerts.missingData.actionVariables.count": "監視データが見つからないノード数。", - "xpack.monitoring.alerts.missingData.actionVariables.nodes": "監視データが見つからないノードのリスト。", "xpack.monitoring.alerts.missingData.description": "監視データが見つからない場合にアラートを発行します。", - "xpack.monitoring.alerts.missingData.firing.internalFullMessage": "クラスター {clusterName} では、{count} 個のノードの監視データが検出されませんでした。{action}", - "xpack.monitoring.alerts.missingData.firing.internalShortMessage": "クラスター {clusterName} では、{count} 個のノードの監視データが検出されませんでした。{shortActionText}", "xpack.monitoring.alerts.missingData.fullAction": "これらのノードに関連する監視データを表示します。", "xpack.monitoring.alerts.missingData.label": "見つからない監視データ", "xpack.monitoring.alerts.missingData.paramDetails.duration.label": "最後の監視データが見つからない場合に通知", @@ -15828,8 +15812,6 @@ "xpack.monitoring.alerts.searchThreadPoolRejections.description": "検索スレッドプールの拒否数がしきい値を超過するときにアラートを発行します。", "xpack.monitoring.alerts.shardSize.actionVariables.shardIndex": "大きい平均シャードサイズが発生しているインデックスのリスト。", "xpack.monitoring.alerts.shardSize.description": "平均シャードサイズが構成されたしきい値よりも大きい場合にアラートが発生します。", - "xpack.monitoring.alerts.shardSize.firing.internalFullMessage": "次のインデックスに対して大きいシャードサイズのアラートが発行されています。{shardIndices}。{action}", - "xpack.monitoring.alerts.shardSize.firing.internalShortMessage": "次のインデックスに対して大きいシャードサイズのアラートが発行されています。{shardIndices}。{shortActionText}", "xpack.monitoring.alerts.shardSize.fullAction": "インデックスシャードサイズ統計情報を表示", "xpack.monitoring.alerts.shardSize.label": "シャードサイズ", "xpack.monitoring.alerts.shardSize.paramDetails.indexPattern.label": "次のインデックスパターンを確認", @@ -15846,13 +15828,9 @@ "xpack.monitoring.alerts.status.highSeverityTooltip": "すぐに対処が必要な致命的な問題があります!", "xpack.monitoring.alerts.status.lowSeverityTooltip": "低重要度の問題があります。", "xpack.monitoring.alerts.status.mediumSeverityTooltip": "スタックに影響を及ぼす可能性がある問題があります。", - "xpack.monitoring.alerts.threadPoolRejections.actionVariables.count": "高いスレッドプール {type} 拒否を報告するノード数。", - "xpack.monitoring.alerts.threadPoolRejections.firing.internalFullMessage": "スレッドプール {type} 拒否アラートは、クラスター {clusterName} の {count} 個のノードで実行されています。{action}", - "xpack.monitoring.alerts.threadPoolRejections.firing.internalShortMessage": "スレッドプール {type} 拒否アラートは、クラスター {clusterName} の {count} 個のノードで実行されています。{shortActionText}", "xpack.monitoring.alerts.threadPoolRejections.fullAction": "ノードの表示", "xpack.monitoring.alerts.threadPoolRejections.label": "スレッドプール {type} 拒否", "xpack.monitoring.alerts.threadPoolRejections.shortAction": "影響を受けるノード全体でスレッドプール {type} 拒否を検証します。", - "xpack.monitoring.alerts.threadPoolRejections.ui.firingMessage": "ノード #start_link{nodeName}#end_link は、#absolute で {rejectionCount} {type} 拒否を報告しています", "xpack.monitoring.alerts.threadPoolRejections.ui.nextSteps.addMoreNodes": "#start_linkAdd more nodes#end_link", "xpack.monitoring.alerts.threadPoolRejections.ui.nextSteps.monitorThisNode": "#start_linkMonitor this node#end_link", "xpack.monitoring.alerts.threadPoolRejections.ui.nextSteps.optimizeQueries": "#start_linkOptimize complex queries#end_link", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 16a63682facdec..72f13d2ec4b55b 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -15944,11 +15944,7 @@ "xpack.monitoring.alerts.clusterHealth.ui.firingMessage": "Elasticsearch 集群运行状况为 {health}。", "xpack.monitoring.alerts.clusterHealth.ui.nextSteps.message1": "{message}。#start_link立即查看#end_link", "xpack.monitoring.alerts.clusterHealth.yellowMessage": "分配缺失的副本分片", - "xpack.monitoring.alerts.cpuUsage.actionVariables.count": "报告高 CPU 使用率的节点数目。", - "xpack.monitoring.alerts.cpuUsage.actionVariables.nodes": "报告高 CPU 使用率的节点列表。", "xpack.monitoring.alerts.cpuUsage.description": "节点的 CPU 负载持续偏高时告警。", - "xpack.monitoring.alerts.cpuUsage.firing.internalFullMessage": "为集群 {clusterName} 中 {count} 个节点触发了 CPU 使用率告警。{action}", - "xpack.monitoring.alerts.cpuUsage.firing.internalShortMessage": "为集群 {clusterName} 中 {count} 个节点触发了 CPU 使用率告警。{shortActionText}", "xpack.monitoring.alerts.cpuUsage.fullAction": "查看节点", "xpack.monitoring.alerts.cpuUsage.label": "CPU 使用率", "xpack.monitoring.alerts.cpuUsage.paramDetails.duration.label": "查看以下期间的平均值:", @@ -15957,11 +15953,7 @@ "xpack.monitoring.alerts.cpuUsage.ui.firingMessage": "节点 #start_link{nodeName}#end_link 于 #absolute报告 cpu 使用率为 {cpuUsage}%", "xpack.monitoring.alerts.cpuUsage.ui.nextSteps.hotThreads": "#start_link检查热线程#end_link", "xpack.monitoring.alerts.cpuUsage.ui.nextSteps.runningTasks": "#start_link检查长时间运行的任务#end_link", - "xpack.monitoring.alerts.diskUsage.actionVariables.count": "报告高磁盘使用率的节点数目。", - "xpack.monitoring.alerts.diskUsage.actionVariables.nodes": "报告高磁盘使用率的节点列表。", "xpack.monitoring.alerts.diskUsage.description": "节点的磁盘使用率持续偏高时告警。", - "xpack.monitoring.alerts.diskUsage.firing.internalFullMessage": "为集群 {clusterName} 中的 {count} 个节点触发了磁盘使用率告警。{action}", - "xpack.monitoring.alerts.diskUsage.firing.internalShortMessage": "为集群 {clusterName} 中的 {count} 个节点触发了磁盘使用率告警。{shortActionText}", "xpack.monitoring.alerts.diskUsage.fullAction": "查看节点", "xpack.monitoring.alerts.diskUsage.label": "磁盘使用率", "xpack.monitoring.alerts.diskUsage.paramDetails.duration.label": "查看以下期间的平均值:", @@ -16011,11 +16003,7 @@ "xpack.monitoring.alerts.logstashVersionMismatch.label": "Logstash 版本不匹配", "xpack.monitoring.alerts.logstashVersionMismatch.shortAction": "确认所有节点具有相同的版本。", "xpack.monitoring.alerts.logstashVersionMismatch.ui.firingMessage": "在此集群中正运行着多个 Logstash 版本 ({versions})。", - "xpack.monitoring.alerts.memoryUsage.actionVariables.count": "报告高内存使用率的节点数目。", - "xpack.monitoring.alerts.memoryUsage.actionVariables.nodes": "报告高内存使用率的节点列表。", "xpack.monitoring.alerts.memoryUsage.description": "节点报告高的内存使用率时告警。", - "xpack.monitoring.alerts.memoryUsage.firing.internalFullMessage": "为集群 {clusterName} 中的 {count} 个节点触发了内存使用率告警。{action}", - "xpack.monitoring.alerts.memoryUsage.firing.internalShortMessage": "为集群 {clusterName} 中的 {count} 个节点触发了内存使用率告警。{shortActionText}", "xpack.monitoring.alerts.memoryUsage.fullAction": "查看节点", "xpack.monitoring.alerts.memoryUsage.label": "内存使用率 (JVM)", "xpack.monitoring.alerts.memoryUsage.paramDetails.duration.label": "查看以下期间的平均值:", @@ -16028,11 +16016,7 @@ "xpack.monitoring.alerts.memoryUsage.ui.nextSteps.resizeYourDeployment": "#start_link对您的部署进行大小调整 (ECE)#end_link", "xpack.monitoring.alerts.memoryUsage.ui.nextSteps.tuneThreadPools": "#start_link调整线程池#end_link", "xpack.monitoring.alerts.migrate.manageAction.requiredFieldError": "{field} 是必填字段。", - "xpack.monitoring.alerts.missingData.actionVariables.count": "缺少监测数据的节点数量。", - "xpack.monitoring.alerts.missingData.actionVariables.nodes": "缺少监测数据的节点列表。", "xpack.monitoring.alerts.missingData.description": "监测数据缺失时告警。", - "xpack.monitoring.alerts.missingData.firing.internalFullMessage": "我们尚未检测到集群 {clusterName} 中 {count} 个节点的任何监测数据。{action}", - "xpack.monitoring.alerts.missingData.firing.internalShortMessage": "我们尚未检测到集群 {clusterName} 中 {count} 个节点的任何监测数据。{shortActionText}", "xpack.monitoring.alerts.missingData.fullAction": "查看我们拥有这些节点的哪些监测数据。", "xpack.monitoring.alerts.missingData.label": "缺少监测数据", "xpack.monitoring.alerts.missingData.paramDetails.duration.label": "缺少以下过去持续时间的监测数据时通知:", @@ -16064,8 +16048,6 @@ "xpack.monitoring.alerts.searchThreadPoolRejections.description": "当搜索线程池中的拒绝数目超过阈值时告警。", "xpack.monitoring.alerts.shardSize.actionVariables.shardIndex": "平均分片大小过大的索引列表。", "xpack.monitoring.alerts.shardSize.description": "平均分片大小大于配置的阈值时告警。", - "xpack.monitoring.alerts.shardSize.firing.internalFullMessage": "以下索引触发分片大小过大告警:{shardIndices}。{action}", - "xpack.monitoring.alerts.shardSize.firing.internalShortMessage": "以下索引触发分片大小过大告警:{shardIndices}。{shortActionText}", "xpack.monitoring.alerts.shardSize.fullAction": "查看索引分片大小统计", "xpack.monitoring.alerts.shardSize.label": "分片大小", "xpack.monitoring.alerts.shardSize.paramDetails.indexPattern.label": "检查以下索引模式", @@ -16082,13 +16064,9 @@ "xpack.monitoring.alerts.status.highSeverityTooltip": "有一些紧急问题需要您立即关注!", "xpack.monitoring.alerts.status.lowSeverityTooltip": "存在一些低紧急问题。", "xpack.monitoring.alerts.status.mediumSeverityTooltip": "有一些问题可能会影响堆栈。", - "xpack.monitoring.alerts.threadPoolRejections.actionVariables.count": "报告高线程池 {type} 拒绝的节点数量。", - "xpack.monitoring.alerts.threadPoolRejections.firing.internalFullMessage": "为集群 {clusterName} 中的 {count} 个节点触发了线程池 {type} 拒绝告警。{action}", - "xpack.monitoring.alerts.threadPoolRejections.firing.internalShortMessage": "为集群 {clusterName} 中的 {count} 个节点触发了线程池 {type} 拒绝告警。{shortActionText}", "xpack.monitoring.alerts.threadPoolRejections.fullAction": "查看节点", "xpack.monitoring.alerts.threadPoolRejections.label": "线程池 {type} 拒绝", "xpack.monitoring.alerts.threadPoolRejections.shortAction": "验证受影响节点的线程池 {type} 拒绝。", - "xpack.monitoring.alerts.threadPoolRejections.ui.firingMessage": "节点 #start_link{nodeName}#end_link 在 #absolute报告了 {rejectionCount} 个 {type} 拒绝", "xpack.monitoring.alerts.threadPoolRejections.ui.nextSteps.addMoreNodes": "#start_link添加更多节点#end_link", "xpack.monitoring.alerts.threadPoolRejections.ui.nextSteps.monitorThisNode": "#start_link监测此节点#end_link", "xpack.monitoring.alerts.threadPoolRejections.ui.nextSteps.optimizeQueries": "#start_link优化复杂查询#end_link", diff --git a/x-pack/test/functional/apps/infra/metrics_anomalies.ts b/x-pack/test/functional/apps/infra/metrics_anomalies.ts index 5b481abae48d74..a1619467fe6bb4 100644 --- a/x-pack/test/functional/apps/infra/metrics_anomalies.ts +++ b/x-pack/test/functional/apps/infra/metrics_anomalies.ts @@ -15,7 +15,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'infraHome']); const infraSourceConfigurationForm = getService('infraSourceConfigurationForm'); - // Failing: See https://github.com/elastic/kibana/issues/100445 describe('Metrics UI Anomaly Flyout', function () { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/empty_kibana'); From 662d8a61598956c50219eb2c850ddd87a7326fdc Mon Sep 17 00:00:00 2001 From: Byron Hulcher Date: Tue, 29 Jun 2021 13:07:33 -0400 Subject: [PATCH 108/227] [App Search] Updated copy for Precision Slider step descriptions (#103684) * Update precision slider description copy * Fixed a broken (but passing) test --- .../components/precision_slider/constants.ts | 31 ++++++++++++------- .../precision_slider.test.tsx | 8 +++-- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/constants.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/constants.ts index 194fbfa6d11ac6..1d6749193e29a5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/constants.ts @@ -10,42 +10,47 @@ import { i18n } from '@kbn/i18n'; const STEP_01_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step01.description', { - defaultMessage: 'Lowest precision and highest recall setting.', + defaultMessage: 'Highest recall, lowest precision setting.', } ); const STEP_02_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step02.description', { - defaultMessage: 'Default. High recall, low precision.', + defaultMessage: + 'Default: Less than half of the terms have to match. Full typo tolerance is applied.', } ); const STEP_03_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step03.description', { - defaultMessage: 'Increasing phrase matching: half the terms.', + defaultMessage: + 'Increased term requirements: To match, documents must contain all terms for queries with up to 2 terms, then half if there are more. Full typo tolerance is applied.', } ); const STEP_04_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step04.description', { - defaultMessage: 'Increasing phrase matching: three-quarters of the terms.', + defaultMessage: + 'Increased term requirements: To match, documents must contain all terms for queries with up to 3 terms, then three-quarters if there are more. Full typo tolerance is applied.', } ); const STEP_05_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step05.description', { - defaultMessage: 'Increasing phrase matching requirements: all but one of the terms.', + defaultMessage: + ' Increased term requirements: To match, documents must contain all terms for queries with up to 4 terms, then all but one if there are more. Full typo tolerance is applied.', } ); const STEP_06_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step06.description', { - defaultMessage: 'All terms must match.', + defaultMessage: + 'Increased term requirements: To match, documents must contain all terms for any query. Full typo tolerance is applied.', } ); @@ -53,35 +58,39 @@ const STEP_07_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step07.description', { defaultMessage: - 'The strictest phrase matching requirement: all terms must match, and in the same field.', + 'Strictest term requirements: To match, documents must contain all terms in the same field. Full typo tolerance is applied.', } ); const STEP_08_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step08.description', { - defaultMessage: 'Decreasing typo tolerance: advanced typo tolerance is disabled.', + defaultMessage: + 'Strictest term requirements: To match, documents must contain all terms in the same field. Partial typo tolerance is applied: fuzzy matching is disabled.', } ); const STEP_09_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step09.description', { - defaultMessage: 'Decreasing term matching: prefixing is disabled.', + defaultMessage: + 'Strictest term requirements: To match, documents must contain all terms in the same field. Partial typo tolerance is applied: fuzzy matching and prefixing are disabled.', } ); const STEP_10_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step10.description', { - defaultMessage: 'Decreasing typo-tolerance: no compound-word correction.', + defaultMessage: + 'Strictest term requirements: To match, documents must contain all terms in the same field. Partial typo tolerance is applied: in addition to the above, contractions and hyphenations are not corrected.', } ); const STEP_11_DESCRIPTION = i18n.translate( 'xpack.enterpriseSearch.appSearch.engine.relevanceTuning.precisionSlider.step11.description', { - defaultMessage: 'Exact spelling matches only.', + defaultMessage: + 'Only exact matches will apply, with tolerance only for differences in capitalization.', } ); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx index d7d06333517ff7..7b041e885dfefe 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/components/precision_slider/precision_slider.test.tsx @@ -13,6 +13,7 @@ import { shallow, ShallowWrapper } from 'enzyme'; import { rerender } from '../../../../../test_helpers'; +import { STEP_DESCRIPTIONS } from './constants'; import { PrecisionSlider } from './precision_slider'; const MOCK_VALUES = { @@ -59,11 +60,14 @@ describe('PrecisionSlider', () => { describe('Step Description', () => { it('is visible when there is a step description', () => { - setMockValues({ ...MOCK_VALUES, precision: 10 }); + setMockValues({ + ...MOCK_VALUES, + searchSettings: { ...MOCK_VALUES.searchSettings, precision: 10 }, + }); rerender(wrapper); expect(wrapper.find('[data-test-subj="StepDescription"]').render().text()).toEqual( - 'Default. High recall, low precision.' + STEP_DESCRIPTIONS[10] ); }); From cd9b42bfb21e9716273000dc009cd4c7a4a1a84f Mon Sep 17 00:00:00 2001 From: John Dorlus Date: Tue, 29 Jun 2021 13:24:48 -0400 Subject: [PATCH 109/227] Added test for the date processor. (#103415) * Added test for the date processor. * Fixed nits per PR comments. * Fixed failure from removing a data test subject in the helpers file. --- .../__jest__/processors/date.test.tsx | 127 ++++++++++++++++++ .../__jest__/processors/processor.helpers.tsx | 5 +- .../processor_form/processors/date.tsx | 21 ++- 3 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx new file mode 100644 index 00000000000000..555ed7a09fe4f8 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx @@ -0,0 +1,127 @@ +/* + * 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 { act } from 'react-dom/test-utils'; +import { setup, SetupResult, getProcessorValue } from './processor.helpers'; + +const DATE_TYPE = 'date'; + +describe('Processor: Date', () => { + let onUpdate: jest.Mock; + let testBed: SetupResult; + + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + beforeEach(async () => { + onUpdate = jest.fn(); + + await act(async () => { + testBed = await setup({ + value: { + processors: [], + }, + onFlyoutOpen: jest.fn(), + onUpdate, + }); + }); + testBed.component.update(); + const { + actions: { addProcessor, addProcessorType }, + } = testBed; + // Open the processor flyout + addProcessor(); + + // Add type (the other fields are not visible until a type is selected) + await addProcessorType(DATE_TYPE); + }); + + test('prevents form submission when field and format fields are not provided', async () => { + const { + actions: { saveNewProcessor }, + form, + } = testBed; + + // Click submit button with only the type defined + await saveNewProcessor(); + + // Expect form error as "field" and "value" are required parameters + expect(form.getErrorsMessages()).toEqual([ + 'A field value is required.', + 'A value for formats is required.', + ]); + }); + + test('saves with required field and formats parameter values', async () => { + const { + actions: { saveNewProcessor }, + form, + find, + component, + } = testBed; + + // Add "field" value (required) + form.setInputValue('fieldNameField.input', 'field_1'); + + await act(async () => { + find('formatsValueField.input').simulate('change', [{ label: 'ISO8601' }]); + }); + component.update(); + + // Save the field + await saveNewProcessor(); + + const processors = getProcessorValue(onUpdate, DATE_TYPE); + expect(processors[0].date).toEqual({ + field: 'field_1', + formats: ['ISO8601'], + }); + }); + + test('allows optional parameters to be set', async () => { + const { + actions: { saveNewProcessor }, + form, + find, + component, + } = testBed; + + form.setInputValue('fieldNameField.input', 'field_1'); + + // Set optional parameteres + await act(async () => { + find('formatsValueField.input').simulate('change', [{ label: 'ISO8601' }]); + }); + component.update(); + + // Set target field + form.setInputValue('targetField.input', 'target_field'); + + // Set locale field + form.setInputValue('localeField.input', 'SPANISH'); + + // Set timezone field. + form.setInputValue('timezoneField.input', 'EST'); + + // Save the field with new changes + await saveNewProcessor(); + + const processors = getProcessorValue(onUpdate, DATE_TYPE); + expect(processors[0].date).toEqual({ + field: 'field_1', + formats: ['ISO8601'], + target_field: 'target_field', + locale: 'SPANISH', + timezone: 'EST', + }); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx index 5f6ace20694104..78bc261aed7df0 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx @@ -138,6 +138,9 @@ type TestSubject = | 'addProcessorButton' | 'addProcessorForm.submitButton' | 'appendValueField.input' + | 'formatsValueField.input' + | 'timezoneField.input' + | 'localeField.input' | 'processorTypeSelector.input' | 'fieldNameField.input' | 'messageField.input' @@ -148,9 +151,9 @@ type TestSubject = | 'ignoreFailureSwitch.input' | 'ifField.textarea' | 'targetField.input' + | 'targetFieldsField.input' | 'keepOriginalField.input' | 'removeIfSuccessfulField.input' - | 'targetFieldsField.input' | 'shapeSelectorField' | 'errorDistanceField.input' | 'separatorValueField.input' diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx index ca541a9e6d6195..b1e42d067e56e2 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx @@ -94,7 +94,12 @@ export const DateProcessor: FunctionComponent = () => { )} /> - + { } /> - + - + ); }; From 7ec04e158b672552ce48b99ae99e1864ce0bfaa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= Date: Tue, 29 Jun 2021 19:29:13 +0200 Subject: [PATCH 110/227] [Security Solution] Use Router component prop to render subcomponents and enforce componentDidMount and componentDidUnmount on each render (#103686) --- .../public/management/pages/index.tsx | 34 ++++++++++++++++--- .../public/management/routes.tsx | 11 +++--- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/index.tsx b/x-pack/plugins/security_solution/public/management/pages/index.tsx index b3bee78161f392..327dcd4458eeb8 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.tsx @@ -16,6 +16,7 @@ import { MANAGEMENT_ROUTING_TRUSTED_APPS_PATH, } from '../common/constants'; import { NotFoundPage } from '../../app/404'; +import { TrackApplicationView } from '../../../../../../src/plugins/usage_collection/public'; import { EndpointsContainer } from './endpoint_hosts'; import { PolicyContainer } from './policy'; import { TrustedAppsContainer } from './trusted_apps'; @@ -54,6 +55,30 @@ const NoPermissions = memo(() => { }); NoPermissions.displayName = 'NoPermissions'; +const EndpointTelemetry = () => ( + + + +); + +const PolicyTelemetry = () => ( + + + +); + +const TrustedAppTelemetry = () => ( + + + +); + +const EventFilterTelemetry = () => ( + + + +); + export const ManagementContainer = memo(() => { const { allEnabled: isIngestEnabled } = useIngestEnabledCheck(); @@ -63,11 +88,10 @@ export const ManagementContainer = memo(() => { return ( - - - - - + + + + diff --git a/x-pack/plugins/security_solution/public/management/routes.tsx b/x-pack/plugins/security_solution/public/management/routes.tsx index bbc165d51a46ca..b93d9592ab1940 100644 --- a/x-pack/plugins/security_solution/public/management/routes.tsx +++ b/x-pack/plugins/security_solution/public/management/routes.tsx @@ -6,8 +6,7 @@ */ import React from 'react'; -import { TrackApplicationView } from '../../../../../src/plugins/usage_collection/public'; -import { MANAGEMENT_PATH, SecurityPageName } from '../../common/constants'; +import { MANAGEMENT_PATH } from '../../common/constants'; import { ManagementContainer } from './pages'; import { SecuritySubPluginRoutes } from '../app/types'; import { CurrentLicense } from '../common/components/current_license'; @@ -16,11 +15,9 @@ import { CurrentLicense } from '../common/components/current_license'; * Returns the React Router Routes for the management area */ const ManagementRoutes = () => ( - - - - - + + + ); export const routes: SecuritySubPluginRoutes = [ From de1979570bd5f78255d28efaf743180d96f39172 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 29 Jun 2021 20:57:57 +0300 Subject: [PATCH 111/227] [Telemetry] track and warn event loop delays thresholds (#103615) --- .../collectors/event_loop_delays/constants.ts | 20 ++++ .../event_loop_delays.mocks.ts | 1 + .../event_loop_delays.test.ts | 74 +-------------- .../event_loop_delays/event_loop_delays.ts | 41 +-------- .../collectors/event_loop_delays/index.ts | 3 +- .../event_loop_delays/track_delays.test.ts | 81 ++++++++++++++++ .../event_loop_delays/track_delays.ts | 56 +++++++++++ .../event_loop_delays/track_threshold.test.ts | 92 +++++++++++++++++++ .../event_loop_delays/track_threshold.ts | 69 ++++++++++++++ .../kibana_usage_collection/server/plugin.ts | 13 ++- src/plugins/usage_collection/server/mocks.ts | 10 +- 11 files changed, 342 insertions(+), 118 deletions(-) create mode 100644 src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.test.ts create mode 100644 src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.ts create mode 100644 src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.test.ts create mode 100644 src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.ts diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/constants.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/constants.ts index 1753c87c9d0054..d6201deff5fece 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/constants.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/constants.ts @@ -35,3 +35,23 @@ export const MONITOR_EVENT_LOOP_DELAYS_START = 1 * 60 * 1000; * Event loop monitoring sampling rate in milliseconds. */ export const MONITOR_EVENT_LOOP_DELAYS_RESOLUTION = 10; + +/** + * Mean event loop delay threshold for logging a warning. + */ +export const MONITOR_EVENT_LOOP_WARN_THRESHOLD = 350; + +/** + * Start monitoring the event loop threshold after 1 minute + */ +export const MONITOR_EVENT_LOOP_THRESHOLD_START = 1 * 60 * 1000; + +/** + * Check the event loop utilization every 30 seconds + */ +export const MONITOR_EVENT_LOOP_THRESHOLD_INTERVAL = 30 * 1000; + +/** + * Nanosecond to milisecond conversion unit + */ +export const ONE_MILLISECOND_AS_NANOSECONDS = 1000000; diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.mocks.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.mocks.ts index 6b03d3cc5cbd12..f266a27a7034fb 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.mocks.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.mocks.ts @@ -17,6 +17,7 @@ export const monitorEventLoopDelay = jest.fn().mockReturnValue({ percentile: mockMonitorPercentile, disable: mockMonitorDisable, reset: mockMonitorReset, + ...createMockHistogram(), }); jest.doMock('perf_hooks', () => ({ diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.test.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.test.ts index d03236a9756b3b..b40030e2101764 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.test.ts @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -import { Subject } from 'rxjs'; - import { mockMonitorEnable, mockMonitorPercentile, @@ -15,8 +13,7 @@ import { mockMonitorReset, mockMonitorDisable, } from './event_loop_delays.mocks'; -import { savedObjectsRepositoryMock } from '../../../../../core/server/mocks'; -import { startTrackingEventLoopDelaysUsage, EventLoopDelaysCollector } from './event_loop_delays'; +import { EventLoopDelaysCollector } from './event_loop_delays'; describe('EventLoopDelaysCollector', () => { jest.useFakeTimers('modern'); @@ -64,72 +61,3 @@ describe('EventLoopDelaysCollector', () => { expect(mockMonitorDisable).toBeCalledTimes(1); }); }); - -describe('startTrackingEventLoopDelaysUsage', () => { - const mockInternalRepository = savedObjectsRepositoryMock.create(); - const stopMonitoringEventLoop$ = new Subject(); - - beforeAll(() => jest.useFakeTimers('modern')); - beforeEach(() => jest.clearAllMocks()); - afterEach(() => stopMonitoringEventLoop$.next()); - - it('initializes EventLoopDelaysCollector and starts timer', () => { - const collectionStartDelay = 1000; - startTrackingEventLoopDelaysUsage( - mockInternalRepository, - stopMonitoringEventLoop$, - collectionStartDelay - ); - - expect(monitorEventLoopDelay).toBeCalledTimes(1); - expect(mockMonitorPercentile).toBeCalledTimes(0); - jest.advanceTimersByTime(collectionStartDelay); - expect(mockMonitorPercentile).toBeCalled(); - }); - - it('stores event loop delays every collectionInterval duration', () => { - const collectionStartDelay = 100; - const collectionInterval = 1000; - startTrackingEventLoopDelaysUsage( - mockInternalRepository, - stopMonitoringEventLoop$, - collectionStartDelay, - collectionInterval - ); - - expect(mockInternalRepository.create).toBeCalledTimes(0); - jest.advanceTimersByTime(collectionStartDelay); - expect(mockInternalRepository.create).toBeCalledTimes(1); - jest.advanceTimersByTime(collectionInterval); - expect(mockInternalRepository.create).toBeCalledTimes(2); - jest.advanceTimersByTime(collectionInterval); - expect(mockInternalRepository.create).toBeCalledTimes(3); - }); - - it('resets histogram every histogramReset duration', () => { - const collectionStartDelay = 0; - const collectionInterval = 1000; - const histogramReset = 5000; - startTrackingEventLoopDelaysUsage( - mockInternalRepository, - stopMonitoringEventLoop$, - collectionStartDelay, - collectionInterval, - histogramReset - ); - - expect(mockMonitorReset).toBeCalledTimes(0); - jest.advanceTimersByTime(collectionInterval * 5); - expect(mockMonitorReset).toBeCalledTimes(1); - jest.advanceTimersByTime(collectionInterval * 5); - expect(mockMonitorReset).toBeCalledTimes(2); - }); - - it('stops monitoring event loop delays once stopMonitoringEventLoop$.next is called', () => { - startTrackingEventLoopDelaysUsage(mockInternalRepository, stopMonitoringEventLoop$); - - expect(mockMonitorDisable).toBeCalledTimes(0); - stopMonitoringEventLoop$.next(); - expect(mockMonitorDisable).toBeCalledTimes(1); - }); -}); diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.ts index 655cba580fc5df..f5de44a061d5a5 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays.ts @@ -8,16 +8,7 @@ import type { EventLoopDelayMonitor } from 'perf_hooks'; import { monitorEventLoopDelay } from 'perf_hooks'; -import { takeUntil, finalize, map } from 'rxjs/operators'; -import { Observable, timer } from 'rxjs'; -import type { ISavedObjectsRepository } from 'kibana/server'; -import { - MONITOR_EVENT_LOOP_DELAYS_START, - MONITOR_EVENT_LOOP_DELAYS_INTERVAL, - MONITOR_EVENT_LOOP_DELAYS_RESET, - MONITOR_EVENT_LOOP_DELAYS_RESOLUTION, -} from './constants'; -import { storeHistogram } from './saved_objects'; +import { MONITOR_EVENT_LOOP_DELAYS_RESOLUTION } from './constants'; export interface IntervalHistogram { fromTimestamp: string; @@ -77,33 +68,3 @@ export class EventLoopDelaysCollector { this.loopMonitor.disable(); } } - -/** - * The monitoring of the event loop starts immediately. - * The first collection of the histogram happens after 1 minute. - * The daily histogram data is updated every 1 hour. - */ -export function startTrackingEventLoopDelaysUsage( - internalRepository: ISavedObjectsRepository, - stopMonitoringEventLoop$: Observable, - collectionStartDelay = MONITOR_EVENT_LOOP_DELAYS_START, - collectionInterval = MONITOR_EVENT_LOOP_DELAYS_INTERVAL, - histogramReset = MONITOR_EVENT_LOOP_DELAYS_RESET -) { - const eventLoopDelaysCollector = new EventLoopDelaysCollector(); - - const resetOnCount = Math.ceil(histogramReset / collectionInterval); - timer(collectionStartDelay, collectionInterval) - .pipe( - map((i) => (i + 1) % resetOnCount === 0), - takeUntil(stopMonitoringEventLoop$), - finalize(() => eventLoopDelaysCollector.stop()) - ) - .subscribe(async (shouldReset) => { - const histogram = eventLoopDelaysCollector.collect(); - if (shouldReset) { - eventLoopDelaysCollector.reset(); - } - await storeHistogram(histogram, internalRepository); - }); -} diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/index.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/index.ts index 693b173c2759ea..17b23e723c8048 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/index.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/index.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ -export { startTrackingEventLoopDelaysUsage } from './event_loop_delays'; export { registerEventLoopDelaysCollector } from './event_loop_delays_usage_collector'; +export { startTrackingEventLoopDelaysThreshold } from './track_threshold'; +export { startTrackingEventLoopDelaysUsage } from './track_delays'; export { SAVED_OBJECTS_DAILY_TYPE } from './saved_objects'; diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.test.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.test.ts new file mode 100644 index 00000000000000..e0d8c20ead75ad --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.test.ts @@ -0,0 +1,81 @@ +/* + * 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 { Subject } from 'rxjs'; + +import { + mockMonitorPercentile, + monitorEventLoopDelay, + mockMonitorReset, + mockMonitorDisable, +} from './event_loop_delays.mocks'; +import { savedObjectsRepositoryMock } from '../../../../../core/server/mocks'; +import { startTrackingEventLoopDelaysUsage } from './track_delays'; + +describe('startTrackingEventLoopDelaysUsage', () => { + const mockInternalRepository = savedObjectsRepositoryMock.create(); + const stopMonitoringEventLoop$ = new Subject(); + + beforeAll(() => jest.useFakeTimers('modern')); + beforeEach(() => jest.clearAllMocks()); + afterEach(() => stopMonitoringEventLoop$.next()); + + it('initializes EventLoopDelaysCollector and starts timer', () => { + const collectionStartDelay = 1000; + startTrackingEventLoopDelaysUsage(mockInternalRepository, stopMonitoringEventLoop$, { + collectionStartDelay, + }); + + expect(monitorEventLoopDelay).toBeCalledTimes(1); + expect(mockMonitorPercentile).toBeCalledTimes(0); + jest.advanceTimersByTime(collectionStartDelay); + expect(mockMonitorPercentile).toBeCalled(); + }); + + it('stores event loop delays every collectionInterval duration', () => { + const collectionStartDelay = 100; + const collectionInterval = 1000; + startTrackingEventLoopDelaysUsage(mockInternalRepository, stopMonitoringEventLoop$, { + collectionStartDelay, + collectionInterval, + }); + + expect(mockInternalRepository.create).toBeCalledTimes(0); + jest.advanceTimersByTime(collectionStartDelay); + expect(mockInternalRepository.create).toBeCalledTimes(1); + jest.advanceTimersByTime(collectionInterval); + expect(mockInternalRepository.create).toBeCalledTimes(2); + jest.advanceTimersByTime(collectionInterval); + expect(mockInternalRepository.create).toBeCalledTimes(3); + }); + + it('resets histogram every histogramReset duration', () => { + const collectionStartDelay = 0; + const collectionInterval = 1000; + const histogramReset = 5000; + startTrackingEventLoopDelaysUsage(mockInternalRepository, stopMonitoringEventLoop$, { + collectionStartDelay, + collectionInterval, + histogramReset, + }); + + expect(mockMonitorReset).toBeCalledTimes(0); + jest.advanceTimersByTime(collectionInterval * 5); + expect(mockMonitorReset).toBeCalledTimes(1); + jest.advanceTimersByTime(collectionInterval * 5); + expect(mockMonitorReset).toBeCalledTimes(2); + }); + + it('stops monitoring event loop delays once stopMonitoringEventLoop$.next is called', () => { + startTrackingEventLoopDelaysUsage(mockInternalRepository, stopMonitoringEventLoop$); + + expect(mockMonitorDisable).toBeCalledTimes(0); + stopMonitoringEventLoop$.next(); + expect(mockMonitorDisable).toBeCalledTimes(1); + }); +}); diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.ts new file mode 100644 index 00000000000000..70638d3b07cbc8 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_delays.ts @@ -0,0 +1,56 @@ +/* + * 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 { takeUntil, finalize, map } from 'rxjs/operators'; +import { Observable, timer } from 'rxjs'; +import type { ISavedObjectsRepository } from 'kibana/server'; +import { + MONITOR_EVENT_LOOP_DELAYS_START, + MONITOR_EVENT_LOOP_DELAYS_INTERVAL, + MONITOR_EVENT_LOOP_DELAYS_RESET, +} from './constants'; +import { storeHistogram } from './saved_objects'; +import { EventLoopDelaysCollector } from './event_loop_delays'; + +/** + * The monitoring of the event loop starts immediately. + * The first collection of the histogram happens after 1 minute. + * The daily histogram data is updated every 1 hour. + */ +export function startTrackingEventLoopDelaysUsage( + internalRepository: ISavedObjectsRepository, + stopMonitoringEventLoop$: Observable, + configs: { + collectionStartDelay?: number; + collectionInterval?: number; + histogramReset?: number; + } = {} +) { + const { + collectionStartDelay = MONITOR_EVENT_LOOP_DELAYS_START, + collectionInterval = MONITOR_EVENT_LOOP_DELAYS_INTERVAL, + histogramReset = MONITOR_EVENT_LOOP_DELAYS_RESET, + } = configs; + + const eventLoopDelaysCollector = new EventLoopDelaysCollector(); + const resetOnCount = Math.ceil(histogramReset / collectionInterval); + + timer(collectionStartDelay, collectionInterval) + .pipe( + map((i) => (i + 1) % resetOnCount === 0), + takeUntil(stopMonitoringEventLoop$), + finalize(() => eventLoopDelaysCollector.stop()) + ) + .subscribe(async (shouldReset) => { + const histogram = eventLoopDelaysCollector.collect(); + if (shouldReset) { + eventLoopDelaysCollector.reset(); + } + await storeHistogram(histogram, internalRepository); + }); +} diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.test.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.test.ts new file mode 100644 index 00000000000000..1ff49a735a775c --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.test.ts @@ -0,0 +1,92 @@ +/* + * 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 { Subject } from 'rxjs'; +import { + mockMonitorPercentile, + monitorEventLoopDelay, + mockMonitorReset, +} from './event_loop_delays.mocks'; +import { startTrackingEventLoopDelaysThreshold } from './track_threshold'; +import { loggingSystemMock } from '../../../../../core/server/mocks'; +import { usageCountersServiceMock } from '../../../../usage_collection/server/usage_counters/usage_counters_service.mock'; + +describe('startTrackingEventLoopDelaysThreshold', () => { + const logger = loggingSystemMock.createLogger(); + const stopMonitoringEventLoop$ = new Subject(); + const mockUsageCountersSetup = usageCountersServiceMock.createSetupContract(); + const mockEventLoopCounter = mockUsageCountersSetup.createUsageCounter('testCounter'); + + beforeAll(() => jest.useFakeTimers('modern')); + beforeEach(() => jest.clearAllMocks()); + afterEach(() => stopMonitoringEventLoop$.next()); + + it('initializes EventLoopDelaysCollector and starts timer', () => { + const collectionStartDelay = 1000; + const warnThreshold = 1000; + startTrackingEventLoopDelaysThreshold(mockEventLoopCounter, logger, stopMonitoringEventLoop$, { + warnThreshold, + collectionStartDelay, + }); + + expect(monitorEventLoopDelay).toBeCalledTimes(1); + expect(mockMonitorPercentile).toBeCalledTimes(0); + jest.advanceTimersByTime(collectionStartDelay); + expect(mockMonitorPercentile).toBeCalled(); + }); + + it('logs a warning and increments usage counter when the mean delay exceeds the threshold', () => { + const collectionStartDelay = 100; + const collectionInterval = 1000; + const warnThreshold = 10; + + startTrackingEventLoopDelaysThreshold(mockEventLoopCounter, logger, stopMonitoringEventLoop$, { + warnThreshold, + collectionStartDelay, + collectionInterval, + }); + + expect(logger.warn).toBeCalledTimes(0); + expect(mockEventLoopCounter.incrementCounter).toBeCalledTimes(0); + expect(mockMonitorReset).toBeCalledTimes(0); + + jest.advanceTimersByTime(collectionStartDelay); + expect(logger.warn).toBeCalledTimes(1); + expect(mockEventLoopCounter.incrementCounter).toBeCalledTimes(1); + expect(mockMonitorReset).toBeCalledTimes(1); + + jest.advanceTimersByTime(collectionInterval); + expect(logger.warn).toBeCalledTimes(2); + expect(mockEventLoopCounter.incrementCounter).toBeCalledTimes(2); + expect(mockMonitorReset).toBeCalledTimes(2); + + jest.advanceTimersByTime(collectionInterval); + expect(mockEventLoopCounter.incrementCounter).toBeCalledTimes(3); + expect(logger.warn).toBeCalledTimes(3); + expect(mockMonitorReset).toBeCalledTimes(3); + }); + + it('does not log warning or increment usage if threshold did not exceed mean delay', () => { + const collectionStartDelay = 100; + const warnThreshold = 15; + + startTrackingEventLoopDelaysThreshold(mockEventLoopCounter, logger, stopMonitoringEventLoop$, { + warnThreshold, + collectionStartDelay, + }); + + expect(logger.warn).toBeCalledTimes(0); + expect(mockEventLoopCounter.incrementCounter).toBeCalledTimes(0); + expect(mockMonitorReset).toBeCalledTimes(0); + + jest.advanceTimersByTime(collectionStartDelay); + expect(logger.warn).toBeCalledTimes(0); + expect(mockEventLoopCounter.incrementCounter).toBeCalledTimes(0); + expect(mockMonitorReset).toBeCalledTimes(1); + }); +}); diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.ts new file mode 100644 index 00000000000000..246d88496a1585 --- /dev/null +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/track_threshold.ts @@ -0,0 +1,69 @@ +/* + * 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 { takeUntil, finalize } from 'rxjs/operators'; +import { Observable, timer } from 'rxjs'; +import type { Logger } from 'kibana/server'; +import moment from 'moment'; +import type { UsageCounter } from '../../../../usage_collection/server'; +import { + MONITOR_EVENT_LOOP_THRESHOLD_START, + MONITOR_EVENT_LOOP_THRESHOLD_INTERVAL, + MONITOR_EVENT_LOOP_WARN_THRESHOLD, + ONE_MILLISECOND_AS_NANOSECONDS, +} from './constants'; +import { EventLoopDelaysCollector } from './event_loop_delays'; + +/** + * The monitoring of the event loop starts immediately. + * The first collection happens after 1 minute. + * The histogram is collected and reset every 20 seconds. + * logs a warning when threshold is exceeded (350ms) and increments a usage counter. + */ +export function startTrackingEventLoopDelaysThreshold( + eventLoopCounter: UsageCounter, + logger: Logger, + stopMonitoringEventLoop$: Observable, + configs: { + warnThreshold?: number; + collectionStartDelay?: number; + collectionInterval?: number; + } = {} +) { + const { + warnThreshold = MONITOR_EVENT_LOOP_WARN_THRESHOLD, + collectionStartDelay = MONITOR_EVENT_LOOP_THRESHOLD_START, + collectionInterval = MONITOR_EVENT_LOOP_THRESHOLD_INTERVAL, + } = configs; + + const eventLoopDelaysCollector = new EventLoopDelaysCollector(); + timer(collectionStartDelay, collectionInterval) + .pipe( + takeUntil(stopMonitoringEventLoop$), + finalize(() => eventLoopDelaysCollector.stop()) + ) + .subscribe(async () => { + const { mean } = eventLoopDelaysCollector.collect(); + const meanDurationMs = moment + .duration(mean / ONE_MILLISECOND_AS_NANOSECONDS) + .asMilliseconds(); + + if (meanDurationMs > warnThreshold) { + logger.warn( + `Average event loop delay threshold exceeded ${warnThreshold}ms. Received ${meanDurationMs}ms. ` + + `See https://ela.st/kibana-scaling-considerations for more information about scaling Kibana.` + ); + + eventLoopCounter.incrementCounter({ + counterName: 'delay_threshold_exceeded', + }); + } + + eventLoopDelaysCollector.reset(); + }); +} diff --git a/src/plugins/kibana_usage_collection/server/plugin.ts b/src/plugins/kibana_usage_collection/server/plugin.ts index 4ec717c48610ea..dadb4283e84a74 100644 --- a/src/plugins/kibana_usage_collection/server/plugin.ts +++ b/src/plugins/kibana_usage_collection/server/plugin.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import type { UsageCollectionSetup, UsageCounter } from 'src/plugins/usage_collection/server'; import { Subject, Observable } from 'rxjs'; import type { PluginInitializerContext, @@ -24,6 +24,7 @@ import type { import { SavedObjectsClient } from '../../../core/server'; import { startTrackingEventLoopDelaysUsage, + startTrackingEventLoopDelaysThreshold, SAVED_OBJECTS_DAILY_TYPE, } from './collectors/event_loop_delays'; import { @@ -59,6 +60,7 @@ export class KibanaUsageCollectionPlugin implements Plugin { private uiSettingsClient?: IUiSettingsClient; private metric$: Subject; private coreUsageData?: CoreUsageDataStart; + private eventLoopUsageCounter?: UsageCounter; private pluginStop$: Subject; constructor(initializerContext: PluginInitializerContext) { @@ -70,6 +72,7 @@ export class KibanaUsageCollectionPlugin implements Plugin { public setup(coreSetup: CoreSetup, { usageCollection }: KibanaUsageCollectionPluginsDepsSetup) { usageCollection.createUsageCounter('uiCounters'); + this.eventLoopUsageCounter = usageCollection.createUsageCounter('eventLoop'); this.registerUsageCollectors( usageCollection, coreSetup, @@ -80,6 +83,9 @@ export class KibanaUsageCollectionPlugin implements Plugin { } public start(core: CoreStart) { + if (!this.eventLoopUsageCounter) { + throw new Error('#setup must be called first'); + } const { savedObjects, uiSettings } = core; this.savedObjectsClient = savedObjects.createInternalRepository([SAVED_OBJECTS_DAILY_TYPE]); const savedObjectsClient = new SavedObjectsClient(this.savedObjectsClient); @@ -87,6 +93,11 @@ export class KibanaUsageCollectionPlugin implements Plugin { core.metrics.getOpsMetrics$().subscribe(this.metric$); this.coreUsageData = core.coreUsageData; startTrackingEventLoopDelaysUsage(this.savedObjectsClient, this.pluginStop$.asObservable()); + startTrackingEventLoopDelaysThreshold( + this.eventLoopUsageCounter, + this.logger, + this.pluginStop$.asObservable() + ); } public stop() { diff --git a/src/plugins/usage_collection/server/mocks.ts b/src/plugins/usage_collection/server/mocks.ts index ab7e53a7ad69b2..ca3bdfe1e7522d 100644 --- a/src/plugins/usage_collection/server/mocks.ts +++ b/src/plugins/usage_collection/server/mocks.ts @@ -16,7 +16,7 @@ import { import { CollectorOptions, CollectorSet } from './collector'; import { Collector } from './collector/collector'; import { UsageCollectionSetup, CollectorFetchContext } from './index'; - +import { usageCountersServiceMock } from './usage_counters/usage_counters_service.mock'; export type { CollectorOptions }; export { Collector }; @@ -25,10 +25,14 @@ export const createUsageCollectionSetupMock = () => { logger: loggingSystemMock.createLogger(), maximumWaitTimeForAllCollectorsInS: 1, }); + const { + createUsageCounter, + getUsageCounterByType, + } = usageCountersServiceMock.createSetupContract(); const usageCollectionSetupMock: jest.Mocked = { - createUsageCounter: jest.fn(), - getUsageCounterByType: jest.fn(), + createUsageCounter, + getUsageCounterByType, areAllCollectorsReady: jest.fn().mockImplementation(collectorSet.areAllCollectorsReady), bulkFetch: jest.fn().mockImplementation(collectorSet.bulkFetch), getCollectorByType: jest.fn().mockImplementation(collectorSet.getCollectorByType), From 5d24b23182c1961d0d7dcdc61cde8ed6f7ceb3a3 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 29 Jun 2021 20:24:01 +0200 Subject: [PATCH 112/227] [SoMigV2] Fail fast if unknown document types are present in the source index (#103341) * initial draft * fix some tests * fix additional unit tests * move all the things * create error generation fn * add correct error message * add unknown types to log message * fix types * fix existing test suites * add IT test * review comments * add tests + use unknown instead of undefined for empty types * update RFC with new step --- rfcs/text/0013_saved_object_migrations.md | 17 +- .../migrations/kibana/kibana_migrator.ts | 1 + .../actions/check_for_unknown_docs.test.ts | 157 ++++++++++ .../actions/check_for_unknown_docs.ts | 85 ++++++ .../migrationsv2/actions/index.ts | 14 + .../actions/wait_for_index_status_yellow.ts | 1 + .../saved_objects/migrationsv2/index.ts | 7 +- .../migrationsv2/initial_state.test.ts | 240 +++++++++++++++ .../migrationsv2/initial_state.ts | 83 +++++ .../archives/7.13.0_with_unknown_so.zip | Bin 0 -> 2235772 bytes .../integration_tests/cleanup.test.ts | 14 +- ...igration_7_13_0_transform_failures.test.ts | 26 +- .../migration_7_13_0_unknown_types.test.ts | 133 ++++++++ .../migrations_state_action_machine.test.ts | 11 +- .../migrationsv2/model/extract_errors.test.ts | 39 +++ .../migrationsv2/model/extract_errors.ts | 53 ++++ .../migrationsv2/model/helpers.ts | 90 ++++++ .../saved_objects/migrationsv2/model/index.ts | 10 + .../migrationsv2/{ => model}/model.test.ts | 283 +++++------------- .../migrationsv2/{ => model}/model.ts | 264 +++------------- .../migrationsv2/{ => model}/progress.test.ts | 2 +- .../migrationsv2/{ => model}/progress.ts | 2 +- .../migrationsv2/model/retry_state.test.ts | 145 +++++++++ .../migrationsv2/model/retry_state.ts | 49 +++ .../saved_objects/migrationsv2/model/types.ts | 25 ++ .../server/saved_objects/migrationsv2/next.ts | 8 + .../saved_objects/migrationsv2/types.ts | 16 +- 27 files changed, 1325 insertions(+), 450 deletions(-) create mode 100644 src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.test.ts create mode 100644 src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts create mode 100644 src/core/server/saved_objects/migrationsv2/initial_state.test.ts create mode 100644 src/core/server/saved_objects/migrationsv2/initial_state.ts create mode 100644 src/core/server/saved_objects/migrationsv2/integration_tests/archives/7.13.0_with_unknown_so.zip create mode 100644 src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_unknown_types.test.ts create mode 100644 src/core/server/saved_objects/migrationsv2/model/extract_errors.test.ts create mode 100644 src/core/server/saved_objects/migrationsv2/model/extract_errors.ts create mode 100644 src/core/server/saved_objects/migrationsv2/model/helpers.ts create mode 100644 src/core/server/saved_objects/migrationsv2/model/index.ts rename src/core/server/saved_objects/migrationsv2/{ => model}/model.test.ts (91%) rename src/core/server/saved_objects/migrationsv2/{ => model}/model.ts (81%) rename src/core/server/saved_objects/migrationsv2/{ => model}/progress.test.ts (98%) rename src/core/server/saved_objects/migrationsv2/{ => model}/progress.ts (97%) create mode 100644 src/core/server/saved_objects/migrationsv2/model/retry_state.test.ts create mode 100644 src/core/server/saved_objects/migrationsv2/model/retry_state.ts create mode 100644 src/core/server/saved_objects/migrationsv2/model/types.ts diff --git a/rfcs/text/0013_saved_object_migrations.md b/rfcs/text/0013_saved_object_migrations.md index 2f7ed796bf0e6b..e5ff7616ccf82a 100644 --- a/rfcs/text/0013_saved_object_migrations.md +++ b/rfcs/text/0013_saved_object_migrations.md @@ -253,26 +253,27 @@ Note: 4. Fail the migration if: 1. `.kibana` is pointing to an index that belongs to a later version of Kibana .e.g. `.kibana_7.12.0_001` 2. (Only in 8.x) The source index contains documents that belong to an unknown Saved Object type (from a disabled plugin). Log an error explaining that the plugin that created these documents needs to be enabled again or that these objects should be deleted. See section (4.2.1.4). -5. Set a write block on the source index. This prevents any further writes from outdated nodes. -6. Create a new temporary index `.kibana_7.10.0_reindex_temp` with `dynamic: false` on the top-level mappings so that any kind of document can be written to the index. This allows us to write untransformed documents to the index which might have fields which have been removed from the latest mappings defined by the plugin. Define minimal mappings for the `migrationVersion` and `type` fields so that we're still able to search for outdated documents that need to be transformed. +5. Search the source index for documents with types not registered within Kibana. Fail the migration if any document is found. +6. Set a write block on the source index. This prevents any further writes from outdated nodes. +7. Create a new temporary index `.kibana_7.10.0_reindex_temp` with `dynamic: false` on the top-level mappings so that any kind of document can be written to the index. This allows us to write untransformed documents to the index which might have fields which have been removed from the latest mappings defined by the plugin. Define minimal mappings for the `migrationVersion` and `type` fields so that we're still able to search for outdated documents that need to be transformed. 1. Ignore errors if the target index already exists. -7. Reindex the source index into the new temporary index. +8. Reindex the source index into the new temporary index. 1. Use `op_type=create` `conflicts=proceed` and `wait_for_completion=false` so that multiple instances can perform the reindex in parallel but only one write per document will succeed. 2. Wait for the reindex task to complete. If reindexing doesn’t complete within the 60s timeout, log a warning for visibility and poll again. -8. Clone the temporary index into the target index `.kibana_7.10.0_001`. Since any further writes will only happen against the cloned target index this prevents a lost delete from occuring where one instance finishes the migration and deletes a document and another instance's reindex operation re-creates the deleted document. +9. Clone the temporary index into the target index `.kibana_7.10.0_001`. Since any further writes will only happen against the cloned target index this prevents a lost delete from occuring where one instance finishes the migration and deletes a document and another instance's reindex operation re-creates the deleted document. 1. Set a write block on the temporary index 2. Clone the temporary index into the target index while specifying that the target index should have writes enabled. 3. If the clone operation fails because the target index already exist, ignore the error and wait for the target index to become green before proceeding. 4. (The `001` postfix in the target index name isn't used by Kibana, but allows for re-indexing an index should this be required by an Elasticsearch upgrade. E.g. re-index `.kibana_7.10.0_001` into `.kibana_7.10.0_002` and point the `.kibana_7.10.0` alias to `.kibana_7.10.0_002`.) -9. Transform documents by reading batches of outdated documents from the target index then transforming and updating them with optimistic concurrency control. +10. Transform documents by reading batches of outdated documents from the target index then transforming and updating them with optimistic concurrency control. 1. Ignore any version conflict errors. 2. If a document transform throws an exception, add the document to a failure list and continue trying to transform all other documents. If any failures occured, log the complete list of documents that failed to transform. Fail the migration. -10. Update the mappings of the target index +11. Update the mappings of the target index 1. Retrieve the existing mappings including the `migrationMappingPropertyHashes` metadata. 2. Update the mappings with `PUT /.kibana_7.10.0_001/_mapping`. The API deeply merges any updates so this won't remove the mappings of any plugins that are disabled on this instance but have been enabled on another instance that also migrated this index. 3. Ensure that fields are correctly indexed using the target index's latest mappings `POST /.kibana_7.10.0_001/_update_by_query?conflicts=proceed`. In the future we could optimize this query by only targeting documents: 1. That belong to a known saved object type. -11. Mark the migration as complete. This is done as a single atomic +12. Mark the migration as complete. This is done as a single atomic operation (requires https://github.com/elastic/elasticsearch/pull/58100) to guarantee that when multiple versions of Kibana are performing the migration in parallel, only one version will win. E.g. if 7.11 and 7.12 @@ -284,7 +285,7 @@ Note: 4. If this fails with a "required alias [.kibana] does not exist" error or "index_not_found_exception" for the temporary index, fetch `.kibana` again: 1. If `.kibana` is _not_ pointing to our target index fail the migration. 2. If `.kibana` is pointing to our target index the migration has succeeded and we can proceed to step (12). -12. Start serving traffic. All saved object reads/writes happen through the +13. Start serving traffic. All saved object reads/writes happen through the version-specific alias `.kibana_7.10.0`. Together with the limitations, this algorithm ensures that migrations are diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts index f74fe7e7a6e1c6..2d0282e6d26324 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts @@ -192,6 +192,7 @@ export class KibanaMigrator { migrationVersionPerType: this.documentMigrator.migrationVersion, indexPrefix: index, migrationsConfig: this.soMigrationsConfig, + typeRegistry: this.typeRegistry, }); }, }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.test.ts b/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.test.ts new file mode 100644 index 00000000000000..62a619ef447fad --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.test.ts @@ -0,0 +1,157 @@ +/* + * 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 * as Either from 'fp-ts/lib/Either'; +import { catchRetryableEsClientErrors } from './catch_retryable_es_client_errors'; +import { errors as EsErrors, estypes } from '@elastic/elasticsearch'; +import { elasticsearchClientMock } from '../../../elasticsearch/client/mocks'; +import { checkForUnknownDocs } from './check_for_unknown_docs'; + +jest.mock('./catch_retryable_es_client_errors'); + +describe('checkForUnknownDocs', () => { + const unusedTypesQuery: estypes.QueryDslQueryContainer = { + bool: { must: [{ term: { hello: 'dolly' } }] }, + }; + const knownTypes = ['foo', 'bar']; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('calls catchRetryableEsClientErrors when the promise rejects', async () => { + // Create a mock client that rejects all methods with a 503 status code response. + const retryableError = new EsErrors.ResponseError( + elasticsearchClientMock.createApiResponse({ + statusCode: 503, + body: { error: { type: 'es_type', reason: 'es_reason' } }, + }) + ); + const client = elasticsearchClientMock.createInternalClient( + elasticsearchClientMock.createErrorTransportRequestPromise(retryableError) + ); + + const task = checkForUnknownDocs({ + client, + indexName: '.kibana_8.0.0', + knownTypes, + unusedTypesQuery, + }); + try { + await task(); + } catch (e) { + /** ignore */ + } + expect(catchRetryableEsClientErrors).toHaveBeenCalledWith(retryableError); + }); + + it('calls `client.search` with the correct parameters', async () => { + const client = elasticsearchClientMock.createInternalClient( + elasticsearchClientMock.createSuccessTransportRequestPromise({ hits: { hits: [] } }) + ); + + const task = checkForUnknownDocs({ + client, + indexName: '.kibana_8.0.0', + knownTypes, + unusedTypesQuery, + }); + + await task(); + + expect(client.search).toHaveBeenCalledTimes(1); + expect(client.search).toHaveBeenCalledWith({ + index: '.kibana_8.0.0', + body: { + query: { + bool: { + must: unusedTypesQuery, + must_not: knownTypes.map((type) => ({ + term: { + type, + }, + })), + }, + }, + }, + }); + }); + + it('resolves with `Either.right` when no unknown docs are found', async () => { + const client = elasticsearchClientMock.createInternalClient( + elasticsearchClientMock.createSuccessTransportRequestPromise({ hits: { hits: [] } }) + ); + + const task = checkForUnknownDocs({ + client, + indexName: '.kibana_8.0.0', + knownTypes, + unusedTypesQuery, + }); + + const result = await task(); + + expect(Either.isRight(result)).toBe(true); + }); + + it('resolves with `Either.left` when unknown docs are found', async () => { + const client = elasticsearchClientMock.createInternalClient( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + hits: { + hits: [ + { _id: '12', _source: { type: 'foo' } }, + { _id: '14', _source: { type: 'bar' } }, + ], + }, + }) + ); + + const task = checkForUnknownDocs({ + client, + indexName: '.kibana_8.0.0', + knownTypes, + unusedTypesQuery, + }); + + const result = await task(); + + expect(Either.isLeft(result)).toBe(true); + expect((result as Either.Left).left).toEqual({ + type: 'unknown_docs_found', + unknownDocs: [ + { id: '12', type: 'foo' }, + { id: '14', type: 'bar' }, + ], + }); + }); + + it('uses `unknown` as the type when the document does not contain a type field', async () => { + const client = elasticsearchClientMock.createInternalClient( + elasticsearchClientMock.createSuccessTransportRequestPromise({ + hits: { + hits: [{ _id: '12', _source: {} }], + }, + }) + ); + + const task = checkForUnknownDocs({ + client, + indexName: '.kibana_8.0.0', + knownTypes, + unusedTypesQuery, + }); + + const result = await task(); + + expect(Either.isLeft(result)).toBe(true); + expect((result as Either.Left).left).toEqual({ + type: 'unknown_docs_found', + unknownDocs: [{ id: '12', type: 'unknown' }], + }); + }); +}); diff --git a/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts b/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts new file mode 100644 index 00000000000000..7cc1c26a2ea8b1 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts @@ -0,0 +1,85 @@ +/* + * 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 * as Either from 'fp-ts/lib/Either'; +import * as TaskEither from 'fp-ts/lib/TaskEither'; +import { estypes } from '@elastic/elasticsearch'; +import type { SavedObjectsRawDocSource } from '../../serialization'; +import { ElasticsearchClient } from '../../../elasticsearch'; +import { + catchRetryableEsClientErrors, + RetryableEsClientError, +} from './catch_retryable_es_client_errors'; + +/** @internal */ +export interface CheckForUnknownDocsParams { + client: ElasticsearchClient; + indexName: string; + unusedTypesQuery: estypes.QueryDslQueryContainer; + knownTypes: string[]; +} + +/** @internal */ +export interface CheckForUnknownDocsFoundDoc { + id: string; + type: string; +} + +/** @internal */ +export interface UnknownDocsFound { + type: 'unknown_docs_found'; + unknownDocs: CheckForUnknownDocsFoundDoc[]; +} + +export const checkForUnknownDocs = ({ + client, + indexName, + unusedTypesQuery, + knownTypes, +}: CheckForUnknownDocsParams): TaskEither.TaskEither< + RetryableEsClientError | UnknownDocsFound, + {} +> => () => { + const query = createUnknownDocQuery(unusedTypesQuery, knownTypes); + + return client + .search({ + index: indexName, + body: { + query, + }, + }) + .then((response) => { + const { hits } = response.body.hits; + if (hits.length) { + return Either.left({ + type: 'unknown_docs_found' as const, + unknownDocs: hits.map((hit) => ({ id: hit._id, type: hit._source?.type ?? 'unknown' })), + }); + } else { + return Either.right({}); + } + }) + .catch(catchRetryableEsClientErrors); +}; + +const createUnknownDocQuery = ( + unusedTypesQuery: estypes.QueryDslQueryContainer, + knownTypes: string[] +): estypes.QueryDslQueryContainer => { + return { + bool: { + must: unusedTypesQuery, + must_not: knownTypes.map((type) => ({ + term: { + type, + }, + })), + }, + }; +}; diff --git a/src/core/server/saved_objects/migrationsv2/actions/index.ts b/src/core/server/saved_objects/migrationsv2/actions/index.ts index 98d7167ffc31a1..8e4584970f138d 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/index.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/index.ts @@ -60,12 +60,14 @@ export type { ReindexResponse, ReindexParams } from './reindex'; export { reindex } from './reindex'; import type { IncompatibleMappingException } from './wait_for_reindex_task'; + export { waitForReindexTask } from './wait_for_reindex_task'; export type { VerifyReindexParams } from './verify_reindex'; export { verifyReindex } from './verify_reindex'; import type { AliasNotFound, RemoveIndexNotAConcreteIndex } from './update_aliases'; + export type { AliasAction, UpdateAliasesParams } from './update_aliases'; export { updateAliases } from './update_aliases'; @@ -78,6 +80,14 @@ export type { } from './update_and_pickup_mappings'; export { updateAndPickupMappings } from './update_and_pickup_mappings'; +import type { UnknownDocsFound } from './check_for_unknown_docs'; +export type { + CheckForUnknownDocsParams, + UnknownDocsFound, + CheckForUnknownDocsFoundDoc, +} from './check_for_unknown_docs'; +export { checkForUnknownDocs } from './check_for_unknown_docs'; + export { waitForPickupUpdatedMappingsTask } from './wait_for_pickup_updated_mappings_task'; export type { @@ -96,9 +106,11 @@ export interface IndexNotFound { type: 'index_not_found_exception'; index: string; } + export interface WaitForReindexTaskFailure { readonly cause: { type: string; reason: string }; } + export interface TargetIndexHadWriteBlock { type: 'target_index_had_write_block'; } @@ -108,6 +120,7 @@ export interface AcknowledgeResponse { acknowledged: boolean; shardsAcknowledged: boolean; } + // Map of left response 'type' string -> response interface export interface ActionErrorTypeMap { wait_for_task_completion_timeout: WaitForTaskCompletionTimeout; @@ -118,6 +131,7 @@ export interface ActionErrorTypeMap { alias_not_found_exception: AliasNotFound; remove_index_not_a_concrete_index: RemoveIndexNotAConcreteIndex; documents_transform_failed: DocumentsTransformFailed; + unknown_docs_found: UnknownDocsFound; } /** diff --git a/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts b/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts index 307c77ee5b89c7..57e49b8d51cd06 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts @@ -5,6 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + import * as Either from 'fp-ts/lib/Either'; import * as TaskEither from 'fp-ts/lib/TaskEither'; import { ElasticsearchClient } from '../../../elasticsearch'; diff --git a/src/core/server/saved_objects/migrationsv2/index.ts b/src/core/server/saved_objects/migrationsv2/index.ts index 25816c7fd14c60..33f73395bcc6cc 100644 --- a/src/core/server/saved_objects/migrationsv2/index.ts +++ b/src/core/server/saved_objects/migrationsv2/index.ts @@ -13,9 +13,11 @@ import type { SavedObjectsMigrationVersion } from '../types'; import type { TransformRawDocs } from './types'; import { MigrationResult } from '../migrations/core'; import { next } from './next'; -import { createInitialState, model } from './model'; +import { model } from './model'; +import { createInitialState } from './initial_state'; import { migrationStateActionMachine } from './migrations_state_action_machine'; import { SavedObjectsMigrationConfigType } from '../saved_objects_config'; +import type { ISavedObjectTypeRegistry } from '../saved_objects_type_registry'; /** * Migrates the provided indexPrefix index using a resilient algorithm that is @@ -32,6 +34,7 @@ export async function runResilientMigrator({ migrationVersionPerType, indexPrefix, migrationsConfig, + typeRegistry, }: { client: ElasticsearchClient; kibanaVersion: string; @@ -42,6 +45,7 @@ export async function runResilientMigrator({ migrationVersionPerType: SavedObjectsMigrationVersion; indexPrefix: string; migrationsConfig: SavedObjectsMigrationConfigType; + typeRegistry: ISavedObjectTypeRegistry; }): Promise { const initialState = createInitialState({ kibanaVersion, @@ -50,6 +54,7 @@ export async function runResilientMigrator({ migrationVersionPerType, indexPrefix, migrationsConfig, + typeRegistry, }); return migrationStateActionMachine({ initialState, diff --git a/src/core/server/saved_objects/migrationsv2/initial_state.test.ts b/src/core/server/saved_objects/migrationsv2/initial_state.test.ts new file mode 100644 index 00000000000000..8ab87e4fd53c0c --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/initial_state.test.ts @@ -0,0 +1,240 @@ +/* + * 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 * as Option from 'fp-ts/Option'; +import { SavedObjectsMigrationConfigType } from '../saved_objects_config'; +import { SavedObjectTypeRegistry } from '../saved_objects_type_registry'; +import { createInitialState } from './initial_state'; + +describe('createInitialState', () => { + let typeRegistry: SavedObjectTypeRegistry; + + beforeEach(() => { + typeRegistry = new SavedObjectTypeRegistry(); + }); + + const migrationsConfig = ({ + retryAttempts: 15, + batchSize: 1000, + } as unknown) as SavedObjectsMigrationConfigType; + it('creates the initial state for the model based on the passed in parameters', () => { + expect( + createInitialState({ + kibanaVersion: '8.1.0', + targetMappings: { + dynamic: 'strict', + properties: { my_type: { properties: { title: { type: 'text' } } } }, + }, + migrationVersionPerType: {}, + indexPrefix: '.kibana_task_manager', + migrationsConfig, + typeRegistry, + }) + ).toMatchInlineSnapshot(` + Object { + "batchSize": 1000, + "controlState": "INIT", + "currentAlias": ".kibana_task_manager", + "indexPrefix": ".kibana_task_manager", + "kibanaVersion": "8.1.0", + "knownTypes": Array [], + "legacyIndex": ".kibana_task_manager", + "logs": Array [], + "outdatedDocumentsQuery": Object { + "bool": Object { + "should": Array [], + }, + }, + "preMigrationScript": Object { + "_tag": "None", + }, + "retryAttempts": 15, + "retryCount": 0, + "retryDelay": 0, + "targetIndexMappings": Object { + "dynamic": "strict", + "properties": Object { + "my_type": Object { + "properties": Object { + "title": Object { + "type": "text", + }, + }, + }, + }, + }, + "tempIndex": ".kibana_task_manager_8.1.0_reindex_temp", + "tempIndexMappings": Object { + "dynamic": false, + "properties": Object { + "migrationVersion": Object { + "dynamic": "true", + "type": "object", + }, + "type": Object { + "type": "keyword", + }, + }, + }, + "unusedTypesQuery": Object { + "bool": Object { + "must_not": Array [ + Object { + "term": Object { + "type": "fleet-agent-events", + }, + }, + Object { + "term": Object { + "type": "tsvb-validation-telemetry", + }, + }, + Object { + "bool": Object { + "must": Array [ + Object { + "match": Object { + "type": "search-session", + }, + }, + Object { + "match": Object { + "search-session.persisted": false, + }, + }, + ], + }, + }, + ], + }, + }, + "versionAlias": ".kibana_task_manager_8.1.0", + "versionIndex": ".kibana_task_manager_8.1.0_001", + } + `); + }); + + it('returns state with the correct `knownTypes`', () => { + typeRegistry.registerType({ + name: 'foo', + namespaceType: 'single', + hidden: false, + mappings: { properties: {} }, + }); + typeRegistry.registerType({ + name: 'bar', + namespaceType: 'multiple', + hidden: true, + mappings: { properties: {} }, + }); + + const initialState = createInitialState({ + kibanaVersion: '8.1.0', + targetMappings: { + dynamic: 'strict', + properties: { my_type: { properties: { title: { type: 'text' } } } }, + }, + migrationVersionPerType: {}, + indexPrefix: '.kibana_task_manager', + migrationsConfig, + typeRegistry, + }); + + expect(initialState.knownTypes).toEqual(['foo', 'bar']); + }); + + it('returns state with a preMigration script', () => { + const preMigrationScript = "ctx._id = ctx._source.type + ':' + ctx._id"; + const initialState = createInitialState({ + kibanaVersion: '8.1.0', + targetMappings: { + dynamic: 'strict', + properties: { my_type: { properties: { title: { type: 'text' } } } }, + }, + preMigrationScript, + migrationVersionPerType: {}, + indexPrefix: '.kibana_task_manager', + migrationsConfig, + typeRegistry, + }); + + expect(Option.isSome(initialState.preMigrationScript)).toEqual(true); + expect((initialState.preMigrationScript as Option.Some).value).toEqual( + preMigrationScript + ); + }); + it('returns state without a preMigration script', () => { + expect( + Option.isNone( + createInitialState({ + kibanaVersion: '8.1.0', + targetMappings: { + dynamic: 'strict', + properties: { my_type: { properties: { title: { type: 'text' } } } }, + }, + preMigrationScript: undefined, + migrationVersionPerType: {}, + indexPrefix: '.kibana_task_manager', + migrationsConfig, + typeRegistry, + }).preMigrationScript + ) + ).toEqual(true); + }); + it('returns state with an outdatedDocumentsQuery', () => { + expect( + createInitialState({ + kibanaVersion: '8.1.0', + targetMappings: { + dynamic: 'strict', + properties: { my_type: { properties: { title: { type: 'text' } } } }, + }, + preMigrationScript: "ctx._id = ctx._source.type + ':' + ctx._id", + migrationVersionPerType: { my_dashboard: '7.10.1', my_viz: '8.0.0' }, + indexPrefix: '.kibana_task_manager', + migrationsConfig, + typeRegistry, + }).outdatedDocumentsQuery + ).toMatchInlineSnapshot(` + Object { + "bool": Object { + "should": Array [ + Object { + "bool": Object { + "must": Object { + "term": Object { + "type": "my_dashboard", + }, + }, + "must_not": Object { + "term": Object { + "migrationVersion.my_dashboard": "7.10.1", + }, + }, + }, + }, + Object { + "bool": Object { + "must": Object { + "term": Object { + "type": "my_viz", + }, + }, + "must_not": Object { + "term": Object { + "migrationVersion.my_viz": "8.0.0", + }, + }, + }, + }, + ], + }, + } + `); + }); +}); diff --git a/src/core/server/saved_objects/migrationsv2/initial_state.ts b/src/core/server/saved_objects/migrationsv2/initial_state.ts new file mode 100644 index 00000000000000..e13a4b441fb258 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/initial_state.ts @@ -0,0 +1,83 @@ +/* + * 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 * as Option from 'fp-ts/Option'; +import { IndexMapping } from '../mappings'; +import { SavedObjectsMigrationVersion } from '../../../types'; +import { SavedObjectsMigrationConfigType } from '../saved_objects_config'; +import type { ISavedObjectTypeRegistry } from '../saved_objects_type_registry'; +import { InitState } from './types'; +import { excludeUnusedTypesQuery } from '../migrations/core'; + +/** + * Construct the initial state for the model + */ +export const createInitialState = ({ + kibanaVersion, + targetMappings, + preMigrationScript, + migrationVersionPerType, + indexPrefix, + migrationsConfig, + typeRegistry, +}: { + kibanaVersion: string; + targetMappings: IndexMapping; + preMigrationScript?: string; + migrationVersionPerType: SavedObjectsMigrationVersion; + indexPrefix: string; + migrationsConfig: SavedObjectsMigrationConfigType; + typeRegistry: ISavedObjectTypeRegistry; +}): InitState => { + const outdatedDocumentsQuery = { + bool: { + should: Object.entries(migrationVersionPerType).map(([type, latestVersion]) => ({ + bool: { + must: { term: { type } }, + must_not: { term: { [`migrationVersion.${type}`]: latestVersion } }, + }, + })), + }, + }; + + const reindexTargetMappings: IndexMapping = { + dynamic: false, + properties: { + type: { type: 'keyword' }, + migrationVersion: { + // @ts-expect-error we don't allow plugins to set `dynamic` + dynamic: 'true', + type: 'object', + }, + }, + }; + + const knownTypes = typeRegistry.getAllTypes().map((type) => type.name); + + return { + controlState: 'INIT', + indexPrefix, + legacyIndex: indexPrefix, + currentAlias: indexPrefix, + versionAlias: `${indexPrefix}_${kibanaVersion}`, + versionIndex: `${indexPrefix}_${kibanaVersion}_001`, + tempIndex: `${indexPrefix}_${kibanaVersion}_reindex_temp`, + kibanaVersion, + preMigrationScript: Option.fromNullable(preMigrationScript), + targetIndexMappings: targetMappings, + tempIndexMappings: reindexTargetMappings, + outdatedDocumentsQuery, + retryCount: 0, + retryDelay: 0, + retryAttempts: migrationsConfig.retryAttempts, + batchSize: migrationsConfig.batchSize, + logs: [], + unusedTypesQuery: excludeUnusedTypesQuery, + knownTypes, + }; +}; diff --git a/src/core/server/saved_objects/migrationsv2/integration_tests/archives/7.13.0_with_unknown_so.zip b/src/core/server/saved_objects/migrationsv2/integration_tests/archives/7.13.0_with_unknown_so.zip new file mode 100644 index 0000000000000000000000000000000000000000..30ee6ee23dbf3f88c01a6d0caf69358f05ec19f7 GIT binary patch literal 2235772 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ð0!z7;VfWnIsH#kP%e!X_?>Uczf7O#v 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
ukp@W}=oh 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 >~$u zC4~ogBbCU{OiF%EW{L@hZvl{v<}XY+rUfjmuK%~98Rzql_TN@UYl6A4>PdA*O8?+& zfF38qKK}gcYhpskD6zyq`J~(@=fibV&SnKi_Pc>#`4Lcywb3$!cKv?gG? zI;MA@k}nrT>i6UnKBu-H(28H&Q9cYy;YUdFJE^pLGWVbAkT)e|E}*xt?{j6wvCq=i z*2g>MBfIGkxn{EyI6V{Z--?UhnSRz|9&0cuu8PG*MML3(P+EC5KRTYJXVB-O8vn^avGx1S=g zcr9xzgK6Mo za>|*hStCZ~!>~Iiga60eS4P#jBx~dD7Tn$4-Q6L$OK|t#uE9OHLm*gy0KwfgSa5d> z9{4uNIWw7a=h)0$>$|K~du{fQx2vn_t*Wkix?8v+#B8D0>@}AGMF%+DCGBO@+(qP9 zl*o9NIcnPB^$}UocJ4^&3u$I26{Y%G^qmw8vf`SetwaoSd*J#GQ}|1`5l$iO2pJS7 zSa56xGn;-Rdq$Yl-xnt6_RIDfM)`Pl*|7^&IU_A9902t=@w&DovCqADyzby!L zc02%hJOBX#BKRFXolMPbOl_T=^jUt`!tZQ=d$xs9r5`q+JPcsA-Xo=apta?E#jOF% ztN)_-f)UHy(Vo$P(GPg437c>L0nH$WgI!21J+Xi77ZXBI8g7T{e3}4~3_w;hPp1;~ zXsM=3kK3~+iK|C7G*KoWmV{*ur>=>v@W-+UC!Y}f5GTh-k}yun-OpYFYi2^NMTiq; zWs(j(+|OFq-62&Ox3^?KqUru!UPH=}5iA!Mb0hH40HxE3IiW<#tfM9*sK81qs~FS_ zhlq>w4it)swFhDA$7>}Hz3NApeVay{ylb|Kr?IAwkGYPQTycPFdT5=Tq~jxKd=C3c z+C;-G$%FkTp?<%qTesO*0w7etMcqK;zavz@P2KvkF2<&|rkt$$jP%YH_J4F~_mB51 zF(Eq>PdPCi8^E3RVOmPORtG@LAO2O$6l9LKiR8uGg<7fIIE;+AKXh+93?~cv6PwT7 z9Q{L6PF?_ufIG#1*G8Y&WTCgVaQ)8Rb3f;q{*8^&ul`V>;R7>44}U(Ih#L{99@T;LVy7fkO5|``bd-7 z0=LT%QU(=f7It<-37nqdX(teLEaDcK=#cM(!hlNgqgXMw%dUX)-sHuSZ}*F0*%oIK zc+afu4$>XrYhdZ0uV$f$YL2-q2M0nNMjR%LEEXBl+e1ni6CoItmm>>YPh2^4{9-Qsu*l1v zGr-+Xx=D1O34cQ=R{dR``?Qj3ckObCnv(Td#D*$~Vld;vF?nuJ#Dc&#<^l5i){_hV zlZ(S^^34}-L$yiYfWnl-+H2Y6ctj`~<3d1Nt*k*0dQ#UP>6s3b5~Os~Qi_IM)rr4R z7N4S(P?kD`3)uw9FLEFPeRPX3_F|0?#lO}!4YD5cxV26Qn`M!e*tjsl0x|*yKwwEn zp_^R^{NvO+OVLn<6vK#IVK54@u_`Hca~Rdirtw0^UqSJ-Agn)7&&Bjy>;`34iW+e{Fg%DT@q>DLnX?9HMq*toK zVHVx6*%2?Paec+SHFaYmoQ$2T;KU=|<#jAr4G0g6T{t|f1tk1Hz_RvHhW~!eBf&x< zS;yxBy!o>%>ZTqFnr6Z7PWph!$-MFS>oBQi`#lICDT7^w#dvoK(BAkN+vE_lOH7K- zTJ%>(v#%+mw(7N*;l*?4gY3zBVix0qm+9j3c@T{0~7fJ`the`y7 zzza9F#$@It{0wPX(`Ny)I)wr}l-tNii`5>X6VaM0P61(%d5VXw5!mn79tZ3XgU$@2 zM6G58AxJJs7z>4&IIAUu;|2A8BhKy}+tYlVBQAmBAvD`94kmXnDUiQ%Dn99xd9;~e zG&962aL0iXB*;`W*%xI-*TX^EFpf|o?3VGHsq(3O7`=}1oi4nf_`0q zOVv2(1QnNHXjINDA`f0mCc^pkMsCZ7%2qa(gq*$x1E)kHS`+g=(>$ zlfLI7TLo0iflpLNY$V;Vjc&zkN-<@$LDKsGOdW%8rdw}sM6%TkkvV$Ci{oVSmGGpv zS6kQnb~hyDTgE{OWxDwxFVmcjaa?U@9rx#Dr>B5Bt+Lh63lsY+$9+rTiLHE5Eegw9 zwpAZ)=)>X1SlG9+)w#fz3AU^APcxP~8mjv{=*nf6+#4k9P;LWRoX!ZFkFb!P^6q2i zG#sW*wsLPnQF@nKIfzZ>B6pmLkPo#t(*(1%%W-z{`F-oj${KeK8+KmZxKugiPHkk{ z`Uv&%j#4^rBo>mHGB^+TZ%mVsSD_i5RNR%Bvvn`_jZO8M*fQD9Ide0(>7R5?E=7wk zVdn68ES8%!j}CPwaecel?Cmn064zUNY`ucYZkpOEdKzzdqfD`K!b5uyKeW)h0;yAU zm{}u(c)7r1wY=#-Uqf|UD$=YViLZTNUoNqn(mI5`W7libMEupsg*)yvXKh_M zZEuZrzOJ!ob}Zq8m9#)Jzn7IM#KR)qo{-eilvl@@3gn4{TNazem*|kC^Vp&n;7uoM^+C;>br;i8Mzh>OiNrdn=`sF}orfBC>U8+e7 z4`zrjqWdU%N6WljsmBL+eaHN*h&qG@UUz3EO`OHu2i{Q}+QuXemn$FkAAf2dvq|gQ zg}lNNu-C_E@pN~NQmE9PS=vrJXe%3XZ?>Np@^9|FIcoe?29V&`R%v+etQb|#%fWkI zPdaqSax}{kCT|-&{E8;Jv39`Orcx4IXW8|IAL~;K6xrW)PWX-@Sd9v6t#2#HsX@?8 z#WEo2A)}%fDa%Gd%fZ>$3>m*7QszYMWSXAb{$S1icFWI45LjYA7&%}Mo-$BLsy(wy z<${ts343mKcGlsrQz3@o_~!o3@hQO<_@D9ZIqMjF@@;(1)ieO~7qbo%JL5mfI=<&? zd%q;LD6#rF@o6b~xO$12@mibl+0V&wY}~A;0`btn`{CtRSg0-K`19k zRk#dK`HrE!r!8~cL9WY}F=Tj5U8CFs%Ln2xXf0SYLEp&nY}D*I*9Qp0Dz}x!ansC| zSJ_nvgV-pBqF&PI$co;~Z-h2|sm@tmB}1FkdS|4%FB;HX^_uW6N?51g>z0ZjF4c@Dm3gprqr^7RUYOgK%qjEC zMzbkfsWna-s~6W)jDa^OrXZ*e@3gAO{Law7+DZek(5`N#;g0F0=ACoTsF(7sh-W3V|l5NLp>e zP{slTsrh7ZTE{<>w3|P6AkG#lLQgw~STr^^447<5iNj)7Vv%39=*XYq3iqBg-%Eh{p zTRCQw<$la4UBqKVN+DX{A}GF`)G8vaf-|R~G+ijglp18sS)4rI(jj80n!=#gM;Jm9 z-Z(PFP5JdM-0UH%&B8;$x`fYoa;l9F;>Qq7BZUekQ~gbm00%fOCtll(z^R>mq}S)`#d>MAB>Y~<+t z^6=rl>U8x3qyQBz4vz;P(`hG~f-eSwY!doXn=9lI_TD2Uua@d{5q)v~ioyuRU>4>c z*OVSF3jd^s@qItwa>B}Ug||Hv@ynnag)%#p>@V0i@tW9F&M&iMf+4@4_VN239-R2x z-_Y!ZzEsc^;CINqO(7WLh8)Z0me9wsW55%zug-a>F>W(A^Jm)$CC3Oobd_pNx~#Nh zk$)-KN@`i5Hcz*AsU(I@CXZ(j=fFfS%dkFbP!HT++tB)1S;{U`bNA3v#t=eNPq)-rr#_$O=CyoI|Y&Y za-j(cq>0J#*IpSd)z#5&nXo3_1gB01HkcjJYjhp6H*0SaHQu6Secc>rI4v+==?KKo z2_Ga)7m)Bzyr}>+^_a)-N3=OL>4R`e6 z3Gv9JdC#h2VQ8oLik*(S?Kq}C6EgGq@OuM)89!0?x7m%1extoQ7|<%nWCAu^u(peg z3?9V7@%f@~QdD@_CFJi7H1C;*#Y_nl#_&+g*!e%QY2%D2XbZk*%+buyz8>GC z&Al_RIMmqUI?hvcFw`(}_>is|)?1EYtu?;PrhVi(MPCW|0d<$b2?Vu-QcoD|g)$g~ z#KnkI@vs zb1?u4$N8P->a(x`LYC?Ghdzg_XZnrCzX#OgUrP*`+1j!C=_%{!FO?J1wEj({fg2Pu zQcp{d9u#a>h*F$B$3Pl7(HJ;aQ{4}Yh7flaQV|c~;S6b!R(2i!Qkof-u+thw(L+J? zb_uQIHF=Gk;=z1mZu)laE9n7+5GW@o;jM4uw88s3VWER5&jl5bK{L*cK6Hei!t--Y z^*Z%@@6YFI^pCkduajZ_>$yUHpQ|+V^IS{BTm?H?bSNnxsheO5YCt;mXd%#@SKoxr znHi$k<)p-C!zCdG4&LYXr$ZSV6TmQ|k>8+FbH0#M0Ty*1U@d8ZEPHJWqxy)i z`Z)faisV>_l$Jfj|1{Uh<~5tRH&)gQ6k*U)C!(#ZPmk)D(Mk55vMB zKZEe3x*bq-@GapMK)a0})+u?=DR~V&KF(W`lSvq4wh1z?3cS`YBcjIb2bN2{m7g2n zG!ez%H~8c?=#@9PQzRIKj%&z{_pI2mWFg;2ADrJz7Lys`^`95Z&3^S-e>B&>R4nJF z_`g^zAEBcgp^HkLUyq);j9{4;Qgzg#PNX;cd&P3UZ|8TvO>3d~&i#4-wgdz45q~lN zcD6D3)BJn$U+bkATJimVQZAhXb&=|71itMdOY_+4SrbbmD-|;!@ms(;du3-}Vzh4b zv8TU>tjH=hV`FJCg%Q2RaM*l!~ItX zH7WCSoM5l`c}Q3`=*V;U;G$%wIGY+ZST2;6X$T9z%eY4^3|x>_p>r|cBD|9I0Y*1| zMWqP{kpJpP{gcAV{@e!Hezn0r@}qyr29>%0FWMlWVG|WK{A`1AUw^SdrbKzuzh{F6 z(apK&KZ*Cb7@ncgx0v*&{_J^c!w-MMs5U2uozPLSZAnuPnGdfn|`svbX^M4EC3(En%%6aUga&Drd=c=;QKm~=hp zA^^-hM}$ALQQJSa(aj$WnXNwC=yP*g|GEBB_dm>&u{Kc^qkx%_iTNQEgnZs_n)rRC z-@|(RaLc7p!$aOuH%cojV-GOXTqjsc&H7|r-7t(eC`58%cf6>0&O62gEX+pcXP3S% zBg3MS`pR(YmpYD0u*eTz{v+8&`AxEo@!O>Mxh?$9Bs&Pu5`L!NNtjEPrzpeJ5u_XVV{p#R3L@%p;$^A80dxz%I85jB9EG56TdX zsf-xCF?Q|D?y!Yvkj`d5h~1~3S*SydR&tvbVw#RFEJQ1SYSwupPgLJMOMC{={yoDj?NUT9QjejmQ6fIjjCrDg-j)W$JQ8!UMcCoe$ zNUE7;C{nU+v?xAxoQx^6W}^;0otyYB6iT2)Vau#VO=vv4WY{?0yCO6@&*d#%w!(tR zJ;qqdGk0cHlxhu~3ow!>N)RNdP^Q?MwlxQI691Sjq8Gvrt}5ah1a!Gty7)WpVFs;P z<1q|+LF-z4fk4Qj`G+7HATEAjjTpnmZr~zX0q^{$3P+togyQNLDScx)3gqN8!HPpH zbL$Ry!R|==4x{Yh^Ad3Ux`Sm3jLw#tVo*Las?3HijZ`~ekG_Ddn$6fqRkloY@H2?wXrE11DL5-mG& zPfNo;CUdvZ-g80JuwijuXsk9)%`W`Pv<+D?Gw!SB8$=97F-7gz*v+Y)6FyGvdb)2% zJRfAf>?gFk7uXrTE_!J=<-ct}C&2V-%7@_10P@sd@0y#V5Lh^PCr(S|9&(FFvw0 zJG+f00lICz{4M?$*f{s0K{uPmNw>aW=RoOg|*IdfpZNDSsII537 ztX$NV(Ke$ANyjL6Vo7DdDNHZ-Ac>f1puo#gQzb}#Ph6C59qGIGC6~Ad&ah&0N!+u| zcfoE-ir- zs5Or*2Op07lB7fmi!<4HbJ^;o5*YJ0&OjvB+N#GcyF2Z!q&nO+40*&uTHX$ton`l{ zQNDbRMUYR^ILctwrCdCx^24h+5-A)M@Lp|V?-;w3Lh?4oSry6dIS$<-tQN& z2{mgkcvc{H=T+lmt6JU}9Gm?Z%nE+Eb+Q3CE84zuf)B&R` zF^6|Ri7Ez4`#wUPsa-#l;puxX=0|A! zZS0}{n~s|CFGe5t-^4h!zdg>+@kay@=$`3!2Qvw&Hx;i zg`F*(wW*<#sS_RZufgbdcz8~D{|9*NBWwh-6KW*&hKzEgBVv70AqKkn_70xah?E?y zJl*42ITH(66CqnYrMsVqsum;QPc`|DKhNfs2j5ij{+^ zUNYE0S3=6nmU{en2}Dgi1C7hB*!x}2ZK2peDL-L8x`Fu9&X4;`zQr|DMkY%Wc5Y z!B8iN1azT_M8$82B-E&^*G_t&I60mtpvo{`T&%OG_^^SX7i}dMhBPK_g5MT$Jhk`vmdOxpiASlDE=bB%9pYIQo$NEk7#__l3>+EP~>tt>BOXlUsP-5^q`Q49X z=y|}y4YX)VfN-Dtog)AFfWMARZ*27gy!Je}1AzXWkTWxN0aoMYwz++fP>T%%m@s6+a7rK@I?k|MyJNvCumMr1U)re&+G__*7C(OnsS| zkUa`u7OvZ9U`tcUW38}9NH2|y94qE=xe0h4A_fkry>Wc|)bI}!$@;fh2IT3c?ms-( zvml@8H-h|ULC6j8nvm1beY^z-=M|tK%<~_Prq5(fZ}!U?N(kV?p6NG(eqS{Ir8QI^ zp2@07%$Tg9fsx4#BDib~Fra!S_iHuH_ExMZoXpe0AOh5=G8mfPw5QO*A`LwX0`Bmv zr!@G?<2DKoF3P@Z%iyEVc|sS8le9{8hOM6p-mts4IKuKxK;H0Dci!Ml{B)iUdAbJZ zxtNcIk|Q+>ILH96uPK%1$nhkvdN++6z-HPl)Cf^tS)4hGJ|& zTBZgF9Qc*ck#cfN_mXOi(2?j>w}~Prh7*G2OZ*>T$+?!RN{FA#@mbn7HEYPfE|LE$ zX`B35LjRGp|LPKYNhkyqJ3*gOu;U34!JEIRQlj+nZL&t*_l1kc4;nBUAw za4*GB9Z(b?0^pUo|6`+P|Fux`JgI;4qM0fV0s4z*!Q{MPL84Lgh89NF+=?N`Q6VV$ zVN$w{HEGTe6^tx$<`EB}1gjFegGp_xgGrUTx1jWOiE##v10y3IO9@T2PwdN;Sz`Ex z-2n(#%AK1`IH#&QZ^k~{b{v0N$@N z2@M@QmIh%E1B(~DEaz$|^ddbY99LZSF7aWW8R(eZQ2mthQZgjoUJ~YPL72@MD3UtG z5I-4#5z$0|@UXy1D-HJ2SHmMS^8+E>mr0x%(vP7PW-&HPx#6I(=L%Eh<|ow-LkA4h|2+>{x3uCuAs z^cTv%!v3rKN-(3WumNcD1t1XqegFQ$S?V*f{|uu36_oQwruuh4IejBL0i`h=cCxqPO0DcPv{MH2mT^h)ZGyo&?z62<&3sD8}D=Z1B z4mtx)kXgVT2oxt~E>QoLG0~tK@2LTZl^{!yYS5la9+Vc5nPgZ8m6--qCsY_xk7r55 zc%C21ajZm6cLx{+5i4Ba%>$Bv6H^UiUUi(uoCXs5E*bD%A@Dp@VynL zTQ?%HM~9w-84+g*nk>u=Tm_N{@-P%wAVDZu>PL%k#ef$=j4X~u1AOjc)iUclc~*tk z0qRWlF!_VP&}YVtkmXQCgg*4MCc;va;?r{mFnV{)t5rZml1RbA;=J|;SgU)O)*!UN z#L_QHfS00%DW$Myg6k?nCkj^MsDXm#%B@W3arh^G@kKRXUYz{gymEdpJNq zT73U&%67K+L%-DO1?#Lc<8jQk|O3JFP*@ zV@k0`QSV2@kJvVcnoVc{w#7(@v@Fg!BxM*{Xc zPdpq65l`lk;?0qQ?X|n=#>hKcQbDpqQ7tgZ8rQ7R)zaU4D8uC&OYnyXD}~6XinsIb zQWc~Vl`3jY#D(ia4fs<;G0FET@6Bs4BknQHdB^%71b@=^`+~R^#2N6?;M#zWZwmfV zf^iu*Tr-sq>{hMufzc+I56UU%%+s$bXm|mu*h~yg0uQ0M%NEw_E&j~T>CJ1O?7lC^ z=a2_D-hd6h{4n0KTMDLCdl(ksQ#-GXHt`~pM~Z3_G(jq0nz^mf=VsQZ@tQqjp{Idg zK%c(WPyjtMvK2c0Xn;Kz_r#M(>jz=704+h%52P-V46EuNJa`vW6Ly7e}e(x4F|mbc4qjca4VwEl-z2dJ?i1hJfVHaCseR- zH@zT*eX#|gRm*_^w}};ufu24K9%`xwCbJzpWmH5d{^OzzjDevQ)6BNfhX*0R@rjI| z*+po)yzV`ln|nj4e$?V#{FuRmhpz2fw`8le5c65*vp{jdud!Dn%ZwNKhRlp*&-#-i zd8x%MW$??3m@ufa*OKOu=X%U>Lpzq~m=c!hn{}liUvE!ioNEZ9N*x27MKgvist?hE z6}0GIdQXn0FYuth*@H4EW2Abr+eF^_!r5c$HC1ihvLEYe&zvn!Q67Va>MuJ|GUVm? zKD!jl$73uEcBom3POa%3;0sS}wd_nx@)&s$_5H<}=4H1AEq{h2a{K(;Mta{EG zxyOvkw|~;pwju05@Us3g35Q^po2th+d~>a%HF(osDsX_8Q=1~X7ADP|WjVGuelL?f zO^QPKc0klJz859PB?0+@i-~?t&i|HKCw}x*X|#dDwwY1E zsN=T4dfXHOlv4XQ{2pYGA!_tHj)M<;1KXhIv{&5`uNW(fa>x67`N}AEovE+pBLBg*t8#x-=6wwCWX&1i#!j! zxbOxRoDYh99Z#U~^;nhV2HXgdFGc$?IB-Kd^dV|RS0CtTi6r&=UNVza-hqr4$GAHa{wV2iBh3$f5NE2M)yEWG(pU?$an^5DEmIKe2&tU4?cMvLu+ zvA12CvzW|Q`Px^*X#C8#a^9AG8L;h(Q1=)*gsW;yqNkqineThy{1`$WoZ;KQ#@cpM z71i3);*VI>rjhb(ue4L;phQSbP_?0v`+z7y55on=7q1crn+&T#K5{Y6^ywTab`H}6Mny@ZI!+qTxG z-2GRz1}c0xOlgDd>Uam9%S!beh;xH!(RNo^@#f&kY=??QeaQRrG>`9rQn~fB7}}i; z^T*ZRGPzKOOJtY%*C0$P;YuIL$f`U#RY|^qSE3?Wy#_VYWt_Y=RQ887m<-P2C*{<< z1(rqISqalG?$0l(RXV>&6Sce>ON#|@B*c%6P&S|!fjOt*#1XAHWG!g-2J_;e*Bzc0{BFpn1PXV8h$&YgDz%IH;< z`}%ClQ&SVJ%dZsLadwr|dS=m;QUuStnPZo32D^1AD+5`~;Npo7yjhhe!&Qy4lgkYQ zmz5t6`BOehSD>@B+w|3oy?WW%W5+v)%Ho*@6m>B z|Ey^H$&cGDt~&mSp8Q&wD&qydPTvFNwAQfpK-rr>L>AOH%G+~di)P!Zpt4^Xi#u_d zNoHJ51=^|G0#s&2RJ6nyG$To=uruTf#opc0wJuvsvmU*Mfk8x`_1+||Dzp> ze~VX2T~PwV&i-zt&dJ)^#QlD|np(v|S60&0Fq&_h-`jBJ*!w0cat94XlUkoR*fJMf zCJC(~{}bZ+7jP3Zq+SdnW&w8C@V&&`p#z}9Cq0rX#)_4|JA7O_VQ+L%PIVr!uCcB= zQd$9srxy_$_!097=@ix_4C02P zLSISh^@4UAyTuppniFHI&W1UHB=|&zGHXUFyL{>E-X~SKEEly9MB9D`t3C=+0HkWFCGHa znH*wDpD{c(q{!cDo~jbJD2kN4s~p|2u_@F3@Y$!o4X)G6>%!|pqiYxxg94f!YA=TY z-q)2kP9+L7r&l1m`=z61z?CmhL3H@$Cpw}#?sVWAJ(ryZwR8z%Fi<9RKE}SCe3a-W zOPgcQ+kZVBr7}r+D~TeQ{GiCMaHewXr>D$exyK#}ku>}|#8&?3R%x!lTimY@x;f$2 z%|NL*=pZhsHSe5C=43t2D3^!242dTddz=DV(sd`{OAIq5oe59u$IEq#1j;P#s^EQt zD>F)zT8`wPkLHE}&JP3@ua9o7CMMR@7Rkj!??Ofo_ARY61tw<<&!^rDoD?&d8MDuu z)wU`u0x<5~S6OxTigvzgU)D%#}-4QFm%|4#v!6e@YS~u;Qd5%fFxU66j~0 zcLuvRpE?s(zApkwM5e^&ob_9giJ^ou#gRos;*a$qv=sPYaY~>xya=_^CTvSdW#OyV z(R*?h%H_s|gVSivkL0+S6;cQ^=l*hWar;#@iZ-8Rn;zk{L1NbD@C4W>t&{!G?h>xi z7x}Y1=VM_Q2WTLuaIVY{T8i33rw7+zIXS=nx)G4 zMjg*L_44`6joEE!@K4m5YI}VJWtTHwU32y$ZU-!HxrI*((Buj)79dL*&yjhhxy+;^ zCD=L~+zvFSow*|K9LOTMi_De!WHhI7#4*0oC#Q(1y#y_XtAuGIgFB9lF1EAJ$eQEa z2_G>7oL7*AQ~q9&Eff6_$^U^n^##nPSHB!mJ{m>3Y+)K%2NidPFSMHt;fg%}2E3!F zC$?&Zszj|xqBc#I$TFNZ&});dld#0sp=I|7k*9crU))F1Y1BXF_jc>jb7!QE_O_tS zD!KCmrF=y=MNic9M)~@nEIlsXAHE#Pz2ytdVNv^qwsEZ2bbA9)S<4OM+Y@Wg4UHiU z_P1^i;~g6uEKRn$uK~z?1afNpyJfmB$r|idKAJu)A4Nu*t!m_`v+A45gj=3|sBd#3 zubY46aYa~GScFO?7fOYFvDTB$$pF(9t3qH?(wx%O9Gf{B5V`{2MqiBY?#$(aEO^pU zKD6h+Ix}biW$T0PB)8o?ydF7hcL4cBhNjJM*?5Zyn-(J0vDBAsPTz#{z$M+uP1I@j z2nRb@-r+mCzbT~QT4Sd~sFEI}QSY^L{B7}r%{;Hu*AFxw^qFd14z|O+y*{u%b+!P7 zenQfU7g2D=eFpc;&jBL_*FsBW)R=#T=QIxRa z0csmUvSC%zds>*qoR#h=s6;u}RI3?elsNPu9;$s6X^&$a+8sV(lxTlZ_%?|P=5@87 zK&8F#V}zUZ{u~k$o?e ze?k%xr)^OC%L5{NDej3+yPAA_x^KHg_|%e8W+kocIB{XFoP)YfR8Gq}txtyH3Y}Za zl)bh-s{?NM5G|ezMk^#GI8`0>F^2hy#b+d)NL*Arh&+Yr*?n27+jQMv{hGTrVFY2Fq#^kX}x`UHQ_D&m55Iaj*k**##qOoCEk z+F+5FswRymGkzCEdK6TP`~V48>DnO>@619%--orV{1CfPHE0!4o1M?CsQyx z^yX{#b@xTH+sQ)Om$pS0r=9-se(-PK_;fR7uQGg*&t4iC;(SY`reK5u@E9q3kwcg1Nm07T@ z$jzMotQb$?QWBb$YNuE^mA{r(eUj|^MTaegW<`TR;4qosWm$>i5V&?FHi3Sd>-E){ zS){Z8hV%$+a&Qqzv%X!4&e=zsiQE3K6k0JUWm6y;$P-7C2ukUK)~S(r&g<9bvUlkk z4>=ko7%PT1C+a55wSmwD0R4sDq82p{FONz~n}r zjd=L!n0=PU$IW&zv|5GF`8;p;gcO*+p?R7a8_MD!Bzew{RK8It`dV)c-}o}cfINeo z`vC>NOs~s{pf5~aXr!6(ZxMr1OaqZ|v^*nBjc*^3&g`?hz;)$A?f(YT})n4tP zEV3d^^134q?6-x8sokR$OPYW;Vhq?mjc2+lSkdbrJKrs^@#{1glfNC&PnLr?tIDh%{&c*|&QuGg75TaLmh`sS?&t>9uVqGPDiB_#u5Gl;q)Dvx~u)YoDI zOTrx>9O!K)MlZufsIU2ra(%vv70UUTu1N79*K8|&M;|#M;90u$A_h;nB_+zl&b?d8 zNAt~{Y2fB1@0 zEgmzszp!r9sIK8ag~OFPer!<5uJdw`?mD+H_AHWE{RxoVGQ%_PsG)FIhktM$@Yv-L>wBdEf^LFi!4NJ^Y@C*9(Qx{;OX7EV`&%C-mCeT`8B}Sjpgo?p8Z=(v z-C!+?RY>X|Ge#Z^kL9S9jtyCBNxq#YiFP%=Q{-#s&KK`hzPXi)EYFO5x08)NeflXd zv|IF0@YY-63}s0$%8`*clj&_oguj$Wu)T*NXLZ}@a?h8eBVVpB_u+Go-v++juXEIh z3 z^Ysx;aLpj`B;S`Br{dvMYQC8-uQ{@>laC&*%~zhx4na;@=r7q10!~Uloxo3Dw`$)# zHi*A)CvfiI;CtZ{s`8Mu(p=G^gtcZ{HKyR7_4(yXyBeB`feYn^@~b293%bdG6N}jv z0gEyxDP%RDQl4|gv5_|6vx~D0!}}-Df9)!-M8JCd_oxTA$~pr@o0-?|)?^?lC{^a;{-)6ZLWp4+E;R8LC(J^18#R{x9Olh?n1PlSSw zKhpgMrZIMQod*eM?jt-y?*9vz#{V8RX~cZh=>I=9seg95rMn<=8cm&CTs`%SR#Y6W zx{?shKS*~#Sy?l7u(!LP+5IP^QWVV}BbBV3O5jMdcv^DX;1OjS2aMFkJ{QFKfY$&qv-n^7#W#Ba^W+5`X zaaMG}t+zSnkZb1BPiz3`(Srg3@&AX``_DrYze5gx2hsN(fBFY!CQ`_nv2L## ztQ+|GNy`v+d_OUfRYVPoBfG1Zm5YsGrt?7n&CmHk0+f(Rob|0thZ$(JtV9B*p5pe+ftQ>tT$)WBF=Ie6P@ykbLa299q3klD(VLM}-w>FBK;YOyMX~JG?!P5TIL-_)))!JuANL@|al z_3*9-bt_PbtjB^#jmG+ag$pm!XUavu|8SRt%FBd^I(im&ZEzU3cAsgg-q}H>I}um^A|Kz_d}vj3Z=ez_W=Z8SnqYk7HRw4wYO3yhY~4DRxkvohghE0zvh>%T zr~f(N(CSYBhu=ZAe`#mxl4dL>BpM47v6EkFTwEkoTWS{vlV*p222lVHO*O4j6)hVB zSzA~i6IokMcN-zw*icUfB(;)iW?FWi$*W$(wVlo&4fv6|=#d-8cKHBUtzFGstm>T? z2V@vz=I_-sQhPGe!u(t?lD3mfwu|yC&1ps%=%nRM<%X!}Mpr>B1BbA8vCi} zn{KH}b>u5Mh|W5ID=X>Yp5Jc+zX0F#Z*4yv&Gr0tmxi%dYQX{l=@b7q!R!@a+qTnp zKm0qd^az%fwf4*{&$XWZq7*idMFOjZh<3_{AoA)Aj_o*d_*}XHBPu#z7#5BzhyANN zy$vtjyPW^W+FQmp)-dU|VP7>KVIsMMekT-m9}iz@(*vR>|NUR)LJS4Biv*N+~Qvx@bE8LE_~|ia~T3gQZL@Qc37IVfY zS_+EX=OE4oyFX@mgd}`{@sIVk3o#se&2%XCI{u0mWXs#vobMq~8j+P0=Wg_nL^#Cf zN>^@^mhQ=iyH}90fopm{Kn}1X8uGaB{h+uLoRIWNRlLdA9iG2qAv{e!@*-rsxv-Y7 zrs$}d_V;YsE1#}oTYy)nc1EBaU)GYNISeYoX)>KAA7nyoW$+2K_DBB&?u|E)s4r0c zt^MHRiuVbTdtVS3lrS507E(}VUP+rRdo9~feZY;ko1KSF_SansneSE1U9-0(kP~A$ z;+eL&wKAo$x;f1C8Ng>midl^jBJ9Y@ONDT$reZ``rQRVj#6>( zcD8pnsWLch=g3t<&Zr8X>?5|KtP{KZiANYoK%C`B9six3CqlJt0IiUUlKcFW2m`i4 zL{pH521n~O41+G`NJdE3xtZB*>Uk4Pv zariu_Sro?)&O7kZ)n-T%D>`v@z*pvJVZEC;5`n zUKuV@2FMe2PhVLCSQ>&vvQFXJVAxu8E~yC>8h%R^YP03q8|q}_VsbB~gUvm+A`{`1 z)4PlsM_BY~;^Xz64o-y$1H`Rlawk1#UywQC+}&K5JTytM9M$XKg1zv+m+EJ*ocpVJ zn8@C3>_**$qZlHB2+Bw()O=x4UsACNmUfU0IB)<3brli$jjKR1vNNOrh*~nRJ86`4 zjPJQygNRijS^I!tv`wjsQn-=Aq88j>l@-)Nw1yK|ArjqsWVQJt2#=}iB~imOYzpm= zLKO)wA?ErkP!MS_6MHSpIq}WSxKWhMr&9n{seqTUo0DHI_<=TsZ5JoE8UR835P)#X z-{rPBnHOMw#)Jka5@|;YDlJJ+bqF29&pP*q$&;qKp*D%fs)9T1kIdvGw~ zP&L(uzAvk-3m&iy$YV8=2Y*BXi&)O3I`e<>jW$N@63>+TEtYbjvJHkgFsO=|Lr+|E zpbhy5-lj*`JMg(!AZ+S`il%-mB(CmTP-&7i9v!P0KGw$*8c8aw+y^_Mqq>30b-mP(C@mKt9R6DPL5=z_qVn=^H7}@ z-}JofsECD8VcwE?az&4le`3 zvFDoM9N>H*>=|+L*+JB`4)7~Cbs|J8PE-p(1%3t)P>+Qu zKwX4{u}(Pgw5*;&|zNTzrX5kF|l&1&Yp2D?QuMBJP`V6_$^Bt*OyVFB&uZLY;7WH>Kp{3 zPVGfe1K`ax$N?nVd8L}rsyz5;XAU6{jcmbs_zS#1V+FCtQULvJ z8cqNZx)q_nKnTMw)m*k6ORPlNL3g17d7&FGfjoc>5x& z^RHO$lP~*M_O!F4k%G@?(+h zrbGVG@!heo$GU{sh5h~ADWL$D4LtF{_e>-vPg)n4Eee;MHK|A$I_Qk(wxwAqzPkCxaKi%yDXXw&%L=}T+k zG!}aMeY5yRDY0bk2}=U*sms0d)07Gnj5YIrx*mS{g&p+r;t&`(}guMgx1f-}@yYUKw}osFcR%Tb$l> zy@X4VudKlL5KkC|!d*47;Mf2sP0)0E_$A{OJ4uY5zuwyjQNh6DO3VBMlj2E8>FAj6Tht9E^c z!gh79Q;h1oO}d*C-!IvtuE|D)W~X#|CiTv=>YjJ)Baw=EVC-h4FW4rm1T zwyo#%1ENu%=19qYr}{r0^P(6THW!|88s6n{TBHFFyOQ%Z1JjbNnsx_E*i{C zohI>WA*_p}N4hAKPWfq$PAbcm8TDq^Q=vKY&{y3eDrViSJs)y}TF6RZ)ePA=({ zsng`f#FzAPCbi_iKK-jH&MlXh?>fo9(OdAt4!(6%tz%gQKjs!?8EQd_i>g*>3Ys-K z+G*L)lzNSs40xiLF);)Y4e;cddz50`nN{0v5lmf7}RC^Oe^C>9q?+WQ}$ zyuBy-B!+F_>@FTiPG${4&MzOh4U(TSdw-~$`$qhgfhsLb%B(}$+v=A0j zXj*svlwZGnAT*buejxZ9>$h($TE?&csc_1c`m5R$cCE_Xj?3&ofs~mb?f%9fzrU=_ zLE4W9u+ZVEt?Dv;x7vnIyIHT*>Md_|nfhn-M@QA+d2Fu!_Wnd!-cH|F;9#L`(VBtB zC;V`>q(pnnHkbeMs{Q7VJR&p(o#%Zw7cF|d(N1>qvaXiZq1Qc;-cZ4HUKntQoNn#A z$<9D}rV6`x@36*e6~ZSp&Qfqh)jsIlJKOhJW5jI(0!upFseW$vYgxO^XBXM(oP^BW zei8gXOE0)}%Oe`)z)Z)d=pl1Uw<^f$1L*2PqUZ}iddjy9k}zoAm9$-@IDd}-*sfLw zKHj+}jPZNzc&ENwaq-i}9C~Fnoo|%z^hE4ibDegA?r3M43gI!(x3dcnzn60pLDU9z zVQ3Y<<5T_ztD=db-Bj`Zu+4hlj_Q>Smd_#@{_$?k+%(N|9(1Kn+al*RF^0NGyt>I$ zy<`^``TVP_oRh4HgDgUB9lq+0n3phq@ImxTS4z|A$42(zu4&+-F9#|inb7K8a;Y3Hr~r*{5Q*T)rgE%WTSk)6ZK^t|&%O>;h%IA6I&zgGP_jrnT!kbNFw z+tXg)o%*Va&N3JJoV^a0^`!35bZb+7L`Ye8Zld0jjgs72e6t*j&YiE9Q2j!%{Rh8c zDSv5@rftwleq2QsUvZq1zNz5Tb&R`WIxp{i^mpO5W-e(g8yFg`!uEwOGRn~4oRy&* z80fAf(?=l@6L!62l}|_rUnM1lOrceO2T5AQjf!c$Z)4?Pk#&o)NmD&zOZdycIc6yD z$0C+;CmC#h&8&L2xeoz?EPC~#js0t9eRXypd~GIn;!*9fC`xoWFp zP&CQKugp~yLQDU1a@LM;gvn_3x7T0rWft5D^swU~-5g|K z#-KcndgXhn?kzZ_lh?(~G_AV!jM*r}a3D=kIF{oX0%CMR8HUIr7$vS~d9jUVL}(aq z;NNvhjD*LQoHT1`Aw)2dz{J1fLq2_(P@>{|2!3s~n0!L4EXc?mX|kEE$D^KD?>dR- zyfh>f_*iQ%a9J7@*PAQmAYRzSgy6nf(G7(^zXb=8O|acgi}ofqa3&ymN;_5$O67Jk z`QYy^!(Hr{j+%2IAIxd6oIa6F=5?J}R~5xF5gx7-^}rv0-{tB76RHB!8SiY%No5k- zjrIF;N-msuWXciWHaS!OUO_#-3^(MfsQ1hEF)6Glan>p;C8j(*H{bI9ttFVsycn=T z!z%BE5;nKWTtFqM%2hmdXDy-|es|yb)Zo?m)3YV~>h*}D*IBS{AD_EfvvP`Fi*Xc1 zL`m5RoKeO`Hld!FX=dH48A11)k(rQ5aQLTz@fBz9=ttr!xJw*%p6hnpjX<{TbyV>E z)g4_>XC8(kf5z!xJ0Cm&j{U7a^TQrIVT7pOLyO&G#D|5H`k1!|NjQ5{G)O+w#m(4( z$O>Wk$z6DnKXu4GE}sC=JEVw75@PrjA0(rfPx8M0ml<9*7NM33($Oe>FS7vh1H=%s zGL%T;ney)|Sn=TJpjXZ$Bn*TG9 zm}GkN>j-~(UTREn;Z*S6!S;z8GWy_M7Du%Xyn(VDP)gh@ko$ow+<6*nh%ZEMctpm+ zO+Tf9bDgLKsK~Z#jd=Q$(N;q?E0PHUM0OD5f3FI#%*0+Uk-|r*LW+{?;+A0*tm3Fe zonsG@2w-^Gz=AJjCP>&~+NHPC*Mig$NEwpx`B>I?;Mg>2ubQ#L>Bh2qVMl#D0#O<< zC8dP4Ibw0X>k(mG!an*Sm+LSgVun?)&cxlLjBQ%=oy`r5kgcv!z*uzS<*IQ7yM^Qk z|3CwgQV;2e2$LqfvoqzxI}D~LwzEZ*97HDyUz7C}5pf;|b+i@-Szo~rhc8tUA|vmS z3m)JMc<0YxG?NMl`v!J2Bptb>S*KtvO6o8OD2kgt(&9D2g};MV#3j{jgy>isbXFlJ zELEE#h359O>8S3W-=s`(9LX)rtVt6gr;q!AhkjB&&2*h^ABz$<^`Hl(iItkqVrRc- zCFhOW!75b^xi2tfH?^GVm?;vysf7$v3_W7Qgug^oH#p;tl%cT~Ht?a5R=O4Phw`ZW zyv#hr9qH6stRm@U0Z%v5g~hlE*dPE_yWkrsisL~P#=>m~*FWvWI2aX|WHgghbfN6NLoH{9Vj2Q^w9(p9&Ttye;X z&6j_Gqh{nf9%xzC{uiWOZ`5fU3qK35Bn8$D>fk(yAs-vGiaUSe(t{-OG%$lj;5xi` zVCaBx;zysT_AKqy9%_(b)T_8yJVVYFB>Rq^(9(hcD@_Ys;er7%+J+e$r~{#+Adrc- zSmeSps2+eySJPaC-tkf>Z#v)`nG1j|yz|Yj@GQl^G3<+D5=3cUMGySSvA-*#&q;Vv;fdi zO6!zdHRA|kcjJHRtgOQLqAqBiD(&7mEw?thrs-N7}G?nU2$wkJ9u zw|{Ys1#cSX;+3zmY%$w~Nb|T>hvAc@6`1h5hJ!k41>#8d3bL{?@Q&eTl;H-~o3IHO zK#%J#t!5$C{|>YbMXSDIQKeUcmI>IvJCc6%lh=X0d z1Y~yhDSn79Qf4mGM5>j$^YFAy}1{XvK|UHR~q$)9IK8;Yz>03syhvhBk`+=m6}( zBPtM%t#bB70MVqc`~~&m_{=-thEmy#1%&;=Pt^xQ1Cph90dX2V09R2LP4$VC3AT<* z>4?r?mibEJ2n)rGAHtpjEKsqJh#En?ct~L4R6~*8gfi~mz@-p8nl*`&K4E3Ihdl+c zG@8L1@rTWEID4kkp#eUdjUuR7SGF zDRYZ{D-cUtO~k_f0l~2sOna~embMLZ@E81+HqrXo6Z&4*AhIeP3aLdLWSkFL)Uw4V z>N-U?fHAT;y<>-DPG@B^f?F#TJOW!GA^vg`hY$JjF|Pc$&JUiz+cN?mpj?Cd20ky~ zhsw>We2ZpJG9BAx);c=-Bgxu__W5vH!(-2bmsr#SSNVN|;!-AJwP0So{@&H{0{^^~ zx4N8v?Uj%N?;q7E5ca5#zYj6lx7lYp5&ZAa#Gp*Hw&d_OjYEHen zd$s2BO55Z94IcN$ddur7z3z`q_wJv(ySPv=exJM|ydI&Xi&`IXAynj$?$_%+r}`e( z?^}BdU!eJdp7XuW+usAhKff0+2?ShUCP)o^A7mx_KLDD2Z!f5ZK6hAGZ>TxouYZnK z6>k(ZyQF^RsuZ@YE*2criaM8DWSL`5PFid?Gn2@O)F{Ln2RF9>ho3J6+BX=yH~Mtt z=zl)SoVk_W=$wuHNcG{XB$;<=RT7x6O1x^KUIv{!!ELclW{U3qa{$qhE~KchF!&pO<6WW zN=9avVJ_zjm=s)*)~0*K$F(`7AI1JsDb2&gNC6B8c!LD(QoOUqz z$RY7n+uTICA{axGnkR-nA zU49WpV4QBg=`;W@p<9F!^D&aAyZTM&=$tXzV*Dl=lk%&GcYFa29feR$B4$&cJ=NT; zM{tg2f7%7N&lShWc{zX`zr9w%saq&+Q-j?>*BYmxY#C@$5%gzc2io7K@eH|@d^^XQ z0!5G$ITR*ba^UPFuo)c`rfKN_E9rnE3Sbrs6vw|Wj>v$!;!Wi!pnI~fdQ-@hOyfcr z&H7dD<|?Tf8C!={7&R#0K(5w)=G|0%)ymGna?_m}U936jdt2A{^?Gy;$_~aU2?aG8 z!ekjR#opKEKyTulIB4A|jQ%2tO~CoyaQUqX18Xz6zJuo1L zzue$VO(j@8BwYB5X&GRN0cE&4pMg(gt}>#65oPer)BwPYJdLAT3VOOaCPtUO`f(^a zDvgb-Y;<&)T58g(x+!q;#ryJ?)ztjWXoFH%IW}fR=q@hUy|j@o^z@m5zI98R2&cF$ zInxg_`wqB_;DWr^JdkXPEdj(1RUiv(G#3~-2A~gGSm(oZ7{{C^3WpspJgQGQDUaVAFnns}206*ySGw`eZmg8=!9;>(JsH+=6x=dF360FTo^Vnnbg~(79WW!NbhT6xqY9%9f48%qq6i!%S%}!91_u z;DD|u;+yWiHP+ZS| zPS;(Cf^8!vHW+W30<^HcZ2-2vqyDNpxSeV5XZ#dCZEuKB=IX+`$*hHR;VnKnrKy%b?Zds5feX9TBW>PgRs&% z%2-|-`x5Ht-cKBKq|(hWmo|PvuxpURBOQBk474>Ea|HeLvm@n=&kg>Gxu+iy+f1+b z^aCXh1CVRSh-><3ht!YQz&GuUZ3?`6ZJvax0f;A?-Hl?ZL%cNEM_b;6Gt5}lZuxu~ z*;iJqlKku^gbI-7jh}nFF2Z&>V|;jK&+q@7`Ud&WGjrUCNr|6-BN_iddj9{4Wc&y3 z{r_Qp`|psd|2Mq%zf6}qYI%iO*;b}V&IZWyq%bGYyXe0Fx25ReXqLZ7ya5TIR@Q^X zoq>rlqA}NKWjQ&kOWRJj-P12``u4B&srCL?4t+z4=YFbIuGR`VcJX#JsXr%2<(TPY z7?vZLni%ONCt1N47VfYJz#D^e6EmLC&{mkImIx<)?-}_Kw|~e^N-zR*OwH>ot!gZd zO4D^}bhWZ{)G86#$hkL>$@FXT^-{9_>RvU|bpDyzL#o>bny|r6h=oa{QD79X?_M$A z-`|^CQjnjJpPvg`v0X7>uw6d)F@xrgO-=Zo39$0=nnIaQIJlBOGX|zO-mrdmA+qHQ z!vC&VDq49N3DWBw$-%2T2pTzB@hnhPeKPv}0lqXjHu7-=-kgzPWg;xBVBu^6y};T9 zE}m(g$z6F?*+T`~iMbttc`YRISKgXT7}6HY^Y0Q*E}s1T|C-3*HCnHU!1_yW6Zltd z^4b1RH~D6Dp?%eUb$-uvdQfDVWh74${0+Y(@ROmYk&z|DA|=o#5@k=!GIb^dPRiwE z5>dgZ*HqMY{OVG-t5sLK(XL%(2-0b%u@aB&*l$)e{BtL^DcM>d-*dfX-Zo>VV)$+_ zzB@nN`@H4S|NXr=&u`6tH8-ipa*@J+NB7Qmy_ettSl&H@;sW}K_-*$!N$@3F9 z-7@)S>O6XaU#>4DCJAX>A=GTzqlX?B|V>l<(%d8l8qX58isf^@!%^ z7N{Z~0~eCG5=&dd{%E>53HVn7LiSd2wab*eAkM^C-S6g{1oBDK*ML2Spc0*RRVeCh zT>ZQ+5T-VVB+yqQ9Ojm8bHhElc)`6JuH&8kLE-Qp-S~8^y@85@EiR5+MD5+Tw`hxy zHDEEV!+GFLfg1t2;5F_Q-#{5w#2=FH3AT+repXsIPrMwHlu+4FA$?LZjdN0t1ytg)e? zqM;yPA8X~v+L{KlgAr*|7niCsIU1S*l4iDe(+> zZEmejKJ$c045gtg;&{5^8ibmlM8sK?A3zq6)q~ROY!k*Pa!1d!#FD2i9iBF~DMgv7 zsJ^Or?w+F(24Ef>)& zL``Q)Jf#Y;Q_v5!c?4PaldT*nzV1YrSi`{PfM^?)ayH2LgdKl_-I53;$%m;$ISgoV zmLwxW3(T0HS~a6@M!{IBp{1v*ZA_se16+R%AxAgw9`6?MELff22`g1hLl(>E14l^d z3y@K-$b$vS=0lDFR^&yCd_aE$D3>GP%en$jF%r35N=Xqnco|8YUjdQMhO=tZ(5+t% z2%W8@;M%9mqq0@uy>SR0EvbURGlWN_7>>ATfO6|qSu-WJ5|>{pNogpp0&$CAx6eu+ zY!93hk2}(f_rU@%s7TuH!(rJJHbd5uaB#D6EENnlf32)HH8eKY{}A2nYE4I(hj<<< z6!0K1!2O}al+@_;r+|$L(c5qHFfp2CuSzWf-AhqX2Rmsn9AxD(eh6kj&(LVdMdhksr=K_#(7uN zhFHv8?~gC)0}1I*sr1XZIENGLcs!DqhRi-$1V{)Z>wdPQ z$F5R^eWj_pW7;%EU6kLtjsA~e$A5HnHgvLZ-qTv>&-GTDsICu7#6~#!cUh9I_w=L` z$`w^k(%QL?3%MFwz-C~Et#oLHOPPSN8H5kGhewT07MKJ|TUA*=l)=_SDNu4mGaQ;q z6DY1AX3#83+A*=|A>9$ohZsUT)479TB$Gx zg|w+i8U;;~#(~5H4g%GX>XetdF#O;cT}0&ho)WU51?-k;TFi&cC!;awwO4+f8T6W& z&u@s+l9CD!<+xU98>3>|+Ei3#E1Uj+aiTJYFEdonWx5ct%Ge#GWx9sQTYTtNsJAS( zRlN)|e#U^ljb$D=doqb-K63K{Ntz}F*9*SGD(+kw>)?N??h$RGyv+u&VhDB~XxC3Q zXf1Yvi@Cq5P#zZjgf7RWBsWHk5tX9Qw5AS=iyRIDqx<-!I59-yo>BeFgRCNee zBxbBVLpNx;S6gSayL~6`;9)V{-5+WV0Buc;{-Zf(@~>tZUs_*`U?jLSgGFqLLziS4 zmZ^n1z5yc_vmtcH?w*hlvyjL5Mt!Rr><!)7loGBsCB*H8GE>nB65y29==Gku~9rm1z1(Zo;@5 z3O=|oGOX1DZ{)b$At}bY4U)1VTpwa$Uspkp=<`Y{L%B@h^c39Fo|%04RN7bc4F(0j zNTSbhA~A^xfhtK3*h4^{cp1t*tJu>Ql9BuR@N4>=!rKGm7mk1$kSDC25a9EH|1en; z(>8o$(KXOy9b9TUUpVQA{s7aEcLCIn$b8{zF>=2!>MC3BYi#!+tUcA~qbBRYvD-u?O)N>H z1O?U?9bAcz0i}|Y80GMvdgaPd7a-Ma&?v=ywhaoZqH}jhfrx`P zp#!A@_fJJ5S-iL@AV&xj9qW}IU$sP&1Z3y}a&fa#@ocOLQ+VI$q5pwUne62T;^;D?28{Uc@a$Nll68pKO@6 zn6|v_r`aL*XtsSiOok#+A8{m&6W#mF!XLd%CNbFSX$!7t;won#=jyPDgvix(EtDZ@ zT=D=*ws)PMg?aHv5Vl!}7;V-Zx{t$ju$BYyg+Ck=;YUjKnQ2+%KaoqD;aBtAK zWeGb030kMXs*w~Z^04PM+fEGI{gN_q^#yjL&nU6?6BN&N)Uj9ogfH_b-W{A_8l|3d zj)t}(i63B~l>MX|s(sQ)&lLpyu@T=@q;;nkePRjvkjOuTek+GA%_WqYD@!-FY$pi! zkHJSmGsyep~MZyOk>v7qupxD91ZlJ}&_;|j=Soksj7Jp%B z$didX>W&`7-nmZH)T`XbhPKF9e&{he41IrAK5^ZZ9`trtdj z!lMygl$Hk}GjYZMRyurQrLfS<=6At})H<4tH#Z;A3|ZxcTT*BwvOG_!TN0Z)H1hf( z7Unl93_0rCBBzuB+2>`DCnkO>If4>xHH9_S^;NNz*yWb^yd)-h`HX3b;q{F;s54m) zpf0#_xUSXFuc5627J#e}URF&Q9hA-~{;TazpsV9^KHQPh5JC~SKQ4eLYY4+QhX)9w zO+DuUU5tC#Re8kW)S8*sD_OWh+z1q6@DBQcia)pzLE%)&=9|MEP~$d`&q{)ad5o=( zDId(!!!Rhf!scEQy{G0HBmgz(GH`J~+j#8rh}MOvat(dGPxLKcH2d)PhYD@DWT4P@b6@yI6D*|Ri5ynq)3&ILT!9&v2K7!^h(Ar3BqG7TF z$z=;Jjlv6L?+?%Jjswt{=?RZ4kjT>K41`#Gr{$R zG?+7K5Rx-bB09%Q7P$?>JvlvCoz;*VB{z_Csw(x16y4ja#B#n^{9}4RVKyp{_{^K^ z6TiW41w8rza617g%neR z-vm(0l8FcD&e5t+G}{FsRs8NpZAyv-nX@)QG^Lpk2mO$0*g<)Sm=|kN6XT(jXa4Y@-RS4}!VfgLEA_yt{gEzWc554Yxnmi$9Bc^BS$fnc$! zMqG*K!V7)@v?@}gs1KNw+UfmO-{?~mY#$VJppYqBw?uouK;$R(%FttiGAmmTPz&Ay z#2INCbMW#z(1ra`M+#ZxG$^Mi505vz`t-&%a9Znp@_LVSanD06TZPTw0~v8_ioVz# zKtBO~O}Pys*+l?-5@O0daV3F700|(YgJoS(Di$e@PJ$6IZ%SSmmU0n0BY0h7FF84(MOo5VG4#K| zb(XH+Df}L`laXaIMO2pgs*UOi64r#9ho=3PW>G&n69~?{=TYVR?+5?(V>AYV77{eS zak6@Xjj~233?wJ3k*DbhL1~Ba8uM_ffZ5Y#48Q~X6xKnp#SsXTf3GE!~@Ca7rq77Qbd6B*D z8fC=q74qRop%ylz_?004GWDElMDOY^BZVH{taZAw!2h-+3v3RWFvmbDVL@dI+}<@mbx0uVSQJr__)=bnya$N;Xu~!*ro;SEI%c^Y zNH@;@0~+Z~O_FEq@J?oD+78T#g*z3^C$$y=s_h0gGSWj9R%*#Ik*6oKgi<#$O>{XD zP+#X_2lP;B#Mq*z+XfJWGY|0tzle<>5+nrp@?>rYF?(^(GPoK@LjB#=@Z$8BK{`10EGk@}3EG{lHR1hmJS)=n0)vhV%}Z0#96vB)fb0@9>B}iS z?BM^q#|9VXn2Q*%on7D6sg=ILPpXZ59Vd3Ep;2;&Y?A@O(8AX9@rs?9Lx(Okb+omS zL+7TPVsz)CP%hD^dz`@pNM!eD7rF1rKeqnc3^d)~_ql$c3WYKB7lpXBJSB9m>zTC3 z#`s%Zp}&w!1OEt0=h6n&YgcKy3KSeAviF#L1i8va#WE<_o$@m_gEb2ar<9ZgoLOTX zeoU5`QlKr_Lq&K(O$Odr-<#2jSYEL&$!rQjH6$#2d;I~S9P^E36Wi=2Z|__x!gIsL z+UgH$KHNsxCoQd_mq>a_oirkx80pEf6t#OWSlQ+>OEU}e)1wploD@T*&IYTfT2C8k zYi%!abM?oTEFGWi2W(c$Uz}`n4mNqL?WL`?y`~1IA9dic^Exe_lS}5?{FaQ@`c89G z>eXvC{2tq0e@X?$AuRiQoR$M@?=hYW#(7=)<_WQOya(GZF%4P{4`ki1-o{GPFZ({S zH7`2vs;c`RFKwR;e6}Asw_b9y`+V-{+jrdGpRWKOr_Vnf*ATD27WtpA`metr5%7F( z3<=(DhvPqv7RUYHUgrJ3q74O{e%~Z3@_$xa=J{Q{V)}m`$V$fbeN6o@;D6fq)6f4k z7RkBm{hsTQ*!JBUDf7!FolIVpge9+9y1O;YvT(yD=AN|Gq~^!?Hf!qMb?qw4jY7A8 z(GNGrQm<3jPm^c1(u3r(YW7_ziKx7HQz-Q^7G>@D6g7s3`pK0=kg zp^FN_!3tHQ0nVWcnTBckEDPt`%;x)u)2IFSfa%l5Gc>jHby2^wJUf_Kg`|^*^1?d^ zHR6CYUae-zcFV}TamLV_br1tkgnts{bNS zLhxF%BfnMG=N^8VMEF?7jz?*U-D8V3(Wp0#L~>q7wis22I9(>_8;R#ti8=rL z)(K9?7ERa;PB^Vd*kqqbULNL|_oT{ZOPR%)qL3$)k8+f!(%any^Q_Svo7TpsnW4Z} zmPN8qg|c8ubmOdM+GNW(sd2hATDI4y`pQbSj5jesGvfBMhx5$-dhRRg-hPN{;DAd0~DLLj9A^)%hN>!Z6l z;j(sKtijJ30xY?pqjN|ZBeD0zAcFOBz7odPilP-eHH68xA(&xYmSC1sp zALBjhN4C}yGGcxXPB}W*^-z&5=~^Qz4UY*WKW(JN`#cz4^L0kZ!m}3SzgJYk#xrNC zlG{3rWp!8Z@!MWhYMUC?8aq(G?MckiGvpqG$_SwsHQ&l?$FZw6srwZ!0r(7au&{8a zA>YbIR*&)1OZlGQ39=X`d*_S~iYWe_1SCJ3hsXZRFW)Li5Zz(gHklF6*)1YgYcf#@ zZ&dJZFp{40XKpxI12R%P5hW301Qg$RVQeC^@~y|+4$)n=u}%-x)aSbzZr|?5`bp1g zDxS@3B@F=?%*yX$T%6EkVFi=Qq`QdH3L0SGxs;=x>ytzT_8aM^uc98WBe)NdD~BOo z=ZklL!Pe}+1k=5@bFY7fL8BnBzhJI%)co+;)WnFWavz_?>p-$;qmbnB=%mVECBRq|8rx2b+apU!!OR zgyMqR`?8y$%<_bbFR}ic6#>iTryS@y>Q4C;-@fSijI7tTy{8pxE5Ak36bP3PN0*b; zxT+e>rr86QzUQPZ+}>jFxUgyRqC*Yy9MkIlH|~ubKB_ko3GKG&LuTL2z3_6whv0vn zeQ|ZIX%a#L0VQGlE5i?)|8e-CWp9Nij^%IZ(fpiv^pthoA`NO;tFe5v!Dj7~O3-F) zXZtI8Orq+{y_qv|b7woR+s9f~cM|dTP!U}mNg3@nJffgLP^ zNcy^`-+sG2R8+Iy%j5Y;z-7Tl*UIet*U{>A-`j84l`aR1Z7GR0m^AJ(T(7@Y zIXG9VTExT76HO`!-eIY@^K$}n%^?b0q&gkJbD6104$y2s#;7)TesZdb0Yjq6MFB@C zTFNg_g`GOIXl{9RI(fz#2AqwWv|&~(q;Xhy6Dqt&4i5J5l9!~k)wZX&xw@;;X>afJ zWdH8eqBI@B1`8{q%&AkADwPg>^+xNRR@u|5fmH>+sUCn0O^b`)Igkdurq(am<&Bv= zHEIu~yg`l5NKKcn$YT$+NoBQFO!r&NHi?yaOMrOiWKTq+ z0?lR9XN!tZ_{;ww;>t+W9hj0Wj7P-cH-dvSFowzIMdCatpqZdPzS42Xv3$$Tbbkrh zf1Xq6|I`<@%}}m!hgS7gruU!DEk5E6TF60?h~XY~h(j{ztucR9$|QT@pSttuIl0(; z7&JxeaFbQgM2y45iZ>E>LJ&Plc7Wvxb^|6s3-28KIlPbb{Tv#NpgyRf=w{Z0t2Nwh!0w{gS{ha~ekt-!Uq4NV z{h`)`)kqipE-Y-M@r^uAj%Igt4s5znEVo=Dy*~dN%U`>4?f7(U*m{_t``y|p#646D zBs#2~1RZ}oKa1=AP6(X)D4fcxd-?%ltA|G^YRJp2`S+toaf%C?WeT1i0fmS9itFQ< z!)J*le$czh8LO3s>?@R}#J1XdG$p6rtbm5pEz@7?F%V^!bQgI)A4g`E9$MV7$cf3a zUyM5oNZV5EZjS3#KgQ4^@@i;Lhe**J(kAD!G-F6vxF7GgzL(%1MHsPZP6oSIhgo>J zLcYs22YFORNW#G|b+wLa=vG5)XLnlV?H=%)3jb`V6c!vgy>xLfmsGgo%}%)4mwM#C zJ{=PpB6e^z6PXp-vi{P+@O5h^Hrk(l$Fm{2z2SD|l>NNleC}7${}HZY+C3hbOFUBS z;(8eQ;6$1Aru50gchYa=a1+dyySKOcg>=9$f?VZ|QbA+!nRN@>^3HUiz$i?06H45G z@~)hgQ$|H{pwLEy_5p#c$9p+$%{{3;HzRsc;XTrAC!mAgoGy=;z3|vgzdfLRT52W7 zyv_ULQWV*7Yu)Mv8ZC3Z*<<|conVW%ZoX4?uia`p6K?oAHt-(s>HA=1!dfF=f&xku zGoTy!1-4Bk#SKp-Dig&6TRtOp9tZ}@HihrDgK4EFftCS?B}#eSSojGQGOtx)Dd}NL zWIAma`AUlQlqPb(2BN*hv(LDQJ2CU@f?FcZ)rK6xN|#nhfjM5t&W?bs+qA|0Llu8G z7cy}~en3!sm!pEvk0`>_5z+4s3zXSZ*Y`ColZNn<8B@9Tag9S#7x>hVdD9)qb$pmN zkddWDkT+OjAU2$~w=Sferma4JTr>FK=$+UUR3E3Z=f|s(jU6Ho@ls4FUS+GMvA7|W@AJ-J<1d>#FOX) z$+&Obj1+gH6_>}1W+2n$UQLK0Y4T?zUo;_VW%2ks>VvmPgi27fFZ(^pc(3pE7Kc;P zT`%dLyr(3`%jB_?ymmg9BD_!B|9nk8#3kvl{!7G({})wQw*O&7|L;O5`~RW8 z#z@G|)Ks}hGfc_WI`~J4{(lLuw}cb0iusi=o0HpN6J{qT00TpVfB_(g9Hk8LnP48@GA@f0ZHCI zV>YS@=2h0v9h=eC2Sw3T(n;3wsjI2WyRomV zWa{v&g);ookkss2T{}BH`6>MDH;3?_%Yj%2b_(flJPGu#IPd>^JjwEZo2QrznHbF6 z|63W+zr~aOw|QzWDIYH_Lp4k1;%`}GBxxm0{8bJ97ajRH{?R|?slRTte`MqkR6XHx+2zIWS?>&aH5=G5F`mJ!w=0$%S;>=cx97J1)vfQ+i-9oSS(6JQ5Nx7 zDRZJK!=bXQT_Uamyy*B-;T8gdDRtzlg{_`1cwG2Xfn_=d5Zi@wJQXK2!e`t_QOfu- zgcM7KR4|LLIWsX@cvHbuDr^D31S1DSP~j{FcOi|1JXjBk&O;xd>>BIb4%CcIELKxU z9zhEV`ba!?aBA}06M{;!^?2<>TQKllRF+hRm{W`ack4nt2>&?UmXR(<{o(%)+|oZw zfy^xXivPG#yZ@yE=3uZj`)>=Fefr-DIBfs9IEBQ%v`B~(>F5+_jB7AxEHH3F%48`4 zflLX7%IO$^AV75BXoNn)=m~*NC}{qx#pAGOS08Se%Gd8qUQ(IwXZ{?8@D}tzK=b4E z<~{M7z!m3byvmcU_+U6&2@xoQmLn(!6w3c%?j3?O3!`-1R3$5I+jgaG+qP|IR@%00 z+qP}n)}NWD`o^7f$BlF2MEBrKcEld-$y(ov`1ZS=Cp7?=jAS2AyDdm-OaSd+uRo~y zNK#QSB!MY8p}2{u;do3%BetTff_zz7O-RNjlh5zxx{>ux_CFV^7aO0=f1f{N`9H^> zq5Qv zH2(+B!T)UwUT1mmYmH`)x)6m+AtfLnK|0$9AsqAslUPs1>ql*~OcUZQFsoL<@QjOP zRdHlhT38xol}K!?`7btcL_1`XS*+m9jBH!8ll{povM>a_Y38vuY?aA!UT43Ji*tWS z|MRo-gRzsz{`mfFdcxk@&d_xlC#m_Ry7o&Ag{`f6*B{3h!@}PiAzIWZs<)%!$Y^zC zmXC9xo-Eq$)R-lGL2*n9A!5iooPd#6BZWv!d{Hs+iKE>kxWn59_@f-`!5zny`lzu} zM>BS{XZXgybN_Ang>LMZ1dv*^zyg zk?mi?++7$g0_rgsN`8E-GhK`ZpOGe;0BzN^72r>AS2gx;Dy%L}+n_iZ9osRh!5qf^ zMzuX!wA{^W{=itgtuucE{I_m6z{i&@{n5HIkS`#~)@^;y#)>c({sk%6u`e>RDOwlu z-s4LZD46Fo@Dv1TaeqXhg@X|OMTpjY`v{0n)ks5(cn)oCWyJ;E`k9bD-}EdbyAEd1 zJ-i$5;zqPtA9FO|$d&8rxA9{De1k0;r+zKGm|;*T3s!cC@xsM=lPp|ysu&l7P-a+R z_Q|4!V27e`ZR#9X@slp*7eAAapa5U?NM1RHBy1sX(0uyv*|Y)9n31$OW~qyGMou}6 z=}IaS*JOHk@)YRuRJi7e1!$zHG39jChf39qsHz?EB|nVS0ols=KQ~2o^_Bjroxa=7 zz)g3u&mP;$5bo7t3I!HQag*rsphEVxLibAt>g^#ugVB0UBtr>{6Zg>ZH?x}3|zh0i~v20^XaQ7GZ$1c1hmp)l;dlEZC z@E)bFVv8Y#$%XUJa$;`0$cyie(zn!%5W11+?mQ_%RGm|lC; zYvFpsIlf#mY{;cq(UpGeHIH9yJiReoPnm7VdUtXFe7|@y1ST-glsq2Exk1$5qA(+d zznr`Ybtsg>|B8kqBtU-}59}N77YY7JP2pD~En|Tii2|db&Zj3g_(N}?n8{FzJpW9j zQa`3n6*wW{lU%TGId5ETK0{D~JxtZO)+YIzHR3a4Xpr_`Jafp&2FbHic$tvVHjckl z{KGc+_byp_mk^VgM3GQ9l~nJZm|l%BGF!y4XW!+I@}$? z>@GFVR_5@X)FLc#rkzwUp17q~`GvbdiNt@I@avR$2$KrJ^m_%&r?jeDhxNO}hH?Cf zlb6Z!LC58?t+yr|Ptl!MqlFSW^o8l{sR^%*nta@D|F4Tz`Q{A+;Wo6zu)SVX&0`BS^{ zvS7u1Yx&%*(&u*?C!lm`ytim3Tc(h{qv1xyHk?bd(t+mK_F4?kV zVMx{0A?b_zSUk#+N|s|*jqxv4v$#n@Sw~TYZ@MLk25YhWbZI#zRkLOxn@L$`!_pVW zMLhR&k}6N_BEu7wOZ|v)#W~gLlbWSy1*=kXhKCU6U|J1ZX{Kti8*9lcdvR=2k=%9? z?`}%J`K-K~aT=Sk^LE0#pVi2i4W^Qt@st)5rhLgphD9KAX9x4=bvkh-b7@xk;|-0d zTng4W(|cn_i|Mo7EY^BFtBc(VV8&Whuf>yK(^=1T6?FXz-XxYgi|1MV1#p8iq95Z) zG5TaKyK2Po6?+=RozDC`nDzeE9<{IiY+iGIzExx9`01Cx^`L#T1k?UVf6O@Yuyp8A zl6&IPowfQSxieEV5m>#2`S?+1cqk1l??su)U1mgcxp?GU+;!IZ znS1st!G70ff0o+@C=w>>mKmUBtOu*g?gQ1@vy|9#*4PKsnn6Ef#qZF}YZZS0r~9&K z@Kw*z7ojq$h+xUYa}O9~>CATHM+9#tPxVVq%NM`TOI{i!gT|`G@M>^;4Ne4qsZ8xtO`9jbpHp2j ztAO&AWBJrregszpr&gpJEoaA)2qREDe`=1K0jS9!-!d>C9-CmV?AQCuCQBy z`)V+Ms7^oCTB7aLn9M9$np#cYu4wL7;=bj%J`HZ1$6BJxE;F89u)w&S?5=3|>9OC9 zcFglF%ls7E?pFo0o6lvjr~R1LeGf9+r5ijs4LUo5NIv#kKGtjg`(Xt-xfW+@Yp%YmZ)LrYTt4t?kNRWzqQLpNL%Nw= ztD9ZT=MSIJZ7UPpZqEHoHfFA~DVehg+B(y!&D4|a#Fm%ZiGkP&SIv|hw+7Ts6_MUb z2d&1AjfPikN2CgTwuR8DjlDgc z%1`G~4qsU$6GQG}brj{4Le=F6Ac$NFc1v((NvR!*xLsuS=*EZlH5>hLN$jDEZ&oNW z4ZON+XLQiA#lR&TcJkdvKu?R^UlU7YSgcax9=<8Jv^6^ z-pd!=rRY=CX*9IRh>Dq5gD<)%dD>`*&`j(Y2x%0;^%b;TEB>oAkVH%gqct_sw3;%L zX*;nMuI_cHFJY0XkYc@N&(&|!`+I75sRJ_J135<_knn!N_&V_-dc@|`a8D}XAeB`7 z7<6*QzeVFs2AO-S-dJ)LakVCmn?Y8<>VNW!#gG-Y)o*mC*x#H zgxr#&xh70?Oip=@iR?V;YrBl3I2x+G&u$*>y(Y|lssY}1!DYP#?rI{VU#Me2s6x9n z7(cSZS8miZx8*3;)igV5>-XJ~N1w?;a>_A3d5$mT6ORxT!o(`W5S5(1%E5p(%d_>0 z`_oEO;^x5@(R=&G+tKOI92?#T@5ga;1+#^X&%-mGSy6mX-jAWk`BS)INVriHyl{6n3F@8*`eAmovu^(d#`Wy@44JVIRNYT7Dvw>vhV({?~UF^p4^95?W0(S zU(Cj!XE5-}4XfL^*FFqhx2^Rt@7q_8hCX5icoGZnzj-AXuVwz(-{w{`Uf_U~OT=`AK8Y*y|YGJKj%r!Y<2iiNNu_=exiaw4>ZV@wKebVxSA2PtKsy}X+`(@K(zA#Q)~-EY!1D1fbe!) zVl7jtiQa7c)v;@LcKuUWc(k(?6`Rg0Lt}9IGFI<2ipC#tzCR*XX{L?=bv|HruyAf( zoK1Vt9s&Ps9@wX;d398yGx+fQ6z%4q<_keOl5Eh&U3LIrjCre;jTOg9Kb?DfW3r$+ zy1)bJEZFcvlT;|r^vndY%R$cSwzG^HEqXc3^g=lD*)U(C$_}Bm7VWhP5uPn_RCAb_ zJraFY^6w?d$8*Aqow#QYB_<%n_{w#BDm!6#M%X~DU?*j*hq2yF>0nPM+$d%UQ|+KY zjOt19nb+bI&0?1Ad~bW9-m8fDhfL>62I+Nw(H+Sh#e_^jRaik}a<#D@cn1^X! zH{Cb4>dUJk=XMf2H!k{%pY1Wp`rcpr578=qQtOZS&ZE)$UgJak=`l0?1Uft^3_ST| zEJ^DRP5bHTcu*}_>=%*8$?gxU$j2(m`9+ENVKr$Zduo=R7L}%&W>-(sA$IW?yHse8 z3a78v`BirDDOYby{hMRF?tOhm%uks>%38Jj0yoP@xfNG{9PNYe z^<1shsGkzor^EI8qD#Sh#{shoZf~W~w>JBhbG z>wAODr=yJ6gA6&0G&=P3LCZ*jfg_n?7T+L$cGT1xPn8ui9+S(}Y&o-^j1G4y8GuB_ zkI)8pe;4}Y8_Eg^-B~A(w5n|A11Y||s4c(9$OWpQ#JDUSr-*3ibl7f*piiFK)Z=I` z880pJJtO9K>x)9Z>^CYung{{Ts-bmj5?p{OG8*lwa~D)e&1l&EpgR+6rbveBwI>p+ z)nU|>J_(Kkr@nPvwT{ctONkMMuDxs%k#xk9$Ki#KZc~*BAvhPYI zqfe~(9r{krg7%2M=x%94`oce#U0hlUe897MXJuza7r&miyt)by@dh5>)pm_g;AAsr zC3=W=orq-+F2jdk0&YMD&e?4p48ShVwyD$lALHsuE1|JYE<^k5l#Y69-;I;-_NAo> z4nHG6>*DECzi_agIbFI=>%uJ_9`$Ijg(Ma>sg%LR8)}tYDIIK4&T@<;MkO^ zO&O=gIJiK{$BH0;ptNu}8ICBDyGB zJ8p{AC$$7U={qS%Uq%CM#t{5wXBhD5-$&9hOazG^G}GyUFlbjo50^uE<^wbQ>ox}C{jEuAfSZML^BfqA!eohi4l z2>=l=KgNDN;X8B#fQWx@QbsTIDLs+GBnUu6;5!1yk8ws%U@djF7e|9lwxu8-gep1> z=KQS@N?<)L&zgWDR#Tpkj>1c1aVHxWMHvAhDF}v&09%?HImn%43JMeBoExNhgK;Wn8uNU)JiU?4U9@@DM#L1r{0@0M_ zkA$>}V8B9@RFW9SPf#Nf%Z&n!6lb#lQbz$x`Q< zr=5`^dr{zGjKJ9#iIWKu7c(v9xBjxVWu+zK*oA$vnj#w|A$cA(aTzsz9yRi6ve?%(7%% zU?q7i1AZ;Mn(DYYviwh+eXO1q-~h=rrmi_)g9Rf!wzw^e^^4}uy=n8M@HX5#zC!Lz zt`yu%_1hc%$B=m3p?a7jn3io|ySqPIan;a*Tq7@?`^#s@Frzn5ZQVUyeFE^bf0+7# z#K<%m)L!ZaW8UKS7U8pFsHl&aH0Pt@Gd10qrr_8?*gHFw<>O%Gj7Dgzobz?T9tpVG zO_g&e!97yje%pJRHlsTh+$td8Ur55%V;iiQ?iYyju2miuc-$QA9Q7Sek%CtPSLR)g z+lCA1MX!*}Z3%dueMz^Xw-n%E`}jr7hkbp5kh#{cXCf$2(+{|GL#|5dvH%-E!&h2 z*CIF??;9sL!h7IH*!W%bZ-b}x7Z==8U^d8r)|ky3N3rD+jW{n>qH>TBPwU~JQI!$t z=K31d*hy38oNMr?^Mnb)ez-y*@!fZuzn0L(0bBb#_<4*|e^0gT?Mb$SKXjV28;<;G zU8nvLo3_POOK9sFBHvNnE^MvHAZcgig*K6E-PplMhd4iHN^8x(HCF5XuK?Mw7xzen zTOX-@L#+nDf^;Yg65*7hVe28np(WA zzkqR9kfczs2bn^8G~i|wK2cD>D@FTSis8&d_$%xmCtif4 zNJOGf$xKN~JDE&?V)!?YkOrz8GT7j+vDJRPk2yF2{}vtyq_tdzi-a%~1zfmW$}qbW z5fz96g@7xGfdF2CvuszWGu%>@g+FVwIBlu1%!tM@SS5~8vQZ?na@7Na)p+<+JIDiM z(QqvPcHJ=eI&MCLB~T&R0(F^wL|L*IMI)K0_b=d@zCM9aO-1Vdv-U2>DRxqt!0 z4M;W;wCN4F@WE@H(zqW+Xc0fXx`uak_5Ow>?{Yt7zBNUYz@b7XUwF&bi)42 z2YuF{30+JB1We(RD|2t>c|+J4)C<18r~#rur4$7TxX+XbC8P$LCTmP{3F%=i0 z8D6v~YP_)!SM1VJ;Io<<#+G7HOMRDA`Idq?YP$$A5k#AIk`fX?g7olyL4NScg=-+E zfGR(V{G`tNbhLi7Q3u;bXMdJA2ict(uo_7|4Id)Co?sF^@UfYWB&G%&f08_*@B@(*oQ&^ahTiYh*gjoahqJGb zgF>k?7|NrKg0jMSJ-H@f%!@tRr;h?1XIB>+M%ql=H0{3#{u}VhG`R`<{>9Rz2`E#E zeTPQw-u|Pd1Bape_Yz&k&W@p^)dQ8d*_C#}mw49+bf2Oa_uFgzjS-Sp$B^Mx3-hk=&t@+=+1L1Nx-;?vQ|VL6VD+1}0<(Xp`%v zp}p!prS!AKVO%=r*4wwS7!8@^p`+u*Rfbj7P`muX5tYu5Q5Aw6<40IpJPWsht-jW% zve95}=HmwT`%?LumUJZG-=2lx-je{DS$w&Bv!id10oxDd|KxQcsrYADZ$t*{8?clR zx^t`%<9H~4liarA{j@^Czp&V(J6H~fs=YsVs$tKsRxMys|Vt)UGi zpexQq9$2K6NMWd7-0hjc2-Sc!Xg119fbdQwAWVQImAtzbquwX zX;`bqD-7#qq)Y;*rt=%>>~Sl`M81|$p2KUts8?Wp#3S)A`&EWCB_o{ifD?H#S^*yvLktkz|Ksl z&W;$)js$hCpFVhe!_x26+4RTSf&@?~>YoH4aF&_6vm2w!v^B#+8d+=Adh}Sw`|PQ` zQKSOe&l6R>MWh07sekVBeqkf&+0b5=KL-N|M=-i)df^}nhGUME&RP-4{MI$uZ#~l!H{@CWs(+BcKQ`a3I1H7#a+7??d9IlDZp+IEjaO!66Zh z7SVnLUs?o{;M0M_VjCu~6fg7FNL3zFBFF<&R=L2}iO25_lUkbejfT5Bahn=FZ#bIW=o)esDM^pvN> z{=`lp2+=+=;`*EqZbCnlD%CV(;a_VpNx(L6LJ@~?1{|IQwlFq1_qR!Z1QPWO+w=00y)tg8VXL1gS{IW^bi``+uokJ0r zpNgPoB44mz3yK)t&zxT2H)8oQf}$e>CC6I25fvqefuf^0er4UDtj(T!IGU@=rVfLt z_Jj#6t$YzF?@S4cqwH9~{4qICBjuQ?0@mJxyn$x}6bUJ4zg$0UD7eybAI+agBu?zm z8KS&KhBF$VY!Q>0s=9;5F$4;D(B$@s(*kx&)dwM*T#pZ;Me4_VF zl`9}{y{sA50_ua9yLhY7N7T;ev}-KxtR}w{!5JqC1-?<6Ry#gdO1>Rk7yk&}XBCLqn-BBGhEE7M- zUr)67y{jiVK6A4S&Pm~~_Vgr$;g&o4o271rfp^{qC|OEME|%Mq93=ETNC8VilT09- zA~6_%gz;O%2V?_5(&YP-PC9A(-GKlhA|6QFl6Aqt<|_OlqtF@MINJH(puURbyXdQ& zwZJQ-vxfneni4`bLTrx-`F^7DC4!ZzGAe-Y*?T7l?c9XFBp@2>o3PMK8l{A1(ja6a z%?Txi?#-y!EH|G?$ozC!?fM=5Jg z>C8r9O#~VS`<110Jz$ESDM(E2?!=k7%f(E3l&p2Nwf}N08g)CSnp!wN#XHjt=8vnL zYp1tvE2u_9L6Fl2uKGUiTNi-#VTi}p?{4|DXgrK)Yzvkqt|&V4m>zbbA$}b3>5%kg zf{Csnu$1Bs-8{&iJ775!j&{H_FGz0lY>hNPtsa`Fn-X`>Ft3)LNw5Oy@QaA;2?^H& zqXu-7hDqOVMF}00*L43CeGqA`4$PTFz(PKj`RFu=)s^# zE2DiED4<=(vlP9*`HAQTGfZ`onyw1L$Zcf<`E5)I9nusjq`r0~0d3a?`v~mnfA$1_ zliL%9^gIYo6;Cn_RgKw(%Q_H-)L#ky?q)m^oU&EDdx43(c!5Fh{33!^`+Fj|6KY`a zYH)VsgW>t+gYiLnJ2+(Y?;V=~Lc%vlVtp2JC)8v4mkn?EzK6{wb?Jb<}2gG z?5Sz8ZbX<@QJSiH@?WT64+F0Jw8BUZv- z){URP_dNeb|EWL_cZv`KwCmtPQg-T~^{`sM{PmfHDB`-~%JjwFh@HoKz*-4%c7N>_ z&kOxGHnSN2$y@di!w5(EAb$&^w*vFjFLr!b1@=w-AhWJ z3hcC(7QAwgW@8*=du6G;5xmMH`ozYqNEG5HFu|EH@rcmK5kERJO3h)i){|P!Dsj(Z z-#2;mJlF+}|Jf&zW1x`EiwqVG07?iS=^Yz#8pDwQzt{%=?w;EUaO(24s z+?SS}4tD%n_|VVG<;2r5kzCuByo)^U1BU$Glz@n!hp<5mzas*kgT7BA3m|Ifi!o(L zkiY&BC>;t@{vGE0Lh{(ZX)pB&|0)L3h1a3)h~R~eEGzn(f3>>togIG|_mVeTbrjKZXQM)k$xgZq#>KAm z)`LaUa8fl3D+jqA6kIkI{n=Y6iJE8A>Mxau#$%I&O(o+Kl3^>LU~34edkc`HOh>-D7x%UYq^5@c|LR2h3+l?1{)+_+5+jhx*ck}OJMF)- zRActff9m|dYkik5H+|*f2fmouDJ9wM>}{Eb%s4#GguifsiYis;V5nY@2#iPxaj=kR zb%ttJI(2UKZo|4Y-LE@d!!>{tjlRm;*;lup_B7+!oJVfvT959N^mOK%bV zg$1Dx{05ay$>qtxoB;;ZnW^TDjrkLIUhROq-j$tSn}`!a)zYg5yV-L2KNY1PfOnaJ;3W4;Wt z+uyrRJ+@DH4?!t4H!Cmgg<@>K@irLDot;hrAvZNAFW&TT^#$d{m6e5+<(2K7#R|Uj zZFNpD04G7SOIKQ{Bc}Hg5n87VPSfjErcN&+@7rT7t&>%H>*`zE?A?Wxjh%%*RtB40 zB{Bh_fg0NjTdZEYBR-m&r%M6ht|2ZZJ&n!X-6pa=lLaX+HzVshw2s$|dE`yaO{Z#o zoVCT(CcaW`s|h23o@pIgnQdH|_nDJ*;{GZaQ}$D>hv!DFqsK-Qvy0Qoi7}z0+yG~9 z+N`A=LU!)f;!mPEQ#_XIMNT(^RiM55_u$5hP+)wB^25{C<=NY`#yT605x&D#-=HnE z$%Bs@pH9t(PuHetizzqu*&O!#gq(5q8NIdb2ANJkUN`WyrAN;?F3e`9R)=gKq%9~b z6h|FK4`#_7c3svE7fRXJZ!#$&Y8kwVYtn}h$fzH88y&LyvrvP@4s zB%F=*+D#3g0q(QrnkQ^^#^&-?do8!a=(mQ-f(A4z4A*Tj)bpoXa|@84VAxM^_a*wt zzwbfdfxX#Uee&uU#_GVBxzS%)a-?%U;KFp8wgQ9$UJE=+EDU-yXpCi@tTq$YF|KJc z)px&0WoWIVym^a)RJc*zK%Vj-N;YN&N&r2ywA-r*@R5kTzp#GaPe=HH_X??6_r_=_ zF<>>+RbI<5&?Ah7c~c6ejkx3V+h@&ja_!1P2N|* z=NtPT@{W65ZAib^nc0bcf=%szy3T?Jouxd#m-50<%5VClav_EiyH@Jq+M1@~b;(Qn zep4KAI~w*QXyvxhl_amB3GqxD$+ZcF)^UN}+;X+M1`$3Ayt8&-E!4%lyWku?!PZ?c zg*=uC60OJGS?ttiTVZE4?MCmcT#2GiY8_r7O;@8S0uniZ7^O7UVu37);v@0uLxjc{$Or!Cm2pd)Jhs z_Q(;MQx8T(2Z4IauqzD?R;qWR~>=;*K{THe< zpLBj>y65k+o4z`E5t)Af_~Pm~abcS+zqL)@U3aA-7tM3C<45e@4!AA_9}m(kyvs~` z{l&5y?A$zSR_QMXK75-0FysIEaPUW`dRwZ*t%0D@wvO?iIbyE9bS`uH0Sxf@UH*E z`*Q2$q{aISu+shsu|JFOiRJqefn}U*T90e}Mj?y=wzaz2#JzW}OL?6yTZN7@EA>aq z-#g5@9H0EoYR_&QruLy7&(K}FCu9t-&|iUG_TIA3*uvQE#ewn;8oE9gZ*_&+Yq1S! z1_-zi10MV$)B$l=OvJ?r%~mRujkVQn%Fb4cDZlLp5WHz-4K8P8r`zOX_1Wcp=uvd( zZ280{k){nMXMQii#HYoL-v$vvx@}_7BY)Ka#lZ7fMf5$L6v7PRV0t}0Yn_fx(hj{W zHPlMI?rZf%Nw9<5Z=b>k3av>~3rFlr!~k&IP+JYQbXHgN^BHR;aB8pr1AYc}aBBSi z6VZu>NQ&|E;(|l?m7}5od0{uuE*yk66ZBPZO zIWfS!bIqus9}giOj5OeKnkaSLN=!mSY4 zf}c}vCOMzDA#gIb9xo0JM>leDrdluVY%}`sTL21A6x!n&9XM_y+3qRVwEBOulZVSq z->5Gwu#(P^yglMsdLx?K3}{Qbvhmkv6V?0dlWKsn0+ANcGtYCFa3?}__F2(j?lQC% zAG-Mox;a^WexKdqe7c?7F-d!8MxQ3;b^Uo%?oFZw2p`BF6$0(62lHlVr1X}gp$i1k z6%3J$p%;gP2X_CGq0~TroPMyTw^D}3=;S%GYr0Sx(VA4eJ-Ek0fe;okG%aTn~kdhu>_HJ|uM4T31kMGwtT zWmeP%Ie;)IA&YoxA~@iN7^YlgGx3UKegE0}G#XBf-|ohbdr7<&a5N|f(t?zl*R35? z>if*VMyK5;GaCBlWbks?KEVIB(QrM4q$G;V1EmQ4*a}^`1O7L#MARD&t)g$4HSef3lj%`mKHgk8V%`c{*ksU|R zj+e`yzriYSI&7Ny_tT(h?P0&{zz8xY^zO3>%SuCCyh(;JRUu?i0OW^1heElKM(8ol zE0NuCC$J?LFV+BwU-?eh!)6gM;cls>)Kl!`key*XT^S+Mi0xz(QnIJ9k1=SG@5%+!=4GVd~9? zbPG4F9yDNP_Cg87K|YFi3CYJNpD~Mm!BU%4FE3&*hQE8+2#^)C4$~@Gge`lXZFvQ3 zsYBo0AXeuR_8Kse*3QK`i~8ZAoU8*=f>z!SPZrS4V^#wngq3FiEgK|#Xpnv|QXf%E z1(BwW!Z{?ONE67`!G$2rqYAbn=orz|8L}z5%FR11d8@JRTRd9e`*%}DIS4x6 z1?LTu_wk28j-sFch`L#ooboe5oslq$DX;8&2uZ!vy##Q>FSoxBple1*n@L ziwukSxW7r8x3k>p;gh3MyZ1?Xy~ux?Y(VkTwfHs7)4{$6Ak)uzxRwdKU7uR2wXA%+ zE%&csEnS|~AcB^l7)6rl_F+!x(jw-TOyLLJohPr{z1vIYtz-Rc^{<7vO92_=m;~UO zPR)h2D&_YK@4>6My2{`n=Gyq1g~7bEo_{FE`&o3O2G^-?&u!2tIPTs6{=RT*t_(PO zNxG?BZne|uyhAaw?`w!=A{LFT95R{AguEH-VM_{9pZw`$D&!O589dCjEHuyk?KLqd zM5*&*ZM_$)0U)9N{#+c2xR74plD1-pW9|kBilPt}>$rYsd|XsSDwtS)|PrvNtCtVYN6> z&)D52?~UJp*ARKR`_1~dib&jB$pZJeLnA`)G7=op!_maZh8Fff^Rc&+egZPcE%A0~ zyG=G~o^WsWlPVT@T=-m#zreH;8Z6$1)y&g3DJ;}mukyqSRU?QY)JE*v zT4$$?L7{FVs?5+ zD6UdkJTw2VpipbRkB~z>+@KM6$3$H$#tSI7Q2KFP8@9dn)Na(=fzF4zTpRYr{mK-g zAX$#Hx#FW%+96bfvQ(~QzA}PJ{oExC;Y7-*JQtmME+xRGz4PietXi_Tx z;-~yq!5@;QFEJsR+NCFA_GM&AbAEc?MCk|p+#8uguD(dhrf2Y9#(F@!VRP7-EM~E6 z5XkT;sP6M(`5rl(aRt(>IpC)FdtdehKX{(=>zodr19VGom}iTB?@ZpsaLM2y6TgT7 z7$k7+&e9Xyf0C@4;LS?jF|%c=Wbe$!97$IEd~uW6_~Z^Z9&z>HTNyYe;a{X3?B16U zGP9J7ZUsC38O<~hp zkxpxg=If|N5XFV^GxR{vi99zw%-qh-mLurFew{<<=6mz9in)WNp|j$_&6hDfr$obr zA!!lEB3kVTf^=}7QPJqEar4$gxQlsu>X_T2d+_jQZwIxKiL(SET6Jt9&C}YdO}SK z5_B#Ot-|Q3%DCehX=UsxtQRTsdV=5JqEgTLozPsrpxb&~EuY;NCM|+Ad89KnE}5Bn zL2rdz79Z(K9XK2iLoTmE!2IjpUT!|3u|9cGZ`9|K(Dz!GcDCPclO%H9M3!E^m>C;U z;CItf+ri$5%NAP|l?Zq1a3r&{x-}1j(`tUw_asRjTWYLk44XdBb+fZi=XN{xi04Yb zvwx-eub<58<2Ap~H3utgx>1FjQY;X>puP&xdnUGFB=cbOH2YOH`B|<_s#rdCGMFn^ zO)5{Dg`M)&M%fIVL8G23cMUx1&eL(pFK*~wM&F)kD*AEGwU43k+#&`Qvit}Tc9(Rm zkHI$d(_@`5cS{>0-a+n@44a;UX!Y=~lOuj8RX8w9Uyq5hbk$^Udxs9FJrQCbyF2Ln z{(ZxQm6{HjQfo0#qkp22gI$w5#8^ zy4g@dP#Ub(Me{$GSE5>$-)n`@Z1K(_2M)LkSFI0g%iURsR5&pL* zrcsZqrk>ZP(`>oJ46f5#*n{th-UttS;ktANS(bad2(zL2d~9YjKJcg1lW&v*o0N|L zk6*}Y1oV>N6)=U$eOv~~x&^FSc*tS^?V_c{Av1)E{<(VIP&dUS=Lci^zR`(o*LUzz z3u5al<@z6vd_?o3&F_3EdWalU<1-Ma-Q6x#;VDe(6HEwyb+NfkCB9O3=r68acWbIu zAHqE={Sm<}!8<5a)-dsCCGF!}SQ&ZPp;u*w|HOJh8?D{_3 z(4M;bAQK2iV;CPWa?)N-1P31Yj&_I~zPe$b1*Fyr*&aH+#{&k60!w`m3e@~?W{oeF z-<}ued0L!y;xPgbAFcY6-C(UvvE~Ao{)*I94B^d>^Pq>Y4~@SH!bPG~XhzQ@+C-7MVqao|pPXGcV+2PU^`nxsa9!+~}(m22WS-f1I7NSN>g33I++ zE@AD;hTGsP$aAuNeBlST@H=?%7XEMI{?j&1 zxrnm1@0N;0H|{JT*BDYH3#MK#y5kuphMW)gne*N{Bz_nbUn=f6_cMZ`aLh4fRNLP2!BQ;k)?T}gNwYsSD4r2~Rs7za3A42^OV7p5N_~YQ-P*s;o+)G?%K(rk zW(&0=_WBWGFp+IMCfKL+S!&7B+JZ~i8qOSF28YSVU9t>&^1F_jrH3+>?qny5PO;^Z z%dd0pny|ZxF!soMO5I`jXfoe|HbPFDJAIjvzWA6P`Lcj00F`0V{2fa|SfHo)e4)7; zK_|oc(rf@Lsng9pM`tO20J4FpA$eTdj4_oZBGsBGrz!F+)ZFAY}Z6-Qc=axGrW(}CE@e2(g#iepHKyOX#^txo`f$rAtA%H`ylCN#Pg`Fr?%=ibfMQi(i>z8p(H;IC=w3Bh6!b z#Jh)1)TY12wd3fHj|+q9JxqPE#F!b0V2(1%ouETj09DCXfZrHM6hGbyvdyfbtSiaXFAldPai%dC`Y(Ha^IBFGl{*DGUo}K;Xje};D#r%D)`gj_LYWDaIt5XW_o+1K#vJ+fil#qX3rF-=) zr%yI271!eSNXtfPuPnJL=?WqV-fhb{gRh{6eEM)U(kuW?#sdR2Dd%FW4@`3m6y@x= z`mwAnKY6r&O<0~WQShU;#3Gqr2$Z6{)7l>K$2ba?kN$q(81`ezy>0a)h~|z0Sy?EO;fib{DN<%c@cFsSElZSGPH{@}RN zBPWQTdpykI=MnVoIhyb_R}B$#l+C1oy->2$rYExDT?iT@TZL4VR;KM}Nd+8G+ za{}Ge#1f0VH%T-iX((gZn3TfH-ftBplR@4K-Gdc;4pD&+JwZAG1@|=7+N&Hcv!y1* zBicX3C~nOB6E&Z&sN_XS#H-okwwb_mQ_LNg)?GNa{pB2!F;Q17Hal~IFB+D=QJqvS zakzfI6m=~om$@{*v(36T!cO>Fqnah0%Z{k)91~+rAM1u7^Aw={=CKVigZ4+;MhCd%okWG5m!* zw2-g=0L9ahcTy&}&)V0)i%R@W`#QUgeykJWr0n}?xN5WN{Cnwu2Z{I9*i7^gt(e== zy}sNh(F>do=>^|HArJ7s^uh1IdxEX&Y`Ruun`Q$~Q9ahDH}VfaM6;l}@l43w|4*gY z52x49?r3WpNA^mWYxBiQ58HSiJOWL<;(a7MU8lG|q+D$K8lu7h{RxOSpm`5nG03af zy8fVi4b7Zi5DL>U)A*T5H$JbSH^ili-&3KvgGBG{C_FjePy$mMoZ#LM(hZ*~C%Bh2 z3gZ`1d<>arC*&y@;ahOh#*_CMnEF>z zGWyE8qzxJUhu)C1`NfvdPY$r?3mqQ;sr=P?_Ie3>sWw8(x`?PJ;_C{2w0w)ol3@M? zI?2@dD{uDtx{j^1c^K>>D@r*%E5f#9$;U{TJh}&v4B2zA0ol{+3+FL6n>p@|!xOtM!o1 zu9jg|?WfcA3k|&MuP?HgCvGI5!1q)lct_@(8fW)XT(4+3aBZhQGRj#DC;E2uKvGDH9~dD=;k@|TifMP zGaeh#<6GM2bPf({M=zvk9sS=DrN&j5So3$nY~kWrLL$akyH@c-%3t%3+`!g>|6irfcR|G03v^yCtn+v(WRUtN3mK%J{KVx6dM}Pg0(?vUgB1Tk ze0vrb#82lX2_ev;mq%Ku-4e>!3m(6=Sf%QNF zHxgyTYjEcJyxezbmk@ymLwF(yLzDLN6c^brH8;=rS%lZb(WBNrjP@*_I|5Jj2!xfe zdLOhlI2g=jLh2N^sH9HC0tPxMLa{h1hNAwL75S!#;%i)~STv6|@eRtH*D6eL#Rkd}P?9-e<` zhTco_xfoMfn0!j}RS-JT_>9$DglI1E)Kf(a6sk)Rssr_7Ow&yK1Hk{aZVD4TQ!_5}%$`ZO z)T+)B6vFfrT6o?TH5{w`(OKS2$I-qy?m`bYCt7PoGI=;3)n&xD3A;!q72hjyqp!NOwv`W(Lu z89X21$Vk0s)PDhA6TMXIM{A7Uvl!0S{B3CT6ItA~Of?%GPG0ym^Ij^jM;i&h-WIO7 zbqnx!@oQR|*OWr941Wg|JzLs0$=ati?G)o2v&YjC#s> z9szC@URUG?*sORggny?f`{g(tl+ql_(~6?x0A1JBvLG>3!doH~6ldX_+@Z97)bJCz zK71%-gCn&0llV+QlCGe-K8$?)6ZksiaaxFErAqQBW2&2M8S+&+z)#p!X|;tww?KTR z;yEH9{~+JHjd?dv@e2_7R5IUG@v#!}cZo$m#=Iu2csL~R{TkC6me^Uc?ZXpMaBL55#@OYE zjIyoTegJm+)H8FtI_Ax3nYGXz$G;S7{!t7w)l-b|%)qC+Ah~yv|I8?!FJ|?IkzZpD z+A{h!cg{@SjR`m_NVOba&D&OF>70Q7TbeX2#D_^xex*cbDiRlJmv(@o%jrwSRq`Cd zZVvQRCjVoCH^*F}z1G_)tZQy-_V`%v!WvIKr0o&J&Fpb!E)zYF;n@N{7lm|oPMurF zV}<8_9pGN#SVb_Zj&G)%{XG^ImE})_T5euys!cr7^3#D!d%w!?w$bl<{9y*T!p6Ll zux*p!)szX3itMxsJPd`)hIkwDJu1Lj2=l%8a?H`VV%-GsZWx!NzSj>zU%g0tlmxE5 zAvnL7zl0c`s!P|8^7}N;$!BG|Li|#BWuE=Qxa71wOX34&hKM=8ulRilJqJ_FqU(8a z6o}ErGzCRNyAwol`j(-h9x~izMep(H0iyj>+A-V_mg#=$=lYG4< zd!uPtf5!BDzs~9Vc64>`+%=&ecZlzvPkaq3s#I{9R!jTycp&|L8QVC)KVTTtBIdPu zhJ-s~cy%fFQyF2XyeB5{AmEG8k=ATYlioeh{??+_P5E|%M`4M%{BnT zkza{4-A*`0o3b1~1sQlvg_$hO^?6B|$8V6qM&gX}{O!y1IT5b{f)647aTB;NpnI*W zf23n{aG58Ym*u1a?~8JN737oYw79oNw<3Si-<5lq-%$NIkS7tc>S6fJ{yLrxNs$A0 zm&8MWj!EiY`|vk?Y&;qGHF3esi@Z@e+=}=k43i7cep|v{V>Y=ZBu_3f%VpP*cL+0l zpb7bNaq4f8dr82zHT))!?WfHl2`#R;of!IxkRQt^T!KbC{|5+vK>o5{igy-~I$zfB zd9C>pWBF{%MwLa>Y`h5x77om*Ofm0cGt^n6BINl%_;G!Bi{VE@i<==oSOa`S7^*uk z+OxkaV>n%I>3jly5PbE33U(jFPl|wP05l7UPmo`pDc@p91bj(IBfuQj%Z^jB-|FUp z*&X&D#J3If@ifby%j&HxCTfIuFC|N1_V=~hL3zT z3~&TSTh~J=hHYtXrw~_b?9bky-lmA`g=jx4Hb?d2QCdg2B*_8{1kLA_ruhq%;m17> zcQbq>gtVDBjP^Pj#1at(5blZUfRXm){_(xYKPF?dLTpHWQ$yS&emq@b?KfT;zAWZ3 zTArzDNtN zPGtFg^5J3~u0bBBDA;uW5g7-!pd^2oFzP`D7AdIN+?&`&T z3B7&F;>WEWj`j#YeqZx+rFjBE&{k>g6nP~6R9hF!A4&Terx7^cL(#A_PuHP;R$460 zT#EKrFncBGng&}2;U$Sw<2k?)_A-kAwt!fvFhbc7dnD*%z3P_9wur7bC9_W&k6$Zy ztZ@*a{sMVTU0`Nm{HEr46w_KT=lQ&>kZhr|(N(m_R-2b0es%(nkS99G_&bK-;)%3U zc!7cHhKn00-c-3#F>^yeAC2T$VEL1v3T`RpH#qjcAbohTDl<-$!HHSBN5)(Qg(S{h zS{+3kC>;(2`-$eGD2_Ho-rXa2+8U3w0`^&lWW3xr_y8Dz={txQnH+zW%;3jKzAvN9 zDvTEcw+EriNJTSBc>$95V+d6V{vI`4V$Djhw`saATb&djOr|Y?T|KGy17+mrnh9X=HAe-|5x#kO>=-q#(Mz#cr1=_{H z6M+-t(O$?uY{+H&2vb}RVHsq83jhE0#N<1`4&0dD=nI*~T}--hm^x|0X=z@ROJZ9r z?Yu+tGz>*gzonPE!UrdE_a^>iluaod{K1k5;=xQ}+cE|jCusYvl{C~E%oNBX8+oueE>)ep4J&i^gfk03L?P%)-% z+jt;87X!K;@l1e+b^I*x;eKos#-lb?BrL^rLnX}0H*~k<8#929h{~{hkH|3*m7|SV zW6UoY?Igtt^2|?~_ZI5%ozc5^yq8VF5Xv-NtVPh~iH`v9Uqaz^FV}sA;xi%Y)zx;B z#X0C5?=Cj{f`rNy1XJx2WH#kaZ>+`k(5a(&IJ)?2WZH*N=$1{`?29pz{3vdycD#ee9Pv2nc>N{_=d@Gc4 zJq0|Q0{G3VtoMy+qIf*vS$4e3E&XgD0XC+16Hr?teWJ1rw}s(8f%?M4n*(1#p+HsW zsvlnQGoybAmTkx^Oq1C4xPRL}wC+AWUn}89VzZ6(`g)@t9vy=ADf&n5C&p#+50@#L zA}BaT?(8csOHCeSP*9Aw#LycM;!Wg^U|fsQWS`W1?of_sn7`HMWf0{DWMBp|bk=Jx~7 z)v-Da5`8>=g3>q>Y^^X6dGh%XjRJn1D){;Ya&tmd!ZKp-a#U12?|F>KHe|&zXMmEJR5j3 z=*0;P9V!#%)TW?*LK`T)6hieF@>XZemNW}TKLB`Joy4u=`KXY#NTzbZcIbL(tZemzl;ann*xZX7 zN*1Psns*h7H60U}vT!A<3$pn|EnO}H{Cu%Q-AI3D)OZ#eu z!RbKn34itc#Ek|=g89gm8v6QJ;5MD5J7o#95I?Bq57k%+7&&zYMl;BaL%X{Y(L2Ru z0^ct+qMG#W5o`2Nw(Sg|3|qI3Crb%vOa$0r(aV zc_gHG9VGD&m)-LCD^w!hz2JH))G@>F2uC>=iu7rsLdEAxu*iIjLz_E0Pq3NMf0S`A z+k+p0nAU+x5I+PNJ{6T%GN);3F;Sx7a;c)ll+9RKbW({V4#Q_Aq=iWz85NaYm-z9&>buWO8{R1-b;*4;@m2o zQMY4aYsFXVPz?wD72@fx3?ih5TsdG;y(Sx6QdvE!t)vzrHLmQ|?EI3RAeh)*GT2qe zL=vZ;(^+wdV%}VNN-n>jvUeu<9P-s*NNh%2rE+Q_1lx#x$?m)l#R3c}?rGG6g%euZ z7tohmsScb;ECeM{2Gx&%P2d{tKEcg-Dpc_P@;ASsuPS`51D`69zgI~Sg|hOVeM-B| zu%O29&$8sp#U}QVP52&I$S8?|-dcQAG$C&)H?R}s0H*NdL%|T1yRI@{y#W#xa&{L{=t4Yi)nL)p#XA(x|)5SPusIPk`zEt622ogVCr-qFCj$=CH! zLZ6g)3%bnjP%o+WS3D64`Q|4z4-f%(g*J}^=cCH%5&5Vb4j71U*EC*Hv>>X~V<7B^ z>^d~11_b7orZjEapO3}d6yaly&&Hu0Ba$c)L&G4wO&@g<+Pgs9m+uB2jt4bb1eI*; z8-S0Y8k^ujRf_rn_k_@jYWhRKRIvXv@XZ}^QR_iZAsDidLg%M}2mNG$OjgM={s+A9 zmR@4aS=tB1o+}bpus6-)GK%pRG}oa&&8`EN;47S#txxf7F~rafAoR(DT@YKqj3!SA z+Od8};xC(lxe)B{1g}D>@mUHQe98jN9RigQ-#i#bxTJhmeTV`oS=&N*3ve+;{Id$} zw!poWPc_I}iw!>vS+y2;52frfG{V;&l%3CeESpRc(%!@%wPSKHpK5g2thftPt~$Gn z5H6?0WOrPLB-ic`ru_?uf%xHFVy$w|*SUn9528a}#cbFO{Ek@jx3c|$iNj<^KMX>7 zE(dgQAMnodlVgB-HqSk+H-8<}$^s%>0DK7Kph2t@V>=KXCcI93uzcm#qF~XtI{=?W z87q+bDTNO5FNQ+dRwR-f;1T2xg39VmKM2a{_WE@Gt@c{BNvsbKm-Qq=i8`JOkBmkGX~ z06|Z&RWepPu>mqDDdqUqE?8{2^B4ZKpyRC;2{!YSfzOvNYH%}(Iv3o zAcP@K-h)kr2KWO;dw5BGAYT79rg@;v(kcjMy4aqzHy|G&OClz{4l^!8tAsbbW^!

0$U-t5O}$gKq0h8Ht#m=(OZfn7#-ygw`&21C~h`s z{#v;u<5gIuP9gqXR&+<;saV*o#|oPz5CydJ`j+5&5ZgpqCXLGh1dwj`E33D>-7m+R zAU&mg{NVgf&2|Jnqp}b`N>tkxxsS@hP73nKS9%Jbjqwao z%kq^^xuFV?eqp?6CHo)4+aU0Rqa!#6j4R=T=&K3vnoA94_zmIv&2y*b_*#fuE2hu@ zK1s~^I^d5m3x9yS<{jctC&+5|p`3kRls@=);AXJ zL|&27Fd1FBK$*>enC>c*fvdq=iDnf{9qp9gpt&vc`^sYKrbZEx`OQEJe>9Ec8o!6i zPgn=j5jT+~IR*Z8R{JFyD>itB%D_VSKVuRkggz~1F<2JjaKL((mGChCm~{pTzg9 z^57li@JT6hVHl2fUPkUocinuMQZp#}J8;d7&u zARjrR_X!k@&TIKrqzS-Z3Ch$0jYV%dm}|6sUkkG8Pkh(E49k(PlIUD7QBjnM1N^rQ z55ZWr)ARv;%T`uz^_DHiHzB;rr!Q^erT&+;QdEWE-|Z2&8lodS*j>?f!g1th$C3}@ ziK}IGUcmL;aM17 zPvaXGwYJ<9V>v|6A)Hn){oPHi-5;hnW1kS`8V*I)CO~W25=LM zL>ui8^{O7-smoR0B+b!{@5OU;r9V!#MBhp;!889*uld_VUf+*`=+*gWY(TP$b0S~W z0(U8ebrkKOV3ks9v^^HQ9{=jq9G-@slBfQSjDN;_4JmaTun};1lhg?=!DD!e#PVej z9EyAlXLyu6bBE%gsgQ>YggqvZ-(~1g&0h-O$pSrzITk>}yTH}QJ!V24Bi9(V;m-#N zzPyj3d3dcW>>%OMmHuFlQ+5-229|9Yh_XE6;aUoIm7OUHNwD$gWT0{=va-LptLN@! zwWCx0oyxE`lea(dr-;HHoe`vj9*tThMvy3>3vA>2;RUwR3jICL9${}Y{8G9IT9hjT z!f#;5LOIM9r9992VRMqd(Y`pDS&KZvDi@Wv7jpWjFvD3S2<$^EaHz7eY~RBWhr(8$ z7g=!|;$EPC^1N@7q5=5UBIWeLUJC7U#ntQW=6rCCtccyR2_$TtxJ6L&bSIiUF_gk& zi`Px9To%J~P{=4bA{hSxBJ`AZH=3(c;&7;hQZEIvIkF!VyHOFNG8!wu6Nvtvd@J|8 zhGMmqwgwT_y0_knFuLY>3@7xDPC8> zYs#a9c**8fI1b{kD!}j2zq##`3cj{7*87RttzujNR3!06Lh2OY)2mAP16hbq1*-a! zYJUo?g$+(3o z;@83FZo#e3lxTy{yh0Q59c>GRD-JU|x{8UerrPSp2@#RR|3UZGx~< ziT?LQMk|{q_fU2Y6e_7d0`sU5rId|^yUc!$kMW2ry;|H9xdlTeO1s3xGEqc#ivYUW z@L>=}dn4z99Nz_Lu`0z!nG(KTG|?QDirxi@L_ThV{&*d{u6Z0~ak4mqR%!)`dwbXe zxzv_&8!&E8yoCJ`WPx9bG(~Zkkz9= z@9Og<^3{J?fpqlggCc(4W_b?^`M+Y|rzOp-jJ`(|O%bgq5_@>w z1Wq)&;Zv?F-9BOyvdcS4D4GhF&B5Uu4Fsye6f(a_t5_dy79D-Ds=q)^*f=R9? z@RTZv_-Qj+@ks-WtLAwP5+W~eYOY7hs5IfxWH4l?Mw?^7R@cU|4Vnb%lr@ z&)3_V>iWL1&*NYq?n(TBSk)$IhI(eT;{BD+-xw`Xh(8WOxi!W+9c}2X??$;sNWX#k z$%<$40E)fa4Ye1$iszYPOrMJY6t*yHV3vo7U7hMCgYbun0@ij~;QfHyFBkF);-J_2 zg6$siJzfHz1`>RFLdZzhU>C*dTUY+c{XO9&HqDDHK?&;m9)fHrq9P#yJ?oJ6+99zw z9Qj#D>w|Kf^-TPl5UbHCkZJD2fmxb_`X3U)u!W4fY?(~9dw&uitA=ok%jtANH682?*wwKVwIeHL- z9V4nG?@bfmjn$(;CunCdn;NwSc_Jb9LB1_e`YS8ppNDu+uz9KLIpdv;;*lcp)&VaH z0`oiZM-pXU*5Q*PtS}ZaJkO)!&`oj?nM{jg^Bvgz70kfGaGKjjy5ThbmX+bmn721M zSN4UU0NoAQ=9@<8t&x?E<-^Kez&zd*@l$1jCb5VXq?;)4MeC6B(gaBy5<(syfc8IG zd>-Q@NmK;tH`;qw^QQ8&mr#gX0-v2Il1HEeiHDj}`$I~YUYHR19r#%-TXMMyTzctZ zL@S1P6_m>+WfJeY3}UH>j?mf3T`CugK3*A{?KQ76fw^A7RcP>d@cL(5=B6!`uR(Ni-*mqH5DzI~hcdLrCg#c!(Mb0Y#jjPHSPwF&HAjb6}b}RTl)vm4NpW+HZorD|x9^^L= zi*+v1r=Qyx&+A>pY=`^*(I4CO2sE#6`Q9DIJMq_o!HR!O!rC5+rf&xwqupNTT6fKMe-5z-0dz+(@kcUBu7X-8w|cCgi&=St-7 z3%s-7UxEw{AhSE!UW!jcZ<*MRqn2lg$Bn~;HRc{*adZDBDcHO<2 zpCh&MZzlBwYMxA(coj-JkF)%)i1V{G>Qjwts-)l1d}{;?Lw*%a;%mzX2%|hl;O}hh zYf)pT8~#O%bqOkcA&IIlad5ZT4{0Etw4pyg|E6$Vxv7U#Z$1T5p#bjhqR`eNhQd70 zR6Nj&{e4t$A_=W1#Y=o6n{gK4Fj1zrp=c(=QpLA=N;R6qv1D8HhNIj&@m~p;-sbs# zC1CdRBw}byq_+-m3`(>Jd6+Uv!0iH};J=0>9&GOO(SEUA?(-J%V3WKQzbLjoPwB+| z$Oj1SzJ(kq*Mo^HK8Odof@&}PkoY3V#BU?NCgHgr=pLVjksTh`MZ|Ad55~Kp0@}9w z(QWXZ`Tvsp-3j|hU>{33xj*dvL_zKk3CB0hZ)^A}(Rl38FB2u7s2q8&>ra7$D_{qZKG#5w@_^Hs?K4^A8 zdp!JOMBx0#V{!IKM7Y{<=X}c!ZMzvb4C43o%=PEU^JwAvV*aM*OuA_kSk)-sww|ah ziv^HFQSK{6inO7*snE`{&-x1cy?s0sye|?W4Ab0UB2^!`0au5MNoILtrsAGBLH#K` z>AZyg7-5l$4IQ>sM_0@2=6v_b{cRg zTPBF3FA;!v77N-ak9dVL7dh>Z_Aqi}Cfpf#v{i|_fwojTsAFrKaRtKZ~Q_)OX zAs5=JwM`yRqFE&XH=$zWs;tC#C0!VCJB=+$i z#cxm;-Up_W+~e5C6+VV$t>V|H7Pc{ZbxKxB+q;O6RyTL@}?lX>%%W%BPYx(y5ll zXZRM;tfzq5g6#K5M?<2B_$5H^7s5Y09*9~(5%&|aa-YTiK&#MArc;|MPeg8Ctizv) z_eh6!tV-O84x!XeNOu75Mp`6s+=(@lTe1P%Wkp!jHny~%6`Erv%%0tn&+oAP{495; z;zPu;^VcsAszTM9 z=md;K$L{Z$w4b;J2^3v}iAtbLmDwEl7ulm9$y@^Va4<`mU-A54P>?tbf;i$P&sS5F zx=@T6=pz+u1&L*T+yGOiNJvY|qu*N?N2`u;;fmEb3-b-jJ%1ZC-HKO1Wcos)H`3SSRr$OPMCuN-x0RY> zs|&SZuY3M)Xgek7`>HCLYW_Y^b3n@`nzu|KPu3;&0>x(vDqkrpy{+Q+0>zJEui$iJ zN;D6`(BEDOXvFuBx7H+{Mm{qtf?feVj)eyi7I+9)8bUNsi+=>&THUGRUO?v?@30`Q zg{Yom!GiGsH&WsyE#k12rUW#xIx$sTH zbRKer+}=&DHw^J?#s9THTU%NLc90Q4qNCV{bBhy`s`v1sin2?Q3_@U!TXrH!j3{$O+4_5x@ zfVY%8ct9uQ_Wp~mwRfMOI57p>V6X5o#D~B<<<6{7{Yl(`h5qfZ8Td5FgeMVyC?GIP z!avHA@M+rcY}9b2;Rnkqt4BUqRt_V}Pg_88`GLo-ZNy=t}Ab-hvWc4d$rcW?z6r%nGgdWIy$p zSLmZ(UFB+GbK$+!oGuFNJBB`x>jNhKz+l^2mqJv<5$`ULdU{`XBjKxHSNAQHAzz09 z5APf3H;^9esonwJ0RsNIcgj=|FBh^Jp}|qXT$fldyg3c`M54V}KtV5QypIgmd%F=<`9syB@?s&g4j?)Zx8(q4wxn zFys1qH@YfL#QngV?Nfh`heHgvh^Bz7UID>Vy?Ko+@GX>cpLDfR_E@3(RB2`*huEjk z__?k}h^vvy$cyF@)J?dZW!xK|kkxKq@KYobeW+-d; zte?6^d=7(7m+g?awB2Afls00o+l3a>L;cHvn=l>r80Nj|&hLqT7LS;tg{YO{4!!l< z3Vxz7;{ApHQD(3P7~3yEaD@S4;3k!FV*iO zFE*ZQB@x-G?5dE@$5P%~fh#|d&=TEA-d*dt<-O?Z6~jfTDzQA|A3^D3jJE*!jM7Nr zt*1`~-cgYRI-~@edY>Ov9^WO3TJ~r%#*wV%Q1R_ml=l8I{H&X}O4O0$xsVVJtIr(i zP>0t-LTE!F>7nI+H=#E{qynb(ZyA2s#!PaFFM-0JTs=h2UJ|8JiHdYZG-R&&z)=bwmBYM6~NJ;uF_)ppkDyJtKkbmomdSx zduUILxnnz#(yQkqVnI}T-jw6{1xU@dxbhdf~8K+e{+bvy_fd`(&m-k7PX@E z(ayGJ#wM=jElgMNa{1<4>q^v|6^0J2;ct5; zU5&vN0*Jlcp+i;)Jv~oE=m~>rsE(|!%?H{HAX@>{OLLXQsV%d+M~|d37%GZz53-2s z)OyV#Tx5e}nUmiIG}Tbo25GPh@cro1v+Dn8w4RQ^QZxs{AsY$&!Qd^&5h9Py|36Bg zzpF<<_yE+@La%fNQ}frlS`!TAmY)^7o3Xz7_(@2nx1bG_{#N82Fe7HKTq*pr^>U{1 zI9RVFJd%Z0@#cac>jjd?y$$WoO-CxHkcNpuT1`vVv*)@Iimpf2LJD?rodjwlH@+8n z66(L(&*q{Q>(K&GZjQO)cf_3f7K%H1yK}XFs6(w1R&-2<&8Rm}-9t{~I`A5{o)`!_ zLV(;;>*}r6C}H{@?~V!8;Nx`wFX8{Uxc$<%V~rgjIB`3E_n;td zuQENF?l7r_1wrEjwVgqU&=wEIC>mw?r~u)f^)ul1SJ{R$z3_y;yUIgr!g}!XmbV~< zZQyO^37sl7jV^FSh3@BZ9bHSF2G8YBx_sT{Z^)nQE0XngGK)QN>xj2POBKFe1iV0N z*&>Ta6OT|~IM=EVl()*_9sntdp7g^*ktblvYAmH zXJH1?hD$?ta%cH&3f1-Qq@e~&mH7_&Tov(~!t3sjyi46#b_2f%0VERotB^mj#7m*U zjFHf$Txpu+<6)9sV(O-M&xpPAw3(1{{Rpa(`1B1nc$0BMVh$~osk%tkA^Lrlvi8SB zw)w3D?uGoZ(NxJypyLmuU&i#U4!JG@;!qwhL1y^SILpU9biK<1yv#drBH{40_3 zPQWLb3VIaz5M);@HU@j?Z%|J)JTHjABBunj`Vi-Y%-kwlowO+)L-nTE=Y54Y3wys8 zYWW0h=>{~LvYkp7|1X2_eZc1nbvX(pwkjUVg|fL@6#ph}zNzwt#EFNJ`~WtnUEF|@ z9`v2!Dv?XKB7OvBAV|oLggsgqW3|Zs+ORL}5!3#~e2n~jEv5KW=)qH=n9c=WE;ln3 z6Mwn^-iTwUrla$mB8htqJOW3Xz$M)yGfhG!M7Sr(#l=Rl0ege@2ymH-=v)+^j~+=C zy4v6BQJ6YEEbx3PX&eFWBt*SWd^pzXcYX7GEG8!e9z8yt$Ru@QFNdDQyI>DaP#Ntn zxIzhm#xnx@we^ogbARDLPu8vn?^9tpBKd_*+~X$i2QUTcN06=b`JRvxbAfvaX`c&` z9q5^pM6f8}nGjgPtw+VmXG(BWLbxOT2HX^QRI?QC94dE8@Qi%%9T0(Nt}&$fCArSW z;KMXf)sVQ*)nbQuZaJ?KJvIUYe z)H8N1@p`T@w~F^xIBc2*)uM}h6c)G|(X`6FiCb;0#Cdwdw;m}S@9bPOrmQu(N-NA0 zQz*E)8Hvrjy%n{^fO+BrX z?yx)$p8XOfl2$jjRlFoo4dJ3t`GrKtT;w-uQ_vUqYUAs?(SIp^-S>DKi0#cudol2f zi7Ninwb&`kW66U-$k&NA&y?GpM|_2+OgH;Nt}5UlA)Ef%sqLP)!InjCOUQ+D?YVGr((f1sw)vVaQ|U@v3cTFLi?t zi?ImZ-ya7R^od7xKBvV}PBb_NK+t$hR9QV?OjI6L(}pC%iu6`dC2s`)m-)P76v-W_ zKQ$X$>`MF2lFv++?G$}7LTAJ0zRf)azKgN zqFhCm|67sb9yS;50XCHj9|q_*7@w`xZ@YFF<@f31dZUHbd0F&kB=8V`xfCsr#ZQXW zQm}U+P6ac-=(QnVAPaC5CdL6Ly()VEnBjzn18;9!8H`y8-l^nLx>vX&>a;$+uf(Nz zwa8B_=0@`Ed7;`~C@5%kyHcALx*{d&@x`jt-<}GO*&+|JwS?=l!M77NZRrZU3WZI_ z%dRcKzQgMV)?Mb?;ldq!-d`By9YU9cjNK%^{>ZNt-*g8xMLdCY_>3!KDG&is$v$sN zmX8${(4{0sdcSG2r{$zXoXdfBspHFKgO)44Sxj>Zm{TpS9pwIRPnJ{V0swRmX{ z!CcMbvVquAEV$~5ly~*25(4qt=M1j)lRel)L^VRG^MUJRfkca5gpKi9#rw&nGek>~ zd&y(&M=H?^X-{L{3cPh>UJsI+pgGeD4@5N#MMQWo6nUjvI6Iiv^;GHs6a~dMQV^ex ziOmJkDKz()=<<+1>KW2-blJVjAf3Dn6O%!9$M9lLtH)7vF1fZHdm*`luV-Slq2e!V zE33E8iYWPg^YoP8Ht(I^;p7H9x9_-HuAy36CF0uhCYHkmV|h2ssz*0%WJTyjL zB#ZT=JZT=(NF`57aNv0Ft_gJfXu3YlJCd$$n>n#3oG~7Li6J`Q^uQy3{S)~|2Z+?URd+o_{e+%TsC#-9B;s zw5ew%MLQbafkG0jY?+kvUP3(D2;_&n_oO;rt}XAZ{jk=!Zla$cbigbg9&6%BD zE#0?)&PM9&R;?+#{vsr1}G$1Hcv zBHkM#eJturG;b@BdQ(@lS9pEeX_Oh=j{k45Tb&B*XXJ*qLa5f!KU+HsO{%fV{j;U? zN}FvGne#k`I~LBs=i`)(uS`pc+}Hx6f3;&?WeV>|d(pUYCGR2sVl()g;)9J^Z!E18 z2ja=6p)X?VPH%{atrO67iMVp$8&wg1Na^*3$7C{UuG-LH`lg9tXU!pnZjkF{#Emwj zkqWysCv}*b`+!|v6Zw?S4-0fBefBZODPn%yt5X7!?*Y?vo-TJ^4E_^ z|IP3b_`m5ZUZ<_ zX(KQf^49c^SFNoTbL=2r&kb-G@fR4v3dLuTx7oY}ZM7~38>Ý*dWc(O2MbeQGW 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 z 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

D=&*g;kk_1H8jk- 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

8#2OwzGWj}KR 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

`sR4 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

uQ3*s?1PB7 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

  • X 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 QOz9PPE=C^|JJ5+IO6{|k_ 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

    Tr3%PrnQn4 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

    HTYD&&hWNJQTv1so{8L8Utx8 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�!mLIolbF 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%0DAO_ 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

    Han$^^K(9wX{989a+8SI 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

    TQrO-?(_~VOyDR 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

    8pSI=^MzTIY@cK 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

    _ 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 z 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 z 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
  • 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

    $1_OQf=nq^vO@fFHsYUdIwN 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 { root = createRoot(); esServer = await startES(); - await root.setup(); + const coreSetup = await root.setup(); + + coreSetup.savedObjects.registerType({ + name: 'foo', + hidden: false, + mappings: { + properties: {}, + }, + namespaceType: 'agnostic', + migrations: { + '7.14.0': (doc) => doc, + }, + }); await expect(root.start()).rejects.toThrowErrorMatchingInlineSnapshot(` "Unable to complete saved object migrations for the [.kibana] index: Migrations failed. Reason: 1 corrupt saved object documents were found: index-pattern:test_index* diff --git a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_transform_failures.test.ts b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_transform_failures.test.ts index 73c7016d32c563..5f85383a5d12e3 100644 --- a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_transform_failures.test.ts +++ b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_transform_failures.test.ts @@ -93,10 +93,28 @@ describe('migration v2', () => { '7.14.0': (doc) => doc, }, }); + + // registering the `space` type with a throwing migration fn to avoid the migration failing for unknown types + coreSetup.savedObjects.registerType({ + name: 'space', + hidden: false, + mappings: { + properties: {}, + }, + namespaceType: 'single', + migrations: { + '7.14.0': (doc) => { + doc.attributes.foo.bar = 12; + return doc; + }, + }, + }); + try { await root.start(); } catch (err) { const errorMessage = err.message; + expect( errorMessage.startsWith( 'Unable to complete saved object migrations for the [.kibana] index: Migrations failed. Reason: 7 corrupt saved object documents were found: ' @@ -122,11 +140,11 @@ describe('migration v2', () => { } expect(errorMessage.includes('7 transformation errors were encountered:')).toBeTruthy(); - expect( - errorMessage.includes( - 'space:default: Error: Document "default" has property "space" which belongs to a more recent version of Kibana [6.6.0]. The last known version is [undefined]' + expect(errorMessage).toEqual( + expect.stringContaining( + 'space:sixth: Error: Migration function for version 7.14.0 threw an error' ) - ).toBeTruthy(); + ); } }); }); diff --git a/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_unknown_types.test.ts b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_unknown_types.test.ts new file mode 100644 index 00000000000000..c5e302adbe9032 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/integration_tests/migration_7_13_0_unknown_types.test.ts @@ -0,0 +1,133 @@ +/* + * 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 Path from 'path'; +import Fs from 'fs'; +import Util from 'util'; +import { estypes } from '@elastic/elasticsearch'; +import * as kbnTestServer from '../../../../test_helpers/kbn_server'; +import { Root } from '../../../root'; + +const logFilePath = Path.join(__dirname, '7_13_unknown_types_test.log'); + +const asyncUnlink = Util.promisify(Fs.unlink); + +async function removeLogFile() { + // ignore errors if it doesn't exist + await asyncUnlink(logFilePath).catch(() => void 0); +} + +describe('migration v2', () => { + let esServer: kbnTestServer.TestElasticsearchUtils; + let root: Root; + + beforeAll(async () => { + await removeLogFile(); + }); + + afterAll(async () => { + if (root) { + await root.shutdown(); + } + if (esServer) { + await esServer.stop(); + } + + await new Promise((resolve) => setTimeout(resolve, 10000)); + }); + + it('migrates the documents to the highest version', async () => { + const { startES } = kbnTestServer.createTestServers({ + adjustTimeout: (t: number) => jest.setTimeout(t), + settings: { + es: { + license: 'basic', + // dataset contains 2 type of unknown docs + // `foo` documents + // `space` documents (to mimic a migration with disabled plugins) + dataArchive: Path.join(__dirname, 'archives', '7.13.0_with_unknown_so.zip'), + }, + }, + }); + + root = createRoot(); + + esServer = await startES(); + await root.setup(); + + try { + await root.start(); + } catch (err) { + const errorMessage = err.message; + + expect( + errorMessage.startsWith( + 'Unable to complete saved object migrations for the [.kibana] index: Migration failed because documents ' + + 'were found for unknown saved object types. To proceed with the migration, please delete these documents from the ' + + '".kibana_7.13.0_001" index.' + ) + ).toBeTruthy(); + + const unknownDocs = [ + { type: 'space', id: 'space:default' }, + { type: 'space', id: 'space:first' }, + { type: 'space', id: 'space:second' }, + { type: 'space', id: 'space:third' }, + { type: 'space', id: 'space:forth' }, + { type: 'space', id: 'space:fifth' }, + { type: 'space', id: 'space:sixth' }, + { type: 'foo', id: 'P2SQfHkBs3dBRGh--No5' }, + { type: 'foo', id: 'QGSZfHkBs3dBRGh-ANoD' }, + { type: 'foo', id: 'QWSZfHkBs3dBRGh-hNob' }, + ]; + + unknownDocs.forEach(({ id, type }) => { + expect(errorMessage).toEqual(expect.stringContaining(`- "${id}" (type: "${type}")`)); + }); + + const client = esServer.es.getClient(); + const { body: response } = await client.indices.getSettings({ index: '.kibana_7.13.0_001' }); + const settings = response['.kibana_7.13.0_001'] + .settings as estypes.IndicesIndexStatePrefixedSettings; + expect(settings.index).not.toBeUndefined(); + expect(settings.index!.blocks?.write).not.toEqual('true'); + } + }); +}); + +function createRoot() { + return kbnTestServer.createRootWithCorePlugins( + { + migrations: { + skip: false, + enableV2: true, + batchSize: 5, + }, + logging: { + appenders: { + file: { + type: 'file', + fileName: logFilePath, + layout: { + type: 'json', + }, + }, + }, + loggers: [ + { + name: 'root', + appenders: ['file'], + }, + ], + }, + }, + { + oss: true, + } + ); +} diff --git a/src/core/server/saved_objects/migrationsv2/migrations_state_action_machine.test.ts b/src/core/server/saved_objects/migrationsv2/migrations_state_action_machine.test.ts index 7a87a645a249cb..811b47e4086f01 100644 --- a/src/core/server/saved_objects/migrationsv2/migrations_state_action_machine.test.ts +++ b/src/core/server/saved_objects/migrationsv2/migrations_state_action_machine.test.ts @@ -5,18 +5,21 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + import { cleanupMock } from './migrations_state_machine_cleanup.mocks'; import { migrationStateActionMachine } from './migrations_state_action_machine'; import { loggingSystemMock, elasticsearchServiceMock } from '../../mocks'; +import { typeRegistryMock } from '../saved_objects_type_registry.mock'; import * as Either from 'fp-ts/lib/Either'; import * as Option from 'fp-ts/lib/Option'; import { ResponseError } from '@elastic/elasticsearch/lib/errors'; import { elasticsearchClientMock } from '../../elasticsearch/client/mocks'; import { LoggerAdapter } from '../../logging/logger_adapter'; import { AllControlStates, State } from './types'; -import { createInitialState } from './model'; +import { createInitialState } from './initial_state'; const esClient = elasticsearchServiceMock.createElasticsearchClient(); + describe('migrationsStateActionMachine', () => { beforeAll(() => { jest @@ -28,6 +31,7 @@ describe('migrationsStateActionMachine', () => { }); const mockLogger = loggingSystemMock.create(); + const typeRegistry = typeRegistryMock.create(); const initialState = createInitialState({ kibanaVersion: '7.11.0', @@ -42,6 +46,7 @@ describe('migrationsStateActionMachine', () => { enableV2: true, retryAttempts: 5, }, + typeRegistry, }); const next = jest.fn((s: State) => { @@ -257,6 +262,7 @@ describe('migrationsStateActionMachine', () => { "currentAlias": ".my-so-index", "indexPrefix": ".my-so-index", "kibanaVersion": "7.11.0", + "knownTypes": Array [], "legacyIndex": ".my-so-index", "logs": Array [ Object { @@ -350,6 +356,7 @@ describe('migrationsStateActionMachine', () => { "currentAlias": ".my-so-index", "indexPrefix": ".my-so-index", "kibanaVersion": "7.11.0", + "knownTypes": Array [], "legacyIndex": ".my-so-index", "logs": Array [ Object { @@ -541,6 +548,7 @@ describe('migrationsStateActionMachine', () => { "currentAlias": ".my-so-index", "indexPrefix": ".my-so-index", "kibanaVersion": "7.11.0", + "knownTypes": Array [], "legacyIndex": ".my-so-index", "logs": Array [ Object { @@ -629,6 +637,7 @@ describe('migrationsStateActionMachine', () => { "currentAlias": ".my-so-index", "indexPrefix": ".my-so-index", "kibanaVersion": "7.11.0", + "knownTypes": Array [], "legacyIndex": ".my-so-index", "logs": Array [ Object { diff --git a/src/core/server/saved_objects/migrationsv2/model/extract_errors.test.ts b/src/core/server/saved_objects/migrationsv2/model/extract_errors.test.ts new file mode 100644 index 00000000000000..a028c40ca65974 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/extract_errors.test.ts @@ -0,0 +1,39 @@ +/* + * 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 { extractUnknownDocFailureReason } from './extract_errors'; + +describe('extractUnknownDocFailureReason', () => { + it('generates the correct error message', () => { + expect( + extractUnknownDocFailureReason( + [ + { + id: 'unknownType:12', + type: 'unknownType', + }, + { + id: 'anotherUnknownType:42', + type: 'anotherUnknownType', + }, + ], + '.kibana_15' + ) + ).toMatchInlineSnapshot(` + "Migration failed because documents were found for unknown saved object types. To proceed with the migration, please delete these documents from the \\".kibana_15\\" index. + The documents with unknown types are: + - \\"unknownType:12\\" (type: \\"unknownType\\") + - \\"anotherUnknownType:42\\" (type: \\"anotherUnknownType\\") + You can delete them using the following command: + curl -X POST \\"{elasticsearch}/.kibana_15/_bulk?pretty\\" -H 'Content-Type: application/json' -d' + { \\"delete\\" : { \\"_id\\" : \\"unknownType:12\\" } } + { \\"delete\\" : { \\"_id\\" : \\"anotherUnknownType:42\\" } } + '" + `); + }); +}); diff --git a/src/core/server/saved_objects/migrationsv2/model/extract_errors.ts b/src/core/server/saved_objects/migrationsv2/model/extract_errors.ts new file mode 100644 index 00000000000000..cc6fe7bad3ca7a --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/extract_errors.ts @@ -0,0 +1,53 @@ +/* + * 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 { TransformErrorObjects } from '../../migrations/core'; +import { CheckForUnknownDocsFoundDoc } from '../actions'; + +/** + * Constructs migration failure message strings from corrupt document ids and document transformation errors + */ +export function extractTransformFailuresReason( + corruptDocumentIds: string[], + transformErrors: TransformErrorObjects[] +): string { + const corruptDocumentIdReason = + corruptDocumentIds.length > 0 + ? ` ${ + corruptDocumentIds.length + } corrupt saved object documents were found: ${corruptDocumentIds.join(',')}` + : ''; + // we have both the saved object Id and the stack trace in each `transformErrors` item. + const transformErrorsReason = + transformErrors.length > 0 + ? ` ${transformErrors.length} transformation errors were encountered:\n ` + + transformErrors + .map((errObj) => `- ${errObj.rawId}: ${errObj.err.stack ?? errObj.err.message}\n`) + .join('') + : ''; + return ( + `Migrations failed. Reason:${corruptDocumentIdReason}${transformErrorsReason}\n` + + `To allow migrations to proceed, please delete or fix these documents.` + ); +} + +export function extractUnknownDocFailureReason( + unknownDocs: CheckForUnknownDocsFoundDoc[], + sourceIndex: string +): string { + return ( + `Migration failed because documents were found for unknown saved object types. ` + + `To proceed with the migration, please delete these documents from the "${sourceIndex}" index.\n` + + `The documents with unknown types are:\n` + + unknownDocs.map((doc) => `- "${doc.id}" (type: "${doc.type}")\n`).join('') + + `You can delete them using the following command:\n` + + `curl -X POST "{elasticsearch}/${sourceIndex}/_bulk?pretty" -H 'Content-Type: application/json' -d'\n` + + unknownDocs.map((doc) => `{ "delete" : { "_id" : "${doc.id}" } }\n`).join('') + + `'` + ); +} diff --git a/src/core/server/saved_objects/migrationsv2/model/helpers.ts b/src/core/server/saved_objects/migrationsv2/model/helpers.ts new file mode 100644 index 00000000000000..4e920608594b1a --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/helpers.ts @@ -0,0 +1,90 @@ +/* + * 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 { gt, valid } from 'semver'; +import { State } from '../types'; +import { IndexMapping } from '../../mappings'; +import { FetchIndexResponse } from '../actions'; + +/** + * A helper function/type for ensuring that all control state's are handled. + */ +export function throwBadControlState(p: never): never; +export function throwBadControlState(controlState: any) { + throw new Error('Unexpected control state: ' + controlState); +} + +/** + * A helper function/type for ensuring that all response types are handled. + */ +export function throwBadResponse(state: State, p: never): never; +export function throwBadResponse(state: State, res: any): never { + throw new Error( + `${state.controlState} received unexpected action response: ` + JSON.stringify(res) + ); +} + +/** + * Merge the _meta.migrationMappingPropertyHashes mappings of an index with + * the given target mappings. + * + * @remarks When another instance already completed a migration, the existing + * target index might contain documents and mappings created by a plugin that + * is disabled in the current Kibana instance performing this migration. + * Mapping updates are commutative (deeply merged) by Elasticsearch, except + * for the `_meta` key. By merging the `_meta.migrationMappingPropertyHashes` + * mappings from the existing target index index into the targetMappings we + * ensure that any `migrationPropertyHashes` for disabled plugins aren't lost. + * + * Right now we don't use these `migrationPropertyHashes` but it could be used + * in the future to detect if mappings were changed. If mappings weren't + * changed we don't need to reindex but can clone the index to save disk space. + * + * @param targetMappings + * @param indexMappings + */ +export function mergeMigrationMappingPropertyHashes( + targetMappings: IndexMapping, + indexMappings: IndexMapping +) { + return { + ...targetMappings, + _meta: { + migrationMappingPropertyHashes: { + ...indexMappings._meta?.migrationMappingPropertyHashes, + ...targetMappings._meta?.migrationMappingPropertyHashes, + }, + }, + }; +} + +export function indexBelongsToLaterVersion(indexName: string, kibanaVersion: string): boolean { + const version = valid(indexVersion(indexName)); + return version != null ? gt(version, kibanaVersion) : false; +} + +/** + * Extracts the version number from a >= 7.11 index + * @param indexName A >= v7.11 index name + */ +export function indexVersion(indexName?: string): string | undefined { + return (indexName?.match(/.+_(\d+\.\d+\.\d+)_\d+/) || [])[1]; +} + +/** + * Creates a record of alias -> index name pairs + */ +export function getAliases(indices: FetchIndexResponse) { + return Object.keys(indices).reduce((acc, index) => { + Object.keys(indices[index].aliases || {}).forEach((alias) => { + // TODO throw if multiple .kibana aliases point to the same index? + acc[alias] = index; + }); + return acc; + }, {} as Record); +} diff --git a/src/core/server/saved_objects/migrationsv2/model/index.ts b/src/core/server/saved_objects/migrationsv2/model/index.ts new file mode 100644 index 00000000000000..a7f9db03efcac2 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/index.ts @@ -0,0 +1,10 @@ +/* + * 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. + */ + +export type { ExcludeRetryableEsError } from './types'; +export { model } from './model'; diff --git a/src/core/server/saved_objects/migrationsv2/model.test.ts b/src/core/server/saved_objects/migrationsv2/model/model.test.ts similarity index 91% rename from src/core/server/saved_objects/migrationsv2/model.test.ts rename to src/core/server/saved_objects/migrationsv2/model/model.test.ts index ea8bc7f1107352..174459d04d9ee5 100644 --- a/src/core/server/saved_objects/migrationsv2/model.test.ts +++ b/src/core/server/saved_objects/migrationsv2/model/model.test.ts @@ -38,14 +38,14 @@ import type { WaitForYellowSourceState, TransformedDocumentsBulkIndex, ReindexSourceToTempIndexBulk, -} from './types'; -import { SavedObjectsRawDoc } from '..'; -import { AliasAction, RetryableEsClientError } from './actions'; -import { createInitialState, model } from './model'; -import { ResponseType } from './next'; -import { SavedObjectsMigrationConfigType } from '../saved_objects_config'; -import { TransformErrorObjects, TransformSavedObjectDocumentError } from '../migrations/core'; + CheckUnknownDocumentsState, +} from '../types'; +import { SavedObjectsRawDoc } from '../../serialization'; +import { TransformErrorObjects, TransformSavedObjectDocumentError } from '../../migrations/core'; +import { AliasAction, RetryableEsClientError } from '../actions'; +import { ResponseType } from '../next'; import { createInitialProgress } from './progress'; +import { model } from './model'; describe('migrations v2 model', () => { const baseState: BaseState = { @@ -90,6 +90,7 @@ describe('migrations v2 model', () => { ], }, }, + knownTypes: ['dashboard', 'config'], }; describe('exponential retry delays for retryable_es_client_error', () => { @@ -497,6 +498,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('LEGACY_SET_WRITE_BLOCK', () => { const legacySetWriteBlockState: LegacySetWriteBlockState = { ...baseState, @@ -538,6 +540,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('LEGACY_CREATE_REINDEX_TARGET', () => { const legacyCreateReindexTargetState: LegacyCreateReindexTargetState = { ...baseState, @@ -562,6 +565,7 @@ describe('migrations v2 model', () => { // returns a left, it will always succeed or timeout. Since timeout // failures are always retried we don't explicity test this logic }); + describe('LEGACY_REINDEX', () => { const legacyReindexState: LegacyReindexState = { ...baseState, @@ -581,6 +585,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('LEGACY_REINDEX_WAIT_FOR_TASK', () => { const legacyReindexWaitForTaskState: LegacyReindexWaitForTaskState = { ...baseState, @@ -630,6 +635,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(2000); }); }); + describe('LEGACY_DELETE', () => { const legacyDeleteState: LegacyDeleteState = { ...baseState, @@ -670,6 +676,30 @@ describe('migrations v2 model', () => { }); describe('WAIT_FOR_YELLOW_SOURCE', () => { + const someMappings = { + properties: {}, + } as const; + + const waitForYellowSourceState: WaitForYellowSourceState = { + ...baseState, + controlState: 'WAIT_FOR_YELLOW_SOURCE', + sourceIndex: Option.some('.kibana_3') as Option.Some, + sourceIndexMappings: someMappings, + }; + + test('WAIT_FOR_YELLOW_SOURCE -> CHECK_UNKNOWN_DOCUMENTS if action succeeds', () => { + const res: ResponseType<'WAIT_FOR_YELLOW_SOURCE'> = Either.right({}); + const newState = model(waitForYellowSourceState, res); + expect(newState.controlState).toEqual('CHECK_UNKNOWN_DOCUMENTS'); + + expect(newState).toMatchObject({ + controlState: 'CHECK_UNKNOWN_DOCUMENTS', + sourceIndex: Option.some('.kibana_3'), + }); + }); + }); + + describe('CHECK_UNKNOWN_DOCUMENTS', () => { const mappingsWithUnknownType = { properties: { disabled_saved_object_type: { @@ -685,16 +715,16 @@ describe('migrations v2 model', () => { }, } as const; - const waitForYellowSourceState: WaitForYellowSourceState = { - ...baseState, - controlState: 'WAIT_FOR_YELLOW_SOURCE', - sourceIndex: Option.some('.kibana_3') as Option.Some, - sourceIndexMappings: mappingsWithUnknownType, - }; + test('CHECK_UNKNOWN_DOCUMENTS -> SET_SOURCE_WRITE_BLOCK if action succeeds', () => { + const checkUnknownDocumentsSourceState: CheckUnknownDocumentsState = { + ...baseState, + controlState: 'CHECK_UNKNOWN_DOCUMENTS', + sourceIndex: Option.some('.kibana_3') as Option.Some, + sourceIndexMappings: mappingsWithUnknownType, + }; - test('WAIT_FOR_YELLOW_SOURCE -> SET_SOURCE_WRITE_BLOCK if action succeeds', () => { - const res: ResponseType<'WAIT_FOR_YELLOW_SOURCE'> = Either.right({}); - const newState = model(waitForYellowSourceState, res); + const res: ResponseType<'CHECK_UNKNOWN_DOCUMENTS'> = Either.right({}); + const newState = model(checkUnknownDocumentsSourceState, res); expect(newState.controlState).toEqual('SET_SOURCE_WRITE_BLOCK'); expect(newState).toMatchObject({ @@ -729,6 +759,32 @@ describe('migrations v2 model', () => { } `); }); + + test('CHECK_UNKNOWN_DOCUMENTS -> FATAL if action fails and unknown docs were found', () => { + const checkUnknownDocumentsSourceState: CheckUnknownDocumentsState = { + ...baseState, + controlState: 'CHECK_UNKNOWN_DOCUMENTS', + sourceIndex: Option.some('.kibana_3') as Option.Some, + sourceIndexMappings: mappingsWithUnknownType, + }; + + const res: ResponseType<'CHECK_UNKNOWN_DOCUMENTS'> = Either.left({ + type: 'unknown_docs_found', + unknownDocs: [ + { id: 'dashboard:12', type: 'dashboard' }, + { id: 'foo:17', type: 'foo' }, + ], + }); + const newState = model(checkUnknownDocumentsSourceState, res); + expect(newState.controlState).toEqual('FATAL'); + + expect(newState).toMatchObject({ + controlState: 'FATAL', + reason: expect.stringContaining( + 'Migration failed because documents were found for unknown saved object types' + ), + }); + }); }); describe('SET_SOURCE_WRITE_BLOCK', () => { @@ -759,6 +815,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('CREATE_REINDEX_TEMP', () => { const state: CreateReindexTempState = { ...baseState, @@ -969,6 +1026,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('REINDEX_SOURCE_TO_TEMP_INDEX_BULK', () => { const transformedDocs = [ { @@ -1024,6 +1082,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('CLONE_TEMP_TO_TARGET', () => { const state: CloneTempToSource = { ...baseState, @@ -1053,6 +1112,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toBe(0); }); }); + describe('OUTDATED_DOCUMENTS_SEARCH_OPEN_PIT', () => { const state: OutdatedDocumentsSearchOpenPit = { ...baseState, @@ -1339,6 +1399,7 @@ describe('migrations v2 model', () => { }); }); }); + describe('TRANSFORMED_DOCUMENTS_BULK_INDEX', () => { const transformedDocs = [ { @@ -1395,6 +1456,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('UPDATE_TARGET_MAPPINGS_WAIT_FOR_TASK', () => { const updateTargetMappingsWaitForTaskState: UpdateTargetMappingsWaitForTaskState = { ...baseState, @@ -1447,6 +1509,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(2000); }); }); + describe('CREATE_NEW_TARGET', () => { const aliasActions = Option.some([Symbol('alias action')] as unknown) as Option.Some< AliasAction[] @@ -1466,6 +1529,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('MARK_VERSION_INDEX_READY', () => { const aliasActions = Option.some([Symbol('alias action')] as unknown) as Option.Some< AliasAction[] @@ -1506,6 +1570,7 @@ describe('migrations v2 model', () => { expect(newState.retryDelay).toEqual(0); }); }); + describe('MARK_VERSION_INDEX_READY_CONFLICT', () => { const aliasActions = Option.some([Symbol('alias action')] as unknown) as Option.Some< AliasAction[] @@ -1564,190 +1629,4 @@ describe('migrations v2 model', () => { }); }); }); - describe('createInitialState', () => { - const migrationsConfig = ({ - retryAttempts: 15, - batchSize: 1000, - } as unknown) as SavedObjectsMigrationConfigType; - it('creates the initial state for the model based on the passed in paramaters', () => { - expect( - createInitialState({ - kibanaVersion: '8.1.0', - targetMappings: { - dynamic: 'strict', - properties: { my_type: { properties: { title: { type: 'text' } } } }, - }, - migrationVersionPerType: {}, - indexPrefix: '.kibana_task_manager', - migrationsConfig, - }) - ).toMatchInlineSnapshot(` - Object { - "batchSize": 1000, - "controlState": "INIT", - "currentAlias": ".kibana_task_manager", - "indexPrefix": ".kibana_task_manager", - "kibanaVersion": "8.1.0", - "legacyIndex": ".kibana_task_manager", - "logs": Array [], - "outdatedDocumentsQuery": Object { - "bool": Object { - "should": Array [], - }, - }, - "preMigrationScript": Object { - "_tag": "None", - }, - "retryAttempts": 15, - "retryCount": 0, - "retryDelay": 0, - "targetIndexMappings": Object { - "dynamic": "strict", - "properties": Object { - "my_type": Object { - "properties": Object { - "title": Object { - "type": "text", - }, - }, - }, - }, - }, - "tempIndex": ".kibana_task_manager_8.1.0_reindex_temp", - "tempIndexMappings": Object { - "dynamic": false, - "properties": Object { - "migrationVersion": Object { - "dynamic": "true", - "type": "object", - }, - "type": Object { - "type": "keyword", - }, - }, - }, - "unusedTypesQuery": Object { - "bool": Object { - "must_not": Array [ - Object { - "term": Object { - "type": "fleet-agent-events", - }, - }, - Object { - "term": Object { - "type": "tsvb-validation-telemetry", - }, - }, - Object { - "bool": Object { - "must": Array [ - Object { - "match": Object { - "type": "search-session", - }, - }, - Object { - "match": Object { - "search-session.persisted": false, - }, - }, - ], - }, - }, - ], - }, - }, - "versionAlias": ".kibana_task_manager_8.1.0", - "versionIndex": ".kibana_task_manager_8.1.0_001", - } - `); - }); - it('returns state with a preMigration script', () => { - const preMigrationScript = "ctx._id = ctx._source.type + ':' + ctx._id"; - const initialState = createInitialState({ - kibanaVersion: '8.1.0', - targetMappings: { - dynamic: 'strict', - properties: { my_type: { properties: { title: { type: 'text' } } } }, - }, - preMigrationScript, - migrationVersionPerType: {}, - indexPrefix: '.kibana_task_manager', - migrationsConfig, - }); - - expect(Option.isSome(initialState.preMigrationScript)).toEqual(true); - expect((initialState.preMigrationScript as Option.Some).value).toEqual( - preMigrationScript - ); - }); - it('returns state without a preMigration script', () => { - expect( - Option.isNone( - createInitialState({ - kibanaVersion: '8.1.0', - targetMappings: { - dynamic: 'strict', - properties: { my_type: { properties: { title: { type: 'text' } } } }, - }, - preMigrationScript: undefined, - migrationVersionPerType: {}, - indexPrefix: '.kibana_task_manager', - migrationsConfig, - }).preMigrationScript - ) - ).toEqual(true); - }); - it('returns state with an outdatedDocumentsQuery', () => { - expect( - createInitialState({ - kibanaVersion: '8.1.0', - targetMappings: { - dynamic: 'strict', - properties: { my_type: { properties: { title: { type: 'text' } } } }, - }, - preMigrationScript: "ctx._id = ctx._source.type + ':' + ctx._id", - migrationVersionPerType: { my_dashboard: '7.10.1', my_viz: '8.0.0' }, - indexPrefix: '.kibana_task_manager', - migrationsConfig, - }).outdatedDocumentsQuery - ).toMatchInlineSnapshot(` - Object { - "bool": Object { - "should": Array [ - Object { - "bool": Object { - "must": Object { - "term": Object { - "type": "my_dashboard", - }, - }, - "must_not": Object { - "term": Object { - "migrationVersion.my_dashboard": "7.10.1", - }, - }, - }, - }, - Object { - "bool": Object { - "must": Object { - "term": Object { - "type": "my_viz", - }, - }, - "must_not": Object { - "term": Object { - "migrationVersion.my_viz": "8.0.0", - }, - }, - }, - }, - ], - }, - } - `); - }); - }); }); diff --git a/src/core/server/saved_objects/migrationsv2/model.ts b/src/core/server/saved_objects/migrationsv2/model/model.ts similarity index 81% rename from src/core/server/saved_objects/migrationsv2/model.ts rename to src/core/server/saved_objects/migrationsv2/model/model.ts index 6aa119af2f6c87..e7d6b8ed175e59 100644 --- a/src/core/server/saved_objects/migrationsv2/model.ts +++ b/src/core/server/saved_objects/migrationsv2/model/model.ts @@ -6,180 +6,30 @@ * Side Public License, v 1. */ -import { gt, valid } from 'semver'; import * as Either from 'fp-ts/lib/Either'; import * as Option from 'fp-ts/lib/Option'; -import { AliasAction, FetchIndexResponse, isLeftTypeof, RetryableEsClientError } from './actions'; -import { AllActionStates, InitState, State } from './types'; -import { IndexMapping } from '../mappings'; -import { ResponseType } from './next'; -import { SavedObjectsMigrationVersion } from '../types'; -import { disableUnknownTypeMappingFields } from '../migrations/core/migration_context'; -import { excludeUnusedTypesQuery, TransformErrorObjects } from '../migrations/core'; -import { SavedObjectsMigrationConfigType } from '../saved_objects_config'; +import { AliasAction, isLeftTypeof } from '../actions'; +import { AllActionStates, State } from '../types'; +import type { ResponseType } from '../next'; +import { disableUnknownTypeMappingFields } from '../../migrations/core/migration_context'; import { createInitialProgress, incrementProcessedProgress, logProgress, setProgressTotal, } from './progress'; - -/** - * A helper function/type for ensuring that all control state's are handled. - */ -function throwBadControlState(p: never): never; -function throwBadControlState(controlState: any) { - throw new Error('Unexpected control state: ' + controlState); -} - -/** - * A helper function/type for ensuring that all response types are handled. - */ -function throwBadResponse(state: State, p: never): never; -function throwBadResponse(state: State, res: any): never { - throw new Error( - `${state.controlState} received unexpected action response: ` + JSON.stringify(res) - ); -} - -/** - * Merge the _meta.migrationMappingPropertyHashes mappings of an index with - * the given target mappings. - * - * @remarks When another instance already completed a migration, the existing - * target index might contain documents and mappings created by a plugin that - * is disabled in the current Kibana instance performing this migration. - * Mapping updates are commutative (deeply merged) by Elasticsearch, except - * for the `_meta` key. By merging the `_meta.migrationMappingPropertyHashes` - * mappings from the existing target index index into the targetMappings we - * ensure that any `migrationPropertyHashes` for disabled plugins aren't lost. - * - * Right now we don't use these `migrationPropertyHashes` but it could be used - * in the future to detect if mappings were changed. If mappings weren't - * changed we don't need to reindex but can clone the index to save disk space. - * - * @param targetMappings - * @param indexMappings - */ -function mergeMigrationMappingPropertyHashes( - targetMappings: IndexMapping, - indexMappings: IndexMapping -) { - return { - ...targetMappings, - _meta: { - migrationMappingPropertyHashes: { - ...indexMappings._meta?.migrationMappingPropertyHashes, - ...targetMappings._meta?.migrationMappingPropertyHashes, - }, - }, - }; -} - -function indexBelongsToLaterVersion(indexName: string, kibanaVersion: string): boolean { - const version = valid(indexVersion(indexName)); - return version != null ? gt(version, kibanaVersion) : false; -} - -/** - * Extracts the version number from a >= 7.11 index - * @param indexName A >= v7.11 index name - */ -function indexVersion(indexName?: string): string | undefined { - return (indexName?.match(/.+_(\d+\.\d+\.\d+)_\d+/) || [])[1]; -} - -/** - * Creates a record of alias -> index name pairs - */ -function getAliases(indices: FetchIndexResponse) { - return Object.keys(indices).reduce((acc, index) => { - Object.keys(indices[index].aliases || {}).forEach((alias) => { - // TODO throw if multiple .kibana aliases point to the same index? - acc[alias] = index; - }); - return acc; - }, {} as Record); -} - -/** - * Constructs migration failure message strings from corrupt document ids and document transformation errors - */ -function extractTransformFailuresReason( - corruptDocumentIds: string[], - transformErrors: TransformErrorObjects[] -): string { - const corruptDocumentIdReason = - corruptDocumentIds.length > 0 - ? ` ${ - corruptDocumentIds.length - } corrupt saved object documents were found: ${corruptDocumentIds.join(',')}` - : ''; - // we have both the saved object Id and the stack trace in each `transformErrors` item. - const transformErrorsReason = - transformErrors.length > 0 - ? ` ${transformErrors.length} transformation errors were encountered:\n ` + - transformErrors - .map((errObj) => `- ${errObj.rawId}: ${errObj.err.stack ?? errObj.err.message}\n`) - .join('') - : ''; - return ( - `Migrations failed. Reason:${corruptDocumentIdReason}${transformErrorsReason}\n` + - `To allow migrations to proceed, please delete or fix these documents.` - ); -} - -const delayRetryState = ( - state: S, - errorMessage: string, - /** How many times to retry a step that fails */ - maxRetryAttempts: number -): S => { - if (state.retryCount >= maxRetryAttempts) { - return { - ...state, - controlState: 'FATAL', - reason: `Unable to complete the ${state.controlState} step after ${maxRetryAttempts} attempts, terminating.`, - }; - } else { - const retryCount = state.retryCount + 1; - const retryDelay = 1000 * Math.min(Math.pow(2, retryCount), 64); // 2s, 4s, 8s, 16s, 32s, 64s, 64s, 64s ... - - return { - ...state, - retryCount, - retryDelay, - logs: [ - ...state.logs, - { - level: 'error', - message: `Action failed with '${errorMessage}'. Retrying attempt ${retryCount} in ${ - retryDelay / 1000 - } seconds.`, - }, - ], - }; - } -}; -const resetRetryState = (state: S): S => { - return { ...state, ...{ retryCount: 0, retryDelay: 0 } }; -}; - -export type ExcludeRetryableEsError = Exclude< - | Exclude< - Response, - Either.Either ? Response['left'] : never, never> - > - | Either.Either< - Exclude< - Response extends Either.Left ? Response['left'] : never, - RetryableEsClientError - >, - Response extends Either.Right ? Response['right'] : never - >, - Either.Left ->; +import { delayRetryState, resetRetryState } from './retry_state'; +import { extractTransformFailuresReason, extractUnknownDocFailureReason } from './extract_errors'; +import type { ExcludeRetryableEsError } from './types'; +import { + getAliases, + indexBelongsToLaterVersion, + indexVersion, + mergeMigrationMappingPropertyHashes, + throwBadControlState, + throwBadResponse, +} from './helpers'; export const model = (currentState: State, resW: ResponseType): State => { // The action response `resW` is weakly typed, the type includes all action @@ -457,6 +307,16 @@ export const model = (currentState: State, resW: ResponseType): throwBadResponse(stateP, res); } } else if (stateP.controlState === 'WAIT_FOR_YELLOW_SOURCE') { + const res = resW as ExcludeRetryableEsError>; + if (Either.isRight(res)) { + return { + ...stateP, + controlState: 'CHECK_UNKNOWN_DOCUMENTS', + }; + } else { + return throwBadResponse(stateP, res); + } + } else if (stateP.controlState === 'CHECK_UNKNOWN_DOCUMENTS') { const res = resW as ExcludeRetryableEsError>; if (Either.isRight(res)) { const source = stateP.sourceIndex; @@ -478,7 +338,15 @@ export const model = (currentState: State, resW: ResponseType): ]), }; } else { - return throwBadResponse(stateP, res); + if (isLeftTypeof(res.left, 'unknown_docs_found')) { + return { + ...stateP, + controlState: 'FATAL', + reason: extractUnknownDocFailureReason(res.left.unknownDocs, stateP.sourceIndex.value), + }; + } else { + return throwBadResponse(stateP, res.left); + } } } else if (stateP.controlState === 'SET_SOURCE_WRITE_BLOCK') { const res = resW as ExcludeRetryableEsError>; @@ -958,67 +826,3 @@ export const model = (currentState: State, resW: ResponseType): return throwBadControlState(stateP); } }; - -/** - * Construct the initial state for the model - */ -export const createInitialState = ({ - kibanaVersion, - targetMappings, - preMigrationScript, - migrationVersionPerType, - indexPrefix, - migrationsConfig, -}: { - kibanaVersion: string; - targetMappings: IndexMapping; - preMigrationScript?: string; - migrationVersionPerType: SavedObjectsMigrationVersion; - indexPrefix: string; - migrationsConfig: SavedObjectsMigrationConfigType; -}): InitState => { - const outdatedDocumentsQuery = { - bool: { - should: Object.entries(migrationVersionPerType).map(([type, latestVersion]) => ({ - bool: { - must: { term: { type } }, - must_not: { term: { [`migrationVersion.${type}`]: latestVersion } }, - }, - })), - }, - }; - - const reindexTargetMappings: IndexMapping = { - dynamic: false, - properties: { - type: { type: 'keyword' }, - migrationVersion: { - // @ts-expect-error we don't allow plugins to set `dynamic` - dynamic: 'true', - type: 'object', - }, - }, - }; - - const initialState: InitState = { - controlState: 'INIT', - indexPrefix, - legacyIndex: indexPrefix, - currentAlias: indexPrefix, - versionAlias: `${indexPrefix}_${kibanaVersion}`, - versionIndex: `${indexPrefix}_${kibanaVersion}_001`, - tempIndex: `${indexPrefix}_${kibanaVersion}_reindex_temp`, - kibanaVersion, - preMigrationScript: Option.fromNullable(preMigrationScript), - targetIndexMappings: targetMappings, - tempIndexMappings: reindexTargetMappings, - outdatedDocumentsQuery, - retryCount: 0, - retryDelay: 0, - retryAttempts: migrationsConfig.retryAttempts, - batchSize: migrationsConfig.batchSize, - logs: [], - unusedTypesQuery: excludeUnusedTypesQuery, - }; - return initialState; -}; diff --git a/src/core/server/saved_objects/migrationsv2/progress.test.ts b/src/core/server/saved_objects/migrationsv2/model/progress.test.ts similarity index 98% rename from src/core/server/saved_objects/migrationsv2/progress.test.ts rename to src/core/server/saved_objects/migrationsv2/model/progress.test.ts index a0d89c2c63300f..2086774dd2fb41 100644 --- a/src/core/server/saved_objects/migrationsv2/progress.test.ts +++ b/src/core/server/saved_objects/migrationsv2/model/progress.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { MigrationLog } from './types'; +import type { MigrationLog } from '../types'; import { createInitialProgress, incrementProcessedProgress, diff --git a/src/core/server/saved_objects/migrationsv2/progress.ts b/src/core/server/saved_objects/migrationsv2/model/progress.ts similarity index 97% rename from src/core/server/saved_objects/migrationsv2/progress.ts rename to src/core/server/saved_objects/migrationsv2/model/progress.ts index d626cd65289022..ef66283fcf6823 100644 --- a/src/core/server/saved_objects/migrationsv2/progress.ts +++ b/src/core/server/saved_objects/migrationsv2/model/progress.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { MigrationLog, Progress } from './types'; +import type { MigrationLog, Progress } from '../types'; /** * Returns an initial state of the progress object (everything undefined) diff --git a/src/core/server/saved_objects/migrationsv2/model/retry_state.test.ts b/src/core/server/saved_objects/migrationsv2/model/retry_state.test.ts new file mode 100644 index 00000000000000..d49e570e0cdef9 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/retry_state.test.ts @@ -0,0 +1,145 @@ +/* + * 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 { resetRetryState, delayRetryState } from './retry_state'; +import { State } from '../types'; + +const createState = (parts: Record) => { + return parts as State; +}; + +describe('delayRetryState', () => { + it('returns the provided state with updated retry properties', () => { + const state = createState({ + controlState: 'TEST', + hello: 'dolly', + retryCount: 0, + retryDelay: 0, + logs: [], + }); + + expect(delayRetryState(state, 'some-error', 5)).toEqual({ + controlState: 'TEST', + hello: 'dolly', + retryCount: 1, + retryDelay: 2000, + logs: [ + { + level: 'error', + message: `Action failed with 'some-error'. Retrying attempt 1 in 2 seconds.`, + }, + ], + }); + }); + + it('can be chained', () => { + let state = createState({ + controlState: 'TEST', + hello: 'dolly', + retryCount: 0, + retryDelay: 0, + logs: [], + }); + + for (let i = 0; i < 5; i++) { + state = delayRetryState(state, 'some-error', 10); + } + + expect(state).toEqual({ + controlState: 'TEST', + hello: 'dolly', + retryCount: 5, + retryDelay: 32000, + logs: [ + { + level: 'error', + message: `Action failed with 'some-error'. Retrying attempt 1 in 2 seconds.`, + }, + { + level: 'error', + message: `Action failed with 'some-error'. Retrying attempt 2 in 4 seconds.`, + }, + { + level: 'error', + message: `Action failed with 'some-error'. Retrying attempt 3 in 8 seconds.`, + }, + { + level: 'error', + message: `Action failed with 'some-error'. Retrying attempt 4 in 16 seconds.`, + }, + { + level: 'error', + message: `Action failed with 'some-error'. Retrying attempt 5 in 32 seconds.`, + }, + ], + }); + }); + + it('limits the retry delay to 64s', () => { + let state = createState({ + controlState: 'TEST', + hello: 'dolly', + retryCount: 0, + retryDelay: 0, + logs: [], + }); + + for (let i = 0; i < 10; i++) { + state = delayRetryState(state, 'some-error', 10); + } + + expect(state.retryDelay).toEqual(64000); + }); + + it('returns a FATAL state if the retryCount exceed the max allowed number of attempts', () => { + const state = createState({ + controlState: 'TEST', + hello: 'dolly', + retryCount: 5, + retryDelay: 64, + }); + + expect(delayRetryState(state, 'some-error', 5)).toEqual({ + controlState: 'FATAL', + hello: 'dolly', + retryCount: 5, + retryDelay: 64, + reason: `Unable to complete the TEST step after 5 attempts, terminating.`, + }); + }); +}); + +describe('resetRetryState', () => { + it('resets the retry attributes of the state', () => { + const state = createState({ + hello: 'dolly', + foo: 42, + retryCount: 5, + retryDelay: 1000, + }); + + expect(resetRetryState(state)).toEqual({ + ...state, + retryCount: 0, + retryDelay: 0, + }); + }); + + it('works when the retry attributes are not yet present on the state', () => { + const state = createState({ + hello: 'dolly', + foo: 42, + }); + + expect(resetRetryState(state)).toEqual({ + ...state, + retryCount: 0, + retryDelay: 0, + }); + }); +}); diff --git a/src/core/server/saved_objects/migrationsv2/model/retry_state.ts b/src/core/server/saved_objects/migrationsv2/model/retry_state.ts new file mode 100644 index 00000000000000..5d69d32a7160c6 --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/retry_state.ts @@ -0,0 +1,49 @@ +/* + * 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 { State } from '../types'; + +export const delayRetryState = ( + state: S, + errorMessage: string, + /** How many times to retry a step that fails */ + maxRetryAttempts: number +): S => { + if (state.retryCount >= maxRetryAttempts) { + return { + ...state, + controlState: 'FATAL', + reason: `Unable to complete the ${state.controlState} step after ${maxRetryAttempts} attempts, terminating.`, + }; + } else { + const retryCount = state.retryCount + 1; + const retryDelay = 1000 * Math.min(Math.pow(2, retryCount), 64); // 2s, 4s, 8s, 16s, 32s, 64s, 64s, 64s ... + + return { + ...state, + retryCount, + retryDelay, + logs: [ + ...state.logs, + { + level: 'error', + message: `Action failed with '${errorMessage}'. Retrying attempt ${retryCount} in ${ + retryDelay / 1000 + } seconds.`, + }, + ], + }; + } +}; +export const resetRetryState = (state: S): S => { + return { + ...state, + retryCount: 0, + retryDelay: 0, + }; +}; diff --git a/src/core/server/saved_objects/migrationsv2/model/types.ts b/src/core/server/saved_objects/migrationsv2/model/types.ts new file mode 100644 index 00000000000000..d9b4582230cc1d --- /dev/null +++ b/src/core/server/saved_objects/migrationsv2/model/types.ts @@ -0,0 +1,25 @@ +/* + * 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 * as Either from 'fp-ts/Either'; +import { RetryableEsClientError } from '../actions'; + +export type ExcludeRetryableEsError = Exclude< + | Exclude< + Response, + Either.Either ? Response['left'] : never, never> + > + | Either.Either< + Exclude< + Response extends Either.Left ? Response['left'] : never, + RetryableEsClientError + >, + Response extends Either.Right ? Response['right'] : never + >, + Either.Left +>; diff --git a/src/core/server/saved_objects/migrationsv2/next.ts b/src/core/server/saved_objects/migrationsv2/next.ts index 3c3e3c46a8d68f..a7475a95c096d5 100644 --- a/src/core/server/saved_objects/migrationsv2/next.ts +++ b/src/core/server/saved_objects/migrationsv2/next.ts @@ -39,6 +39,7 @@ import type { OutdatedDocumentsSearchClosePit, RefreshTarget, OutdatedDocumentsRefresh, + CheckUnknownDocumentsState, } from './types'; import * as Actions from './actions'; import { ElasticsearchClient } from '../../elasticsearch'; @@ -61,6 +62,13 @@ export const nextActionMap = (client: ElasticsearchClient, transformRawDocs: Tra Actions.fetchIndices({ client, indices: [state.currentAlias, state.versionAlias] }), WAIT_FOR_YELLOW_SOURCE: (state: WaitForYellowSourceState) => Actions.waitForIndexStatusYellow({ client, index: state.sourceIndex.value }), + CHECK_UNKNOWN_DOCUMENTS: (state: CheckUnknownDocumentsState) => + Actions.checkForUnknownDocs({ + client, + indexName: state.sourceIndex.value, + unusedTypesQuery: state.unusedTypesQuery, + knownTypes: state.knownTypes, + }), SET_SOURCE_WRITE_BLOCK: (state: SetSourceWriteBlockState) => Actions.setWriteBlock({ client, index: state.sourceIndex.value }), CREATE_NEW_TARGET: (state: CreateNewTargetState) => diff --git a/src/core/server/saved_objects/migrationsv2/types.ts b/src/core/server/saved_objects/migrationsv2/types.ts index 1151e8337d3d59..ed361a710ac99f 100644 --- a/src/core/server/saved_objects/migrationsv2/types.ts +++ b/src/core/server/saved_objects/migrationsv2/types.ts @@ -108,11 +108,16 @@ export interface BaseState extends ControlState { * prevents lost deletes e.g. `.kibana_7.11.0_reindex`. */ readonly tempIndex: string; - /* When reindexing we use a source query to exclude saved objects types which + /** + * When reindexing we use a source query to exclude saved objects types which * are no longer used. These saved objects will still be kept in the outdated * index for backup purposes, but won't be available in the upgraded index. */ readonly unusedTypesQuery: estypes.QueryDslQueryContainer; + /** + * The list of known SO types that are registered. + */ + readonly knownTypes: string[]; } export interface InitState extends BaseState { @@ -154,6 +159,13 @@ export interface WaitForYellowSourceState extends BaseState { readonly sourceIndexMappings: IndexMapping; } +export interface CheckUnknownDocumentsState extends BaseState { + /** Check if any unknown document is present in the source index */ + readonly controlState: 'CHECK_UNKNOWN_DOCUMENTS'; + readonly sourceIndex: Option.Some; + readonly sourceIndexMappings: IndexMapping; +} + export interface SetSourceWriteBlockState extends PostInitState { /** Set a write block on the source index to prevent any further writes */ readonly controlState: 'SET_SOURCE_WRITE_BLOCK'; @@ -287,6 +299,7 @@ export interface OutdatedDocumentsTransform extends PostInitState { readonly transformErrors: TransformErrorObjects[]; readonly progress: Progress; } + export interface TransformedDocumentsBulkIndex extends PostInitState { /** * Write the up-to-date transformed documents to the target index @@ -386,6 +399,7 @@ export type State = Readonly< | InitState | DoneState | WaitForYellowSourceState + | CheckUnknownDocumentsState | SetSourceWriteBlockState | CreateNewTargetState | CreateReindexTempState From 770aa79121679e1fe560dbc62a9ebac0c670abb1 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Tue, 29 Jun 2021 14:28:37 -0400 Subject: [PATCH 113/227] [Fleet] Better onboarding experience for Fleet Server on premise (#103550) --- .../fleet/layouts/default/default.tsx | 8 +- .../fleet_server_cloud_instructions.tsx | 116 +++ .../fleet_server_on_prem_instructions.tsx | 789 ++++++++++++++++++ .../components/index.tsx | 9 + .../components/install_command_utils.test.ts | 189 +++++ .../components/install_command_utils.ts | 47 ++ .../fleet_server_requirement_page.test.tsx | 101 --- .../fleet_server_requirement_page.tsx | 401 +-------- .../agents/agent_requirements_page/index.tsx | 7 +- .../fleet/sections/agents/index.tsx | 60 +- .../agent_enrollment_flyout.test.mocks.ts | 14 +- .../agent_enrollment_flyout.test.tsx | 2 +- .../agent_enrollment_flyout/index.tsx | 6 +- .../managed_instructions.tsx | 35 +- .../agent_enrollment_flyout/steps.tsx | 2 +- .../fleet/public/hooks/use_fleet_status.tsx | 45 +- 16 files changed, 1268 insertions(+), 563 deletions(-) create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_cloud_instructions.tsx create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_on_prem_instructions.tsx create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/index.tsx create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.test.ts create mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.ts delete mode 100644 x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.test.tsx diff --git a/x-pack/plugins/fleet/public/applications/fleet/layouts/default/default.tsx b/x-pack/plugins/fleet/public/applications/fleet/layouts/default/default.tsx index c6ef212b3995eb..7ad034b1cc0595 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/layouts/default/default.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/layouts/default/default.tsx @@ -17,15 +17,21 @@ import { DefaultPageTitle } from './default_page_title'; interface Props { section?: Section; children?: React.ReactNode; + rightColumn?: JSX.Element; } -export const DefaultLayout: React.FunctionComponent = ({ section, children }) => { +export const DefaultLayout: React.FunctionComponent = ({ + section, + children, + rightColumn, +}) => { const { getHref } = useLink(); const { agents } = useConfig(); return ( } + rightColumn={rightColumn} tabs={[ { name: ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_cloud_instructions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_cloud_instructions.tsx new file mode 100644 index 00000000000000..3b9d297f37df2e --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_cloud_instructions.tsx @@ -0,0 +1,116 @@ +/* + * 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, { useEffect } from 'react'; +import { + EuiButton, + EuiPanel, + EuiLink, + EuiEmptyPrompt, + EuiFlexItem, + EuiFlexGroup, + EuiText, + EuiLoadingSpinner, + EuiSpacer, +} from '@elastic/eui'; + +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useFleetStatus, useStartServices } from '../../../../hooks'; + +const REFRESH_INTERVAL = 10000; + +export const CloudInstructions: React.FC<{ deploymentUrl: string }> = ({ deploymentUrl }) => { + const { docLinks } = useStartServices(); + + const { refresh } = useFleetStatus(); + + useEffect(() => { + const interval = setInterval(() => { + refresh(); + }, REFRESH_INTERVAL); + + return () => clearInterval(interval); + }, [refresh]); + + return ( + <> + + + +

  • 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

    + } + body={ + + + + ), + }} + /> + } + actions={ + <> + + + + + } + /> + + + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_on_prem_instructions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_on_prem_instructions.tsx new file mode 100644 index 00000000000000..d2ff0d081b9797 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_on_prem_instructions.tsx @@ -0,0 +1,789 @@ +/* + * 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, { useState, useMemo, useCallback, useEffect } from 'react'; +import { + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiSpacer, + EuiText, + EuiLink, + EuiSteps, + EuiCode, + EuiCodeBlock, + EuiCallOut, + EuiSelect, + EuiRadioGroup, + EuiFieldText, + EuiForm, + EuiFormErrorText, +} from '@elastic/eui'; +import type { EuiStepProps } from '@elastic/eui/src/components/steps/step'; +import styled from 'styled-components'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { DownloadStep } from '../../../../components'; +import { + useStartServices, + useGetOutputs, + sendGenerateServiceToken, + usePlatform, + PLATFORM_OPTIONS, + useGetAgentPolicies, + useGetSettings, + sendPutSettings, + sendGetFleetStatus, + useFleetStatus, + useUrlModal, +} from '../../../../hooks'; +import type { PLATFORM_TYPE } from '../../../../hooks'; +import type { PackagePolicy } from '../../../../types'; +import { FLEET_SERVER_PACKAGE } from '../../../../constants'; + +import { getInstallCommandForPlatform } from './install_command_utils'; + +const URL_REGEX = /^(https?):\/\/[^\s$.?#].[^\s]*$/gm; +const REFRESH_INTERVAL = 10000; + +type DeploymentMode = 'production' | 'quickstart'; + +const FlexItemWithMinWidth = styled(EuiFlexItem)` + min-width: 0px; + max-width: 100%; +`; + +export const ContentWrapper = styled(EuiFlexGroup)` + height: 100%; + margin: 0 auto; + max-width: 800px; +`; + +// Otherwise the copy button is over the text +const CommandCode = styled.div.attrs(() => { + return { + className: 'eui-textBreakAll', + }; +})` + margin-right: ${(props) => props.theme.eui.paddingSizes.m}; +`; + +export const ServiceTokenStep = ({ + disabled = false, + serviceToken, + getServiceToken, + isLoadingServiceToken, +}: { + disabled?: boolean; + serviceToken?: string; + getServiceToken: () => void; + isLoadingServiceToken: boolean; +}): EuiStepProps => { + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.stepGenerateServiceTokenTitle', { + defaultMessage: 'Generate a service token', + }), + status: disabled ? 'disabled' : undefined, + children: !disabled && ( + <> + + + + + {!serviceToken ? ( + + + { + getServiceToken(); + }} + > + + + + + ) : ( + <> + + } + /> + + + + + + + + + + {serviceToken} + + + + + )} + + ), + }; +}; + +export const FleetServerCommandStep = ({ + serviceToken, + installCommand, + platform, + setPlatform, +}: { + serviceToken?: string; + installCommand: string; + platform: string; + setPlatform: (platform: PLATFORM_TYPE) => void; +}): EuiStepProps => { + const { docLinks } = useStartServices(); + + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.stepInstallAgentTitle', { + defaultMessage: 'Start Fleet Server', + }), + status: !serviceToken ? 'disabled' : undefined, + children: serviceToken ? ( + <> + + + + + ), + }} + /> + + + + + + } + options={PLATFORM_OPTIONS} + value={platform} + onChange={(e) => setPlatform(e.target.value as PLATFORM_TYPE)} + aria-label={i18n.translate('xpack.fleet.fleetServerSetup.platformSelectAriaLabel', { + defaultMessage: 'Platform', + })} + /> + + + {installCommand} + + + + + + + ), + }} + /> + + + ) : null, + }; +}; + +export const useFleetServerInstructions = (policyId?: string) => { + const outputsRequest = useGetOutputs(); + const { notifications } = useStartServices(); + const [serviceToken, setServiceToken] = useState(); + const [isLoadingServiceToken, setIsLoadingServiceToken] = useState(false); + const { platform, setPlatform } = usePlatform(); + const [deploymentMode, setDeploymentMode] = useState('production'); + const { data: settings, resendRequest: refreshSettings } = useGetSettings(); + const fleetServerHost = settings?.item.fleet_server_hosts?.[0]; + const output = outputsRequest.data?.items?.[0]; + const esHost = output?.hosts?.[0]; + + const installCommand = useMemo((): string => { + if (!serviceToken || !esHost) { + return ''; + } + + return getInstallCommandForPlatform( + platform, + esHost, + serviceToken, + policyId, + fleetServerHost, + deploymentMode === 'production' + ); + }, [serviceToken, esHost, platform, policyId, fleetServerHost, deploymentMode]); + + const getServiceToken = useCallback(async () => { + setIsLoadingServiceToken(true); + try { + const { data } = await sendGenerateServiceToken(); + if (data?.value) { + setServiceToken(data?.value); + } + } catch (err) { + notifications.toasts.addError(err, { + title: i18n.translate('xpack.fleet.fleetServerSetup.errorGeneratingTokenTitleText', { + defaultMessage: 'Error generating token', + }), + }); + } + + setIsLoadingServiceToken(false); + }, [notifications.toasts]); + + const refresh = useCallback(() => { + return Promise.all([outputsRequest.resendRequest(), refreshSettings()]); + }, [outputsRequest, refreshSettings]); + + const addFleetServerHost = useCallback( + async (host: string) => { + try { + await sendPutSettings({ + fleet_server_hosts: [host, ...(settings?.item.fleet_server_hosts || [])], + }); + await refreshSettings(); + } catch (err) { + notifications.toasts.addError(err, { + title: i18n.translate('xpack.fleet.fleetServerSetup.errorAddingFleetServerHostTitle', { + defaultMessage: 'Error adding Fleet Server host', + }), + }); + } + }, + [refreshSettings, notifications.toasts, settings?.item.fleet_server_hosts] + ); + + return { + addFleetServerHost, + fleetServerHost, + deploymentMode, + setDeploymentMode, + serviceToken, + getServiceToken, + isLoadingServiceToken, + installCommand, + platform, + setPlatform, + refresh, + }; +}; + +const AgentPolicySelectionStep = ({ + policyId, + setPolicyId, +}: { + policyId?: string; + setPolicyId: (v: string) => void; +}): EuiStepProps => { + const { data } = useGetAgentPolicies({ full: true }); + + const agentPolicies = useMemo( + () => + data + ? data.items.filter((item) => { + return item.package_policies.some( + (p: string | PackagePolicy) => + (p as PackagePolicy).package?.name === FLEET_SERVER_PACKAGE + ); + return false; + }) + : [], + [data] + ); + + const options = useMemo(() => { + return agentPolicies.map((policy) => ({ text: policy.name, value: policy.id })); + }, [agentPolicies]); + + useEffect(() => { + // Select default value + if (agentPolicies.length && !policyId) { + const defaultPolicy = + agentPolicies.find((p) => p.is_default_fleet_server) || agentPolicies[0]; + setPolicyId(defaultPolicy.id); + } + }, [options, agentPolicies, policyId, setPolicyId]); + + const onChangeCallback = useCallback( + (e: React.ChangeEvent) => { + setPolicyId(e.target.value); + }, + [setPolicyId] + ); + + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.stepSelectAgentPolicyTitle', { + defaultMessage: 'Select an Agent policy', + }), + status: undefined, + children: ( + <> + + + + + + + + } + options={options} + value={policyId} + onChange={onChangeCallback} + aria-label={i18n.translate('xpack.fleet.fleetServerSetup.agentPolicySelectAraiLabel', { + defaultMessage: 'Agent policy', + })} + /> + + ), + }; +}; + +export const addFleetServerHostStep = ({ + addFleetServerHost, +}: { + addFleetServerHost: (v: string) => Promise; +}): EuiStepProps => { + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.addFleetServerHostStepTitle', { + defaultMessage: 'Add your Fleet Server host', + }), + status: undefined, + children: , + }; +}; + +export const AddFleetServerHostStepContent = ({ + addFleetServerHost, +}: { + addFleetServerHost: (v: string) => Promise; +}) => { + const [calloutHost, setCalloutHost] = useState(); + const [isLoading, setIsLoading] = useState(false); + const [fleetServerHost, setFleetServerHost] = useState(''); + const [error, setError] = useState(); + const { getModalHref } = useUrlModal(); + + const validate = useCallback( + (host: string) => { + if (host.match(URL_REGEX)) { + setError(undefined); + return true; + } else { + setError( + i18n.translate('xpack.fleet.fleetServerSetup.addFleetServerHostInvalidUrlError', { + defaultMessage: 'Invalid URL', + }) + ); + return false; + } + }, + [setError] + ); + + const onSubmit = useCallback(async () => { + try { + setIsLoading(true); + if (validate(fleetServerHost)) { + await addFleetServerHost(fleetServerHost); + } + setCalloutHost(fleetServerHost); + setFleetServerHost(''); + } finally { + setIsLoading(false); + } + }, [fleetServerHost, addFleetServerHost, validate]); + + const onChange = useCallback( + (e: React.ChangeEvent) => { + setFleetServerHost(e.target.value); + if (error) { + validate(e.target.value); + } + }, + [error, validate, setFleetServerHost] + ); + + return ( + + + 8220 }} + /> + + + + + + + + } + /> + {error && {error}} + + + + + + + + {calloutHost && ( + <> + + + } + > + + + + ), + }} + /> + + + )} + + ); +}; + +export const deploymentModeStep = ({ + deploymentMode, + setDeploymentMode, +}: { + deploymentMode: DeploymentMode; + setDeploymentMode: (v: DeploymentMode) => void; +}): EuiStepProps => { + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.stepDeploymentModeTitle', { + defaultMessage: 'Choose a deployment mode for security', + }), + status: undefined, + children: ( + + ), + }; +}; + +const DeploymentModeStepContent = ({ + deploymentMode, + setDeploymentMode, +}: { + deploymentMode: DeploymentMode; + setDeploymentMode: (v: DeploymentMode) => void; +}) => { + const onChangeCallback = useCallback( + (v: string) => { + if (v === 'production' || v === 'quickstart') { + setDeploymentMode(v); + } + }, + [setDeploymentMode] + ); + + return ( + <> + + + + + + + + ), + }} + /> + ), + }, + { + id: 'production', + label: ( + + + + ), + }} + /> + ), + }, + ]} + idSelected={deploymentMode} + onChange={onChangeCallback} + name="radio group" + /> + + ); +}; + +const WaitingForFleetServerStep = ({ + status, +}: { + status: 'loading' | 'disabled' | 'complete'; +}): EuiStepProps => { + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.stepWaitingForFleetServerTitle', { + defaultMessage: 'Waiting for Fleet Server to connect...', + }), + status, + children: undefined, + }; +}; + +const CompleteStep = (): EuiStepProps => { + const fleetStatus = useFleetStatus(); + + const onContinueClick = () => { + fleetStatus.refresh(); + }; + + return { + title: i18n.translate('xpack.fleet.fleetServerSetup.stepFleetServerCompleteTitle', { + defaultMessage: 'Fleet Server connected', + }), + status: 'complete', + children: ( + <> + + + + + + + ), + }; +}; + +export const OnPremInstructions: React.FC = () => { + const { notifications } = useStartServices(); + const [policyId, setPolicyId] = useState(); + + const { + serviceToken, + getServiceToken, + isLoadingServiceToken, + installCommand, + platform, + setPlatform, + refresh, + deploymentMode, + setDeploymentMode, + fleetServerHost, + addFleetServerHost, + } = useFleetServerInstructions(policyId); + + const { modal } = useUrlModal(); + useEffect(() => { + // Refresh settings when the settings modal is closed + if (!modal) { + refresh(); + } + }, [modal, refresh]); + + const { docLinks } = useStartServices(); + + const [isWaitingForFleetServer, setIsWaitingForFleetServer] = useState(true); + + useEffect(() => { + const interval = setInterval(async () => { + try { + const res = await sendGetFleetStatus(); + if (res.error) { + throw res.error; + } + if (res.data?.isReady && !res.data?.missing_requirements?.includes('fleet_server')) { + setIsWaitingForFleetServer(false); + } + } catch (err) { + notifications.toasts.addError(err, { + title: i18n.translate('xpack.fleet.fleetServerSetup.errorRefreshingFleetServerStatus', { + defaultMessage: 'Error refreshing Fleet Server status', + }), + }); + } + }, REFRESH_INTERVAL); + + return () => clearInterval(interval); + }, [notifications.toasts]); + + return ( + + + +

    + +

    + + + + + ), + }} + /> +
    + + +
    + ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/index.tsx new file mode 100644 index 00000000000000..3118fda75400fc --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/index.tsx @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export { CloudInstructions } from './fleet_server_cloud_instructions'; +export * from './fleet_server_on_prem_instructions'; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.test.ts new file mode 100644 index 00000000000000..e9e7e09207992b --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.test.ts @@ -0,0 +1,189 @@ +/* + * 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 { getInstallCommandForPlatform } from './install_command_utils'; + +describe('getInstallCommandForPlatform', () => { + describe('without policy id', () => { + it('should return the correct command if the the policyId is not set for linux-mac', () => { + const res = getInstallCommandForPlatform( + 'linux-mac', + 'http://elasticsearch:9200', + 'service-token-1' + ); + + expect(res).toMatchInlineSnapshot(` + "sudo ./elastic-agent install -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1" + `); + }); + + it('should return the correct command if the the policyId is not set for windows', () => { + const res = getInstallCommandForPlatform( + 'windows', + 'http://elasticsearch:9200', + 'service-token-1' + ); + + expect(res).toMatchInlineSnapshot(` + ".\\\\elastic-agent.exe install -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1" + `); + }); + + it('should return the correct command if the the policyId is not set for rpm-deb', () => { + const res = getInstallCommandForPlatform( + 'rpm-deb', + 'http://elasticsearch:9200', + 'service-token-1' + ); + + expect(res).toMatchInlineSnapshot(` + "sudo elastic-agent enroll -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1" + `); + }); + }); + + describe('with policy id', () => { + it('should return the correct command if the the policyId is set for linux-mac', () => { + const res = getInstallCommandForPlatform( + 'linux-mac', + 'http://elasticsearch:9200', + 'service-token-1', + 'policy-1' + ); + + expect(res).toMatchInlineSnapshot(` + "sudo ./elastic-agent install -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1" + `); + }); + + it('should return the correct command if the the policyId is set for windows', () => { + const res = getInstallCommandForPlatform( + 'windows', + 'http://elasticsearch:9200', + 'service-token-1', + 'policy-1' + ); + + expect(res).toMatchInlineSnapshot(` + ".\\\\elastic-agent.exe install -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1" + `); + }); + + it('should return the correct command if the the policyId is set for rpm-deb', () => { + const res = getInstallCommandForPlatform( + 'rpm-deb', + 'http://elasticsearch:9200', + 'service-token-1', + 'policy-1' + ); + + expect(res).toMatchInlineSnapshot(` + "sudo elastic-agent enroll -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1" + `); + }); + }); + + describe('with policy id and fleet server host and production deployment', () => { + it('should return the correct command if the the policyId is set for linux-mac', () => { + const res = getInstallCommandForPlatform( + 'linux-mac', + 'http://elasticsearch:9200', + 'service-token-1', + 'policy-1', + 'http://fleetserver:8220', + true + ); + + expect(res).toMatchInlineSnapshot(` + "sudo ./elastic-agent install --url=http://fleetserver:8220 \\\\ + -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --certificate-authorities= \\\\ + --fleet-server-es-ca= \\\\ + --fleet-server-cert= \\\\ + --fleet-server-cert-key=" + `); + }); + + it('should return the correct command if the the policyId is set for windows', () => { + const res = getInstallCommandForPlatform( + 'windows', + 'http://elasticsearch:9200', + 'service-token-1', + 'policy-1', + 'http://fleetserver:8220', + true + ); + + expect(res).toMatchInlineSnapshot(` + ".\\\\elastic-agent.exe install --url=http://fleetserver:8220 \\\\ + -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --certificate-authorities= \\\\ + --fleet-server-es-ca= \\\\ + --fleet-server-cert= \\\\ + --fleet-server-cert-key=" + `); + }); + + it('should return the correct command if the the policyId is set for rpm-deb', () => { + const res = getInstallCommandForPlatform( + 'rpm-deb', + 'http://elasticsearch:9200', + 'service-token-1', + 'policy-1', + 'http://fleetserver:8220', + true + ); + + expect(res).toMatchInlineSnapshot(` + "sudo elastic-agent enroll --url=http://fleetserver:8220 \\\\ + -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1 \\\\ + --fleet-server-policy=policy-1 \\\\ + --certificate-authorities= \\\\ + --fleet-server-es-ca= \\\\ + --fleet-server-cert= \\\\ + --fleet-server-cert-key=" + `); + }); + }); + + it('should return nothing for an invalid platform', () => { + const res = getInstallCommandForPlatform( + 'rpm-deb', + 'http://elasticsearch:9200', + 'service-token-1' + ); + + expect(res).toMatchInlineSnapshot(` + "sudo elastic-agent enroll -f \\\\ + --fleet-server-es=http://elasticsearch:9200 \\\\ + --fleet-server-service-token=service-token-1" + `); + }); +}); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.ts new file mode 100644 index 00000000000000..b91c4b60aa7138 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/components/install_command_utils.ts @@ -0,0 +1,47 @@ +/* + * 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 type { PLATFORM_TYPE } from '../../../../hooks'; + +export function getInstallCommandForPlatform( + platform: PLATFORM_TYPE, + esHost: string, + serviceToken: string, + policyId?: string, + fleetServerHost?: string, + isProductionDeployment?: boolean +) { + let commandArguments = ''; + + if (isProductionDeployment && fleetServerHost) { + commandArguments += `--url=${fleetServerHost} \\\n`; + } + + commandArguments += ` -f \\\n --fleet-server-es=${esHost}`; + commandArguments += ` \\\n --fleet-server-service-token=${serviceToken}`; + if (policyId) { + commandArguments += ` \\\n --fleet-server-policy=${policyId}`; + } + + if (isProductionDeployment) { + commandArguments += ` \\\n --certificate-authorities=`; + commandArguments += ` \\\n --fleet-server-es-ca=`; + commandArguments += ` \\\n --fleet-server-cert=`; + commandArguments += ` \\\n --fleet-server-cert-key=`; + } + + switch (platform) { + case 'linux-mac': + return `sudo ./elastic-agent install ${commandArguments}`; + case 'windows': + return `.\\elastic-agent.exe install ${commandArguments}`; + case 'rpm-deb': + return `sudo elastic-agent enroll ${commandArguments}`; + default: + return ''; + } +} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.test.tsx deleted file mode 100644 index e4c5840fd5f620..00000000000000 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.test.tsx +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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 { getInstallCommandForPlatform } from './fleet_server_requirement_page'; - -describe('getInstallCommandForPlatform', () => { - describe('without policy id', () => { - it('should return the correct command if the the policyId is not set for linux-mac', () => { - const res = getInstallCommandForPlatform( - 'linux-mac', - 'http://elasticsearch:9200', - 'service-token-1' - ); - - expect(res).toMatchInlineSnapshot( - `"sudo ./elastic-agent install -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1"` - ); - }); - - it('should return the correct command if the the policyId is not set for windows', () => { - const res = getInstallCommandForPlatform( - 'windows', - 'http://elasticsearch:9200', - 'service-token-1' - ); - - expect(res).toMatchInlineSnapshot( - `".\\\\elastic-agent.exe install -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1"` - ); - }); - - it('should return the correct command if the the policyId is not set for rpm-deb', () => { - const res = getInstallCommandForPlatform( - 'rpm-deb', - 'http://elasticsearch:9200', - 'service-token-1' - ); - - expect(res).toMatchInlineSnapshot( - `"sudo elastic-agent enroll -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1"` - ); - }); - }); - - describe('with policy id', () => { - it('should return the correct command if the the policyId is set for linux-mac', () => { - const res = getInstallCommandForPlatform( - 'linux-mac', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); - - expect(res).toMatchInlineSnapshot( - `"sudo ./elastic-agent install -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1 --fleet-server-policy=policy-1"` - ); - }); - - it('should return the correct command if the the policyId is set for windows', () => { - const res = getInstallCommandForPlatform( - 'windows', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); - - expect(res).toMatchInlineSnapshot( - `".\\\\elastic-agent.exe install -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1 --fleet-server-policy=policy-1"` - ); - }); - - it('should return the correct command if the the policyId is set for rpm-deb', () => { - const res = getInstallCommandForPlatform( - 'rpm-deb', - 'http://elasticsearch:9200', - 'service-token-1', - 'policy-1' - ); - - expect(res).toMatchInlineSnapshot( - `"sudo elastic-agent enroll -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1 --fleet-server-policy=policy-1"` - ); - }); - }); - - it('should return nothing for an invalid platform', () => { - const res = getInstallCommandForPlatform( - 'rpm-deb', - 'http://elasticsearch:9200', - 'service-token-1' - ); - - expect(res).toMatchInlineSnapshot( - `"sudo elastic-agent enroll -f --fleet-server-es=http://elasticsearch:9200 --fleet-server-service-token=service-token-1"` - ); - }); -}); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.tsx index 9eac6b7370ce23..c79263093abeb9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page.tsx @@ -5,398 +5,25 @@ * 2.0. */ -import React, { useState, useMemo, useCallback } from 'react'; -import { - EuiButton, - EuiFlexGroup, - EuiFlexItem, - EuiLoadingSpinner, - EuiPanel, - EuiSpacer, - EuiText, - EuiLink, - EuiEmptyPrompt, - EuiSteps, - EuiCodeBlock, - EuiCallOut, - EuiSelect, -} from '@elastic/eui'; -import type { EuiStepProps } from '@elastic/eui/src/components/steps/step'; +import React from 'react'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import styled from 'styled-components'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { DownloadStep } from '../../../components'; -import { - useStartServices, - useGetOutputs, - sendGenerateServiceToken, - usePlatform, - PLATFORM_OPTIONS, -} from '../../../hooks'; -import type { PLATFORM_TYPE } from '../../../hooks'; +import { useStartServices } from '../../../hooks'; + +import { CloudInstructions, OnPremInstructions } from './components'; const FlexItemWithMinWidth = styled(EuiFlexItem)` min-width: 0px; max-width: 100%; `; -export const ContentWrapper = styled(EuiFlexGroup)` +const ContentWrapper = styled(EuiFlexGroup)` height: 100%; margin: 0 auto; max-width: 800px; `; -// Otherwise the copy button is over the text -const CommandCode = styled.pre({ - overflow: 'scroll', -}); - -export const ServiceTokenStep = ({ - serviceToken, - getServiceToken, - isLoadingServiceToken, -}: { - serviceToken?: string; - getServiceToken: () => void; - isLoadingServiceToken: boolean; -}): EuiStepProps => { - return { - title: i18n.translate('xpack.fleet.fleetServerSetup.stepGenerateServiceTokenTitle', { - defaultMessage: 'Generate a service token', - }), - children: ( - <> - - - - - {!serviceToken ? ( - - - { - getServiceToken(); - }} - > - - - - - ) : ( - <> - - - - - - - - - - - - - {serviceToken} - - - - - )} - - ), - }; -}; - -export const FleetServerCommandStep = ({ - serviceToken, - installCommand, - platform, - setPlatform, -}: { - serviceToken?: string; - installCommand: string; - platform: string; - setPlatform: (platform: PLATFORM_TYPE) => void; -}): EuiStepProps => { - const { docLinks } = useStartServices(); - - return { - title: i18n.translate('xpack.fleet.fleetServerSetup.stepInstallAgentTitle', { - defaultMessage: 'Start Fleet Server', - }), - status: !serviceToken ? 'disabled' : undefined, - children: serviceToken ? ( - <> - - - - - ), - }} - /> - - - - - - } - options={PLATFORM_OPTIONS} - value={platform} - onChange={(e) => setPlatform(e.target.value as PLATFORM_TYPE)} - aria-label={i18n.translate('xpack.fleet.fleetServerSetup.platformSelectAriaLabel', { - defaultMessage: 'Platform', - })} - /> - - - {installCommand} - - - - - - - ), - }} - /> - - - ) : null, - }; -}; - -export function getInstallCommandForPlatform( - platform: PLATFORM_TYPE, - esHost: string, - serviceToken: string, - policyId?: string -) { - const commandArguments = `-f --fleet-server-es=${esHost} --fleet-server-service-token=${serviceToken}${ - policyId ? ` --fleet-server-policy=${policyId}` : '' - }`; - - switch (platform) { - case 'linux-mac': - return `sudo ./elastic-agent install ${commandArguments}`; - case 'windows': - return `.\\elastic-agent.exe install ${commandArguments}`; - case 'rpm-deb': - return `sudo elastic-agent enroll ${commandArguments}`; - default: - return ''; - } -} - -export const useFleetServerInstructions = (policyId?: string) => { - const outputsRequest = useGetOutputs(); - const { notifications } = useStartServices(); - const [serviceToken, setServiceToken] = useState(); - const [isLoadingServiceToken, setIsLoadingServiceToken] = useState(false); - const { platform, setPlatform } = usePlatform(); - - const output = outputsRequest.data?.items?.[0]; - const esHost = output?.hosts?.[0]; - - const installCommand = useMemo((): string => { - if (!serviceToken || !esHost) { - return ''; - } - - return getInstallCommandForPlatform(platform, esHost, serviceToken, policyId); - }, [serviceToken, esHost, platform, policyId]); - - const getServiceToken = useCallback(async () => { - setIsLoadingServiceToken(true); - try { - const { data } = await sendGenerateServiceToken(); - if (data?.value) { - setServiceToken(data?.value); - } - } catch (err) { - notifications.toasts.addError(err, { - title: i18n.translate('xpack.fleet.fleetServerSetup.errorGeneratingTokenTitleText', { - defaultMessage: 'Error generating token', - }), - }); - } - - setIsLoadingServiceToken(false); - }, [notifications]); - - return { - serviceToken, - getServiceToken, - isLoadingServiceToken, - installCommand, - platform, - setPlatform, - }; -}; - -const OnPremInstructions: React.FC = () => { - const { - serviceToken, - getServiceToken, - isLoadingServiceToken, - installCommand, - platform, - setPlatform, - } = useFleetServerInstructions(); - const { docLinks } = useStartServices(); - - return ( - - - -

    - -

    - - - - - ), - }} - /> -
    - - -
    - ); -}; - -const CloudInstructions: React.FC<{ deploymentUrl: string }> = ({ deploymentUrl }) => { - const { docLinks } = useStartServices(); - - return ( - - - - - } - body={ - - - - ), - }} - /> - } - actions={ - <> - - - - - } - /> - - ); -}; - export const FleetServerRequirementPage = () => { const startService = useStartServices(); const deploymentUrl = startService.cloud?.deploymentUrl; @@ -411,23 +38,7 @@ export const FleetServerRequirementPage = () => { )} - - - - - - - - - - - - - ); }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/index.tsx index 9e6505ede49183..9993014f55cdbc 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_requirements_page/index.tsx @@ -6,9 +6,4 @@ */ export { MissingESRequirementsPage } from './es_requirements_page'; -export { - FleetServerRequirementPage, - ServiceTokenStep, - FleetServerCommandStep, - useFleetServerInstructions, -} from './fleet_server_requirement_page'; +export { FleetServerRequirementPage } from './fleet_server_requirement_page'; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx index 79b19b443cca14..52a4c9d17648b7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx @@ -5,18 +5,20 @@ * 2.0. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { HashRouter as Router, Route, Switch } from 'react-router-dom'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiPortal } from '@elastic/eui'; import { FLEET_ROUTING_PATHS } from '../../constants'; -import { Loading, Error } from '../../components'; +import { Loading, Error, AgentEnrollmentFlyout } from '../../components'; import { useConfig, useFleetStatus, useBreadcrumbs, useCapabilities, useGetSettings, + useGetAgentPolicies, } from '../../hooks'; import { DefaultLayout, WithoutHeaderLayout } from '../../layouts'; @@ -26,18 +28,26 @@ import { AgentDetailsPage } from './agent_details_page'; import { NoAccessPage } from './error_pages/no_access'; import { FleetServerUpgradeModal } from './components/fleet_server_upgrade_modal'; -const REFRESH_INTERVAL_MS = 30000; - export const AgentsApp: React.FunctionComponent = () => { useBreadcrumbs('agent_list'); const { agents } = useConfig(); const capabilities = useCapabilities(); + const agentPoliciesRequest = useGetAgentPolicies({ + page: 1, + perPage: 1000, + }); + + const agentPolicies = useMemo(() => agentPoliciesRequest.data?.items || [], [ + agentPoliciesRequest.data, + ]); + const fleetStatus = useFleetStatus(); const settings = useGetSettings(); + const [isEnrollmentFlyoutOpen, setIsEnrollmentFlyoutOpen] = useState(false); const [fleetServerModalVisible, setFleetServerModalVisible] = useState(false); const onCloseFleetServerModal = useCallback(() => { setFleetServerModalVisible(false); @@ -50,25 +60,6 @@ export const AgentsApp: React.FunctionComponent = () => { } }, [settings.data]); - useEffect(() => { - if ( - !agents.enabled || - fleetStatus.isLoading || - !fleetStatus.missingRequirements || - !fleetStatus.missingRequirements.includes('fleet_server') - ) { - return; - } - - const interval = setInterval(() => { - fleetStatus.refresh(); - }, REFRESH_INTERVAL_MS); - - return () => { - clearInterval(interval); - }; - }, [fleetStatus, agents.enabled]); - if (!agents.enabled) return null; if (!fleetStatus.missingRequirements && fleetStatus.isLoading) { return ; @@ -105,6 +96,27 @@ export const AgentsApp: React.FunctionComponent = () => { return ; } + const rightColumn = hasOnlyFleetServerMissingRequirement ? ( + <> + {isEnrollmentFlyoutOpen && ( + + setIsEnrollmentFlyoutOpen(false)} + /> + + )} + + + setIsEnrollmentFlyoutOpen(true)}> + + + + + + ) : undefined; + return ( @@ -112,7 +124,7 @@ export const AgentsApp: React.FunctionComponent = () => { - + {fleetServerModalVisible && ( )} diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.ts b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.ts index fcf10785664986..d16be0d8b97e2c 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.ts +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.mocks.ts @@ -14,6 +14,19 @@ jest.mock('../../hooks/use_request', () => { }; }); +jest.mock( + '../../applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_on_prem_instructions', + () => { + const module = jest.requireActual( + '../../applications/fleet/sections/agents/agent_requirements_page/components/fleet_server_on_prem_instructions' + ); + return { + ...module, + useFleetServerInstructions: jest.fn(), + }; + } +); + jest.mock( '../../applications/fleet/sections/agents/agent_requirements_page/fleet_server_requirement_page', () => { @@ -23,7 +36,6 @@ jest.mock( return { ...module, FleetServerRequirementPage: jest.fn(), - useFleetServerInstructions: jest.fn(), }; } ); diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx index 65118044e98c56..f6d62d45a4e56d 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_enrollment_flyout.test.tsx @@ -19,7 +19,7 @@ import type { AgentPolicy } from '../../../common'; import { useGetSettings, sendGetFleetStatus } from '../../hooks/use_request'; import { FleetStatusProvider, ConfigContext } from '../../hooks'; -import { useFleetServerInstructions } from '../../applications/fleet/sections/agents/agent_requirements_page'; +import { useFleetServerInstructions } from '../../applications/fleet/sections/agents/agent_requirements_page/components'; import { AgentEnrollmentKeySelectionStep, AgentPolicySelectionStep, ViewDataStep } from './steps'; diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx index 58362d85e2fb32..9e4bdf386ef478 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/index.tsx @@ -29,8 +29,11 @@ import { StandaloneInstructions } from './standalone_instructions'; import { MissingFleetServerHostCallout } from './missing_fleet_server_host_callout'; import type { BaseProps } from './types'; +type FlyoutMode = 'managed' | 'standalone'; + export interface Props extends BaseProps { onClose: () => void; + defaultMode?: FlyoutMode; } export * from './agent_policy_selection'; @@ -43,8 +46,9 @@ export const AgentEnrollmentFlyout: React.FunctionComponent = ({ agentPolicy, agentPolicies, viewDataStepContent, + defaultMode = 'managed', }) => { - const [mode, setMode] = useState<'managed' | 'standalone'>('managed'); + const [mode, setMode] = useState(defaultMode); const { modal } = useUrlModal(); const [lastModal, setLastModal] = useState(modal); diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx index efae8db377f7f1..c739725b797393 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/managed_instructions.tsx @@ -15,11 +15,13 @@ import { useGetOneEnrollmentAPIKey, useGetSettings, useLink, useFleetStatus } fr import { ManualInstructions } from '../../components/enrollment_instructions'; import { - FleetServerRequirementPage, + deploymentModeStep, ServiceTokenStep, FleetServerCommandStep, useFleetServerInstructions, -} from '../../applications/fleet/sections/agents/agent_requirements_page'; + addFleetServerHostStep, +} from '../../applications/fleet/sections/agents/agent_requirements_page/components'; +import { FleetServerRequirementPage } from '../../applications/fleet/sections/agents/agent_requirements_page'; import { DownloadStep, @@ -69,7 +71,7 @@ export const ManagedInstructions = React.memo( const settings = useGetSettings(); const fleetServerInstructions = useFleetServerInstructions(apiKey?.data?.item?.policy_id); - const steps = useMemo(() => { + const fleetServerSteps = useMemo(() => { const { serviceToken, getServiceToken, @@ -77,7 +79,20 @@ export const ManagedInstructions = React.memo( installCommand, platform, setPlatform, + deploymentMode, + setDeploymentMode, + addFleetServerHost, } = fleetServerInstructions; + + return [ + deploymentModeStep({ deploymentMode, setDeploymentMode }), + addFleetServerHostStep({ addFleetServerHost }), + ServiceTokenStep({ serviceToken, getServiceToken, isLoadingServiceToken }), + FleetServerCommandStep({ serviceToken, installCommand, platform, setPlatform }), + ]; + }, [fleetServerInstructions]); + + const steps = useMemo(() => { const fleetServerHosts = settings.data?.item?.fleet_server_hosts || []; const baseSteps: EuiContainedStepProps[] = [ DownloadStep(), @@ -91,12 +106,7 @@ export const ManagedInstructions = React.memo( : AgentEnrollmentKeySelectionStep({ agentPolicy, selectedApiKeyId, setSelectedAPIKeyId }), ]; if (isFleetServerPolicySelected) { - baseSteps.push( - ...[ - ServiceTokenStep({ serviceToken, getServiceToken, isLoadingServiceToken }), - FleetServerCommandStep({ serviceToken, installCommand, platform, setPlatform }), - ] - ); + baseSteps.push(...fleetServerSteps); } else { baseSteps.push({ title: i18n.translate('xpack.fleet.agentEnrollment.stepEnrollAndRunAgentTitle', { @@ -115,13 +125,14 @@ export const ManagedInstructions = React.memo( return baseSteps; }, [ agentPolicy, - agentPolicies, selectedApiKeyId, + setSelectedAPIKeyId, + viewDataStepContent, + agentPolicies, apiKey.data, + fleetServerSteps, isFleetServerPolicySelected, settings.data?.item?.fleet_server_hosts, - fleetServerInstructions, - viewDataStepContent, ]); return ( diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx index 8b12994473e347..f77cba754e909f 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps.tsx @@ -27,7 +27,7 @@ export const DownloadStep = () => { diff --git a/x-pack/plugins/fleet/public/hooks/use_fleet_status.tsx b/x-pack/plugins/fleet/public/hooks/use_fleet_status.tsx index 24ecc458d6bcc6..c8965f8be0156f 100644 --- a/x-pack/plugins/fleet/public/hooks/use_fleet_status.tsx +++ b/x-pack/plugins/fleet/public/hooks/use_fleet_status.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState, useContext, useEffect } from 'react'; +import React, { useState, useContext, useEffect, useCallback } from 'react'; import type { GetFleetStatusResponse } from '../types'; @@ -33,30 +33,35 @@ export const FleetStatusProvider: React.FC = ({ children }) => { isLoading: false, isReady: false, }); - async function sendGetStatus() { - try { - setState((s) => ({ ...s, isLoading: true })); - const res = await sendGetFleetStatus(); - if (res.error) { - throw res.error; - } + const sendGetStatus = useCallback( + async function sendGetStatus() { + try { + setState((s) => ({ ...s, isLoading: true })); + const res = await sendGetFleetStatus(); + if (res.error) { + throw res.error; + } - setState((s) => ({ - ...s, - isLoading: false, - isReady: res.data?.isReady ?? false, - missingRequirements: res.data?.missing_requirements, - })); - } catch (error) { - setState((s) => ({ ...s, isLoading: false, error })); - } - } + setState((s) => ({ + ...s, + isLoading: false, + isReady: res.data?.isReady ?? false, + missingRequirements: res.data?.missing_requirements, + })); + } catch (error) { + setState((s) => ({ ...s, isLoading: false, error })); + } + }, + [setState] + ); useEffect(() => { sendGetStatus(); - }, []); + }, [sendGetStatus]); + + const refresh = useCallback(() => sendGetStatus(), [sendGetStatus]); return ( - sendGetStatus() }}> + {children} ); From 6c172ead1963bec6c078a1e1bc0047029bc5dbea Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Tue, 29 Jun 2021 14:38:56 -0400 Subject: [PATCH 114/227] Convert security management pages to new layout (#101660) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../api_keys_grid/api_keys_grid_page.tsx | 81 ++-- .../permission_denied/permission_denied.tsx | 46 ++- .../no_compatible_realms.tsx | 4 +- .../permission_denied/permission_denied.tsx | 46 ++- .../edit_role_mapping_page.tsx | 105 +++--- .../mapping_info_panel/mapping_info_panel.tsx | 2 +- .../rule_editor_panel/rule_editor_panel.tsx | 2 +- .../rule_editor_panel/rule_group_editor.tsx | 2 + .../role_mappings_grid_page.tsx | 4 +- .../collapsible_panel.test.tsx.snap | 5 +- .../collapsible_panel/collapsible_panel.tsx | 2 +- .../roles/edit_role/edit_role_page.tsx | 2 +- .../elasticsearch_privileges.test.tsx.snap | 2 +- .../es/elasticsearch_privileges.tsx | 2 +- .../space_aware_privilege_section.tsx | 2 +- .../roles_grid_page.test.tsx.snap | 185 +++++---- .../permission_denied/permission_denied.tsx | 46 ++- .../roles/roles_grid/roles_grid_page.tsx | 173 ++++----- .../users/edit_user/create_user_page.tsx | 42 +-- .../users/edit_user/edit_user_page.tsx | 354 +++++++++--------- .../users/users_grid/users_grid_page.tsx | 116 +++--- x-pack/plugins/spaces/kibana.json | 1 + .../edit_space/manage_space_page.tsx | 59 +-- .../__snapshots__/section_panel.test.tsx.snap | 5 +- .../section_panel/section_panel.tsx | 2 +- .../spaces_grid_page.test.tsx.snap | 197 +++++----- .../spaces_grid/spaces_grid_page.tsx | 109 +++--- .../management/spaces_management_app.test.tsx | 6 +- .../management/spaces_management_app.tsx | 3 +- x-pack/plugins/spaces/tsconfig.json | 1 + .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 32 files changed, 783 insertions(+), 825 deletions(-) diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx index 452b119e83921d..9b05876c419d98 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/api_keys_grid_page.tsx @@ -17,11 +17,9 @@ import { EuiInMemoryTable, EuiPageContent, EuiPageContentBody, - EuiPageContentHeader, - EuiPageContentHeaderSection, + EuiPageHeader, EuiSpacer, EuiText, - EuiTitle, EuiToolTip, } from '@elastic/eui'; import type { History } from 'history'; @@ -126,7 +124,7 @@ export class APIKeysGridPage extends Component { if (!apiKeys) { if (isLoadingApp) { return ( - + { if (error) { return ( - + { if (!isLoadingTable && apiKeys && apiKeys.length === 0) { return ( - + - + { const concatenated = `${this.state.createdApiKey?.id}:${this.state.createdApiKey?.api_key}`; return ( - - - - -

    + <> + + } + description={ + <> + {isAdmin ? ( -

    -
    - -

    - {isAdmin ? ( - - ) : ( - - )} -

    -
    -
    - - + ) : ( + + )} + + } + rightSideItems={[ + - - -
    +
    , + ]} + /> + + {this.state.createdApiKey && !this.state.isLoadingTable && ( <> @@ -302,7 +307,7 @@ export class APIKeysGridPage extends Component { )} {this.renderTable()} -
    + ); } diff --git a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/permission_denied/permission_denied.tsx b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/permission_denied/permission_denied.tsx index de97de0516e20b..994963b6e3d977 100644 --- a/x-pack/plugins/security/public/management/api_keys/api_keys_grid/permission_denied/permission_denied.tsx +++ b/x-pack/plugins/security/public/management/api_keys/api_keys_grid/permission_denied/permission_denied.tsx @@ -5,33 +5,31 @@ * 2.0. */ -import { EuiEmptyPrompt, EuiFlexGroup, EuiPageContent } from '@elastic/eui'; +import { EuiEmptyPrompt, EuiPageContent } from '@elastic/eui'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; export const PermissionDenied = () => ( - - - - - - } - body={ -

    - -

    - } - /> -
    -
    + + + + + } + body={ +

    + +

    + } + /> +
    ); diff --git a/x-pack/plugins/security/public/management/role_mappings/components/no_compatible_realms/no_compatible_realms.tsx b/x-pack/plugins/security/public/management/role_mappings/components/no_compatible_realms/no_compatible_realms.tsx index facf543601d7dd..dbc0c6e5d1f5ae 100644 --- a/x-pack/plugins/security/public/management/role_mappings/components/no_compatible_realms/no_compatible_realms.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/components/no_compatible_realms/no_compatible_realms.tsx @@ -19,7 +19,7 @@ export const NoCompatibleRealms: React.FunctionComponent = () => { title={ } color="warning" @@ -27,7 +27,7 @@ export const NoCompatibleRealms: React.FunctionComponent = () => { > diff --git a/x-pack/plugins/security/public/management/role_mappings/components/permission_denied/permission_denied.tsx b/x-pack/plugins/security/public/management/role_mappings/components/permission_denied/permission_denied.tsx index 65af6482a0b82f..b6e7eff4099e22 100644 --- a/x-pack/plugins/security/public/management/role_mappings/components/permission_denied/permission_denied.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/components/permission_denied/permission_denied.tsx @@ -5,33 +5,31 @@ * 2.0. */ -import { EuiEmptyPrompt, EuiFlexGroup, EuiPageContent } from '@elastic/eui'; +import { EuiEmptyPrompt, EuiPageContent } from '@elastic/eui'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; export const PermissionDenied = () => ( - - - - - - } - body={ -

    - -

    - } - /> -
    -
    + + + + + } + body={ +

    + +

    + } + /> +
    ); diff --git a/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/edit_role_mapping_page.tsx b/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/edit_role_mapping_page.tsx index 4f238f819f3207..00f03b94436eaf 100644 --- a/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/edit_role_mapping_page.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/edit_role_mapping_page.tsx @@ -13,11 +13,10 @@ import { EuiForm, EuiLink, EuiPageContent, + EuiPageHeader, EuiSpacer, - EuiText, - EuiTitle, } from '@elastic/eui'; -import React, { Component, Fragment } from 'react'; +import React, { Component } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -96,17 +95,50 @@ export class EditRoleMappingPage extends Component { if (loadState === 'loading') { return ( - + ); } return ( -
    + <> + + + + + ), + }} + /> + {!this.state.hasCompatibleRealms && ( + <> + + + + )} + + } + /> + + + - {this.getFormTitle()} - this.setState({ roleMapping })} @@ -135,57 +167,24 @@ export class EditRoleMappingPage extends Component { {this.getFormButtons()} -
    + ); } private getFormTitle = () => { + if (this.editingExistingRoleMapping()) { + return ( + + ); + } return ( - - -

    - {this.editingExistingRoleMapping() ? ( - - ) : ( - - )} -

    -
    - -

    - - - - ), - }} - /> -

    -
    - {!this.state.hasCompatibleRealms && ( - <> - - - - )} -
    + ); }; diff --git a/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/mapping_info_panel/mapping_info_panel.tsx b/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/mapping_info_panel/mapping_info_panel.tsx index 3eb935e152f330..2c239709f145d3 100644 --- a/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/mapping_info_panel/mapping_info_panel.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/edit_role_mapping/mapping_info_panel/mapping_info_panel.tsx @@ -61,7 +61,7 @@ export class MappingInfoPanel extends Component { } public render() { return ( - +

    { } return ( - +

    { return ( diff --git a/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx b/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx index 0e8b1c18fdc1cc..60999c6b0a7990 100644 --- a/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx +++ b/x-pack/plugins/security/public/management/role_mappings/role_mappings_grid/role_mappings_grid_page.tsx @@ -88,7 +88,7 @@ export class RoleMappingsGridPage extends Component { if (loadState === 'loadingApp') { return ( - + { } = error; return ( - + + { public render() { return ( - + {this.getTitle()} {this.getForm()} diff --git a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx index 0f49aaf48c3945..ef1338ab9d9713 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx @@ -374,7 +374,7 @@ export const EditRolePage: FunctionComponent = ({ const getRoleName = () => { return ( - + { {this.props.editable && ( - + { diff --git a/x-pack/plugins/security/public/management/roles/roles_grid/__snapshots__/roles_grid_page.test.tsx.snap b/x-pack/plugins/security/public/management/roles/roles_grid/__snapshots__/roles_grid_page.test.tsx.snap index f36a1bf477b06c..74127617bfd458 100644 --- a/x-pack/plugins/security/public/management/roles/roles_grid/__snapshots__/roles_grid_page.test.tsx.snap +++ b/x-pack/plugins/security/public/management/roles/roles_grid/__snapshots__/roles_grid_page.test.tsx.snap @@ -2,61 +2,86 @@ exports[` renders permission denied if required 1`] = ` - -
    - - + +

    + } + iconType="securityApp" + title={ +

    + +

    + } >
    - - -

    - } - iconType="securityApp" - title={ -

    - -

    - } + + + +
    + + +

    - - - + You need permission to manage roles + +

    +
    + + @@ -64,59 +89,29 @@ exports[` renders permission denied if required 1`] = ` className="euiSpacer euiSpacer--m" /> - -

    - - You need permission to manage roles - -

    -
    - - +
    - -
    - - -
    -

    - - Contact your system administrator. - -

    -
    -
    - - -
    - + Contact your system administrator. + +

    +
    + +
    +
    - - -
    - + +
    +
    +
    `; diff --git a/x-pack/plugins/security/public/management/roles/roles_grid/permission_denied/permission_denied.tsx b/x-pack/plugins/security/public/management/roles/roles_grid/permission_denied/permission_denied.tsx index 5506bce345ffbf..7b93ce48b6d3cb 100644 --- a/x-pack/plugins/security/public/management/roles/roles_grid/permission_denied/permission_denied.tsx +++ b/x-pack/plugins/security/public/management/roles/roles_grid/permission_denied/permission_denied.tsx @@ -5,33 +5,31 @@ * 2.0. */ -import { EuiEmptyPrompt, EuiFlexGroup, EuiPageContent } from '@elastic/eui'; +import { EuiEmptyPrompt, EuiPageContent } from '@elastic/eui'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; export const PermissionDenied = () => ( - - - - -

    - } - body={ -

    - -

    - } - /> - - + + + +

    + } + body={ +

    + +

    + } + /> +
    ); diff --git a/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx b/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx index 5f90774d7dfedf..909c5b1193cd93 100644 --- a/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx +++ b/x-pack/plugins/security/public/management/roles/roles_grid/roles_grid_page.tsx @@ -13,13 +13,10 @@ import { EuiFlexItem, EuiInMemoryTable, EuiLink, - EuiPageContent, - EuiPageContentBody, - EuiPageContentHeader, - EuiPageContentHeaderSection, + EuiPageHeader, + EuiSpacer, EuiSwitch, EuiText, - EuiTitle, } from '@elastic/eui'; import _ from 'lodash'; import React, { Component } from 'react'; @@ -90,100 +87,96 @@ export class RolesGridPage extends Component { private getPageContent = () => { const { roles } = this.state; return ( - - - - -

    - -

    -
    - -

    - -

    -
    -
    - + <> + + } + description={ + + } + rightSideItems={[ - - -
    - - {this.state.showDeleteConfirmation ? ( - role.name)} - callback={this.handleDelete} - notifications={this.props.notifications} - rolesAPIClient={this.props.rolesAPIClient} - /> - ) : null} +
    , + ]} + /> - { - !role.metadata || !role.metadata._reserved, - selectableMessage: (selectable: boolean) => (!selectable ? 'Role is reserved' : ''), - onSelectionChange: (selection: Role[]) => this.setState({ selection }), - }} - pagination={{ - initialPageSize: 20, - pageSizeOptions: [10, 20, 30, 50, 100], - }} - items={this.state.visibleRoles} - loading={roles.length === 0} - search={{ - toolsLeft: this.renderToolsLeft(), - toolsRight: this.renderToolsRight(), - box: { - incremental: true, - 'data-test-subj': 'searchRoles', - }, - onChange: (query: Record) => { - this.setState({ - filter: query.queryText, - visibleRoles: this.getVisibleRoles( - this.state.roles, - query.queryText, - this.state.includeReservedRoles - ), - }); - }, - }} - sorting={{ - sort: { - field: 'name', - direction: 'asc', - }, - }} - rowProps={() => { - return { - 'data-test-subj': 'roleRow', - }; - }} - isSelectable - /> - } - -
    + + + {this.state.showDeleteConfirmation ? ( + role.name)} + callback={this.handleDelete} + notifications={this.props.notifications} + rolesAPIClient={this.props.rolesAPIClient} + /> + ) : null} + + !role.metadata || !role.metadata._reserved, + selectableMessage: (selectable: boolean) => (!selectable ? 'Role is reserved' : ''), + onSelectionChange: (selection: Role[]) => this.setState({ selection }), + }} + pagination={{ + initialPageSize: 20, + pageSizeOptions: [10, 20, 30, 50, 100], + }} + items={this.state.visibleRoles} + loading={roles.length === 0} + search={{ + toolsLeft: this.renderToolsLeft(), + toolsRight: this.renderToolsRight(), + box: { + incremental: true, + 'data-test-subj': 'searchRoles', + }, + onChange: (query: Record) => { + this.setState({ + filter: query.queryText, + visibleRoles: this.getVisibleRoles( + this.state.roles, + query.queryText, + this.state.includeReservedRoles + ), + }); + }, + }} + sorting={{ + sort: { + field: 'name', + direction: 'asc', + }, + }} + rowProps={() => { + return { + 'data-test-subj': 'roleRow', + }; + }} + isSelectable + /> + ); }; diff --git a/x-pack/plugins/security/public/management/users/edit_user/create_user_page.tsx b/x-pack/plugins/security/public/management/users/edit_user/create_user_page.tsx index cb76d54981a111..c82ea52b074789 100644 --- a/x-pack/plugins/security/public/management/users/edit_user/create_user_page.tsx +++ b/x-pack/plugins/security/public/management/users/edit_user/create_user_page.tsx @@ -5,14 +5,7 @@ * 2.0. */ -import { - EuiHorizontalRule, - EuiPageContent, - EuiPageContentBody, - EuiPageContentHeader, - EuiPageContentHeaderSection, - EuiTitle, -} from '@elastic/eui'; +import { EuiPageHeader, EuiSpacer } from '@elastic/eui'; import type { FunctionComponent } from 'react'; import React from 'react'; import { useHistory } from 'react-router-dom'; @@ -26,23 +19,20 @@ export const CreateUserPage: FunctionComponent = () => { const backToUsers = () => history.push('/'); return ( - - - - -

    - -

    -
    -
    -
    - - - - -
    + <> + + } + /> + + + + + ); }; diff --git a/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx b/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx index 74a5a923aac68d..66216da49be951 100644 --- a/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx +++ b/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx @@ -15,10 +15,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, - EuiPageContent, - EuiPageContentBody, - EuiPageContentHeader, - EuiPageContentHeaderSection, + EuiPageHeader, EuiPanel, EuiSpacer, EuiText, @@ -82,9 +79,10 @@ export const EditUserPage: FunctionComponent = ({ username }) const displayName = getUserDisplayName(user); return ( - - - + <> + @@ -96,227 +94,227 @@ export const EditUserPage: FunctionComponent = ({ username }) {user.email} - - - - - {isDeprecatedUser ? ( - <> - - } - iconType="alert" - color="warning" - > - {user.metadata?._deprecated_reason?.replace(/\[(.+)\]/, "'$1'")} - - - - ) : isReservedUser ? ( - <> - + + + + {isDeprecatedUser ? ( + <> + + } + iconType="alert" + color="warning" + > + {user.metadata?._deprecated_reason?.replace(/\[(.+)\]/, "'$1'")} + + + + ) : isReservedUser ? ( + <> + + } + iconType="lock" + /> + + + ) : user.enabled === false ? ( + <> + + } + > + setAction('enableUser')} size="s"> + + + + + + ) : undefined} + + + + {action === 'changePassword' ? ( + setAction('none')} + onSuccess={() => setAction('none')} + /> + ) : action === 'disableUser' ? ( + setAction('none')} + onSuccess={() => { + setAction('none'); + getUser(); + }} + /> + ) : action === 'enableUser' ? ( + setAction('none')} + onSuccess={() => { + setAction('none'); + getUser(); + }} + /> + ) : action === 'deleteUser' ? ( + setAction('none')} + onSuccess={backToUsers} + /> + ) : undefined} + + + + + + + + + - } - iconType="lock" - /> - - - ) : user.enabled === false ? ( - <> - + - } - > + + + + + setAction('changePassword')} size="s"> + + + + + + + + {user.enabled === false ? ( + + + + + + + + + + + + + setAction('enableUser')} size="s"> - - - - ) : undefined} - - - - {action === 'changePassword' ? ( - setAction('none')} - onSuccess={() => setAction('none')} - /> - ) : action === 'disableUser' ? ( - setAction('none')} - onSuccess={() => { - setAction('none'); - getUser(); - }} - /> - ) : action === 'enableUser' ? ( - setAction('none')} - onSuccess={() => { - setAction('none'); - getUser(); - }} - /> - ) : action === 'deleteUser' ? ( - setAction('none')} - onSuccess={backToUsers} - /> - ) : undefined} - - - - - + + + + ) : ( + - setAction('changePassword')} size="s"> + setAction('disableUser')} size="s"> + )} - - {user.enabled === false ? ( - + {!isReservedUser && ( + <> + + - - - - - - - - setAction('enableUser')} size="s"> - - - - - - ) : ( - - - - - - - setAction('disableUser')} size="s"> + setAction('deleteUser')} size="s" color="danger"> - )} - - {!isReservedUser && ( - <> - - - - - - - - - - - - - - - setAction('deleteUser')} size="s" color="danger"> - - - - - - - )} - - + + )} + ); }; diff --git a/x-pack/plugins/security/public/management/users/users_grid/users_grid_page.tsx b/x-pack/plugins/security/public/management/users/users_grid/users_grid_page.tsx index 5b44c2f3c716cf..b7cdf27dc6be5a 100644 --- a/x-pack/plugins/security/public/management/users/users_grid/users_grid_page.tsx +++ b/x-pack/plugins/security/public/management/users/users_grid/users_grid_page.tsx @@ -14,11 +14,9 @@ import { EuiInMemoryTable, EuiLink, EuiPageContent, - EuiPageContentBody, - EuiPageContentHeader, - EuiPageContentHeaderSection, + EuiPageHeader, + EuiSpacer, EuiSwitch, - EuiTitle, } from '@elastic/eui'; import React, { Component } from 'react'; @@ -80,7 +78,7 @@ export class UsersGridPage extends Component { if (permissionDenied) { return ( - + { }; return ( -
    - - - - -

    - -

    -
    -
    - - - - - -
    - - {showDeleteConfirmation ? ( - user.username)} - callback={this.handleDelete} - userAPIClient={this.props.userAPIClient} - notifications={this.props.notifications} + <> + + } + rightSideItems={[ + + - ) : null} + , + ]} + /> - { - - } - -
    -
    + + + {showDeleteConfirmation ? ( + user.username)} + callback={this.handleDelete} + userAPIClient={this.props.userAPIClient} + notifications={this.props.notifications} + /> + ) : null} + + { + + } + ); } diff --git a/x-pack/plugins/spaces/kibana.json b/x-pack/plugins/spaces/kibana.json index 673055b24e8b61..e01224d03bfc39 100644 --- a/x-pack/plugins/spaces/kibana.json +++ b/x-pack/plugins/spaces/kibana.json @@ -20,6 +20,7 @@ "ui": true, "extraPublicDirs": ["common"], "requiredBundles": [ + "esUiShared", "kibanaReact", "savedObjectsManagement", "home" diff --git a/x-pack/plugins/spaces/public/management/edit_space/manage_space_page.tsx b/x-pack/plugins/spaces/public/management/edit_space/manage_space_page.tsx index d00ee0bb26a3e5..5d9ef3e1316ffc 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/manage_space_page.tsx +++ b/x-pack/plugins/spaces/public/management/edit_space/manage_space_page.tsx @@ -10,10 +10,9 @@ import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, - EuiLoadingSpinner, - EuiPageContentBody, + EuiPageContent, + EuiPageHeader, EuiSpacer, - EuiText, EuiTitle, } from '@elastic/eui'; import _ from 'lodash'; @@ -29,8 +28,10 @@ import type { } from 'src/core/public'; import type { Space } from 'src/plugins/spaces_oss/common'; +import { SectionLoading } from '../../../../../../src/plugins/es_ui_shared/public'; import type { FeaturesPluginStart, KibanaFeature } from '../../../../features/public'; import { isReservedSpace } from '../../../common'; +import { getSpacesFeatureDescription } from '../../constants'; import type { SpacesManager } from '../../spaces_manager'; import { UnauthorizedPrompt } from '../components'; import { toSpaceIdentifier } from '../lib'; @@ -110,46 +111,48 @@ export class ManageSpacePage extends Component { } public render() { - const content = this.state.isLoading ? this.getLoadingIndicator() : this.getForm(); + if (!this.props.capabilities.spaces.manage) { + return ( + + + + ); + } + + if (this.state.isLoading) { + return this.getLoadingIndicator(); + } return ( - {content} + + + + {this.getForm()} ); } public getLoadingIndicator = () => ( -
    - {' '} - -

    Loading...

    -
    -
    + + + + + ); public getForm = () => { - if (!this.props.capabilities.spaces.manage) { - return ; - } - const { showAlteringActiveSpaceDialog } = this.state; return (
    - {this.getFormHeading()} - - - - - - - - - + { public render() { return ( - + {this.getTitle()} {this.getForm()} diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/__snapshots__/spaces_grid_page.test.tsx.snap b/x-pack/plugins/spaces/public/management/spaces_grid/__snapshots__/spaces_grid_page.test.tsx.snap index a754eaf73620f9..b61012f0cd33a6 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/__snapshots__/spaces_grid_page.test.tsx.snap +++ b/x-pack/plugins/spaces/public/management/spaces_grid/__snapshots__/spaces_grid_page.test.tsx.snap @@ -5,41 +5,22 @@ exports[`SpacesGridPage renders as expected 1`] = ` className="spcGridPage" data-test-subj="spaces-grid-page" > - - - - -

    - -

    -
    - -

    - Organize your dashboards and other saved objects into meaningful categories. -

    -
    -
    - + + } + rightSideItems={ + Array [ - - -
    - - - } - pagination={true} - responsive={true} - rowHeader="name" - search={ + , + ] + } + /> + + + } + pagination={true} + responsive={true} + rowHeader="name" + search={ + Object { + "box": Object { + "placeholder": "Search", + }, } - sorting={true} - tableCaption="Kibana spaces" - tableLayout="fixed" - /> -
    + } + sorting={true} + tableCaption="Kibana spaces" + tableLayout="fixed" + />
    `; diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index a4f797e441ab5e..1e3fde827b0505 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -8,17 +8,15 @@ import { EuiButton, EuiButtonIcon, - EuiFlexGroup, - EuiFlexItem, EuiInMemoryTable, EuiLink, EuiLoadingSpinner, EuiPageContent, + EuiPageHeader, EuiSpacer, EuiText, - EuiTitle, } from '@elastic/eui'; -import React, { Component, Fragment, lazy, Suspense } from 'react'; +import React, { Component, lazy, Suspense } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -83,7 +81,19 @@ export class SpacesGridPage extends Component { public render() { return (
    - {this.getPageContent()} + + } + description={getSpacesFeatureDescription()} + rightSideItems={[this.getPrimaryActionButton()]} + /> + + {this.getPageContent()} {this.getConfirmDeleteModal()}
    ); @@ -91,61 +101,45 @@ export class SpacesGridPage extends Component { public getPageContent() { if (!this.props.capabilities.spaces.manage) { - return ; + return ( + + + + ); } return ( - - - - -

    - -

    -
    - -

    {getSpacesFeatureDescription()}

    -
    -
    - {this.getPrimaryActionButton()} -
    - - - - ) : undefined - } - /> -
    + + ) : undefined + } + /> ); } @@ -153,6 +147,7 @@ export class SpacesGridPage extends Component { return ( diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx index 76467bd838a104..9e419862893be8 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx @@ -83,7 +83,7 @@ describe('spacesManagementApp', () => { expect(container).toMatchInlineSnapshot(`
    @@ -109,7 +109,7 @@ describe('spacesManagementApp', () => { expect(container).toMatchInlineSnapshot(`
    @@ -141,7 +141,7 @@ describe('spacesManagementApp', () => { expect(container).toMatchInlineSnapshot(`
    diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx index c97ec5fbcc227f..12573ce1eac1b0 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx @@ -14,6 +14,7 @@ import type { StartServicesAccessor } from 'src/core/public'; import type { RegisterManagementAppArgs } from 'src/plugins/management/public'; import type { Space } from 'src/plugins/spaces_oss/common'; +import { APP_WRAPPER_CLASS } from '../../../../../src/core/public'; import { KibanaContextProvider, RedirectAppLinks, @@ -125,7 +126,7 @@ export const spacesManagementApp = Object.freeze({ render( - + diff --git a/x-pack/plugins/spaces/tsconfig.json b/x-pack/plugins/spaces/tsconfig.json index 95fbecaa909366..3888519555d226 100644 --- a/x-pack/plugins/spaces/tsconfig.json +++ b/x-pack/plugins/spaces/tsconfig.json @@ -11,6 +11,7 @@ "references": [ { "path": "../features/tsconfig.json" }, { "path": "../licensing/tsconfig.json" }, + { "path": "../../../src/plugins/es_ui_shared/tsconfig.json" }, { "path": "../../../src/plugins/advanced_settings/tsconfig.json" }, { "path": "../../../src/plugins/home/tsconfig.json" }, { "path": "../../../src/plugins/kibana_react/tsconfig.json" }, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 3e66830e8fc579..5b521ae5937817 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -22017,7 +22017,6 @@ "xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "スペースの読み込み中にエラーが発生:{message}", "xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "スペースの保存中にエラーが発生:{message}", "xpack.spaces.management.manageSpacePage.loadErrorTitle": "利用可能な機能の読み込みエラー", - "xpack.spaces.management.manageSpacePage.manageDescription": "保存済みオブジェクトをわかりやすいカテゴリー別に整理します。", "xpack.spaces.management.manageSpacePage.nameFormRowLabel": "名前", "xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "説明 (オプション) ", "xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "説明はスペース選択画面に表示されます。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 72f13d2ec4b55b..881420a1fa6c61 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -22371,7 +22371,6 @@ "xpack.spaces.management.manageSpacePage.errorLoadingSpaceTitle": "加载空间时出错:{message}", "xpack.spaces.management.manageSpacePage.errorSavingSpaceTitle": "保存空间时出错:{message}", "xpack.spaces.management.manageSpacePage.loadErrorTitle": "加载可用功能时出错", - "xpack.spaces.management.manageSpacePage.manageDescription": "将已保存对象组织到有意义的类别中。", "xpack.spaces.management.manageSpacePage.nameFormRowLabel": "名称", "xpack.spaces.management.manageSpacePage.spaceDescriptionFormRowLabel": "描述 (可选) ", "xpack.spaces.management.manageSpacePage.spaceDescriptionHelpText": "描述显示在”工作区选择“屏幕上。", From 8d49e27002f1fd4016c4ac7a26231d02bded8ea0 Mon Sep 17 00:00:00 2001 From: Constance Date: Tue, 29 Jun 2021 11:41:25 -0700 Subject: [PATCH 115/227] [App Search] Update delete copy to indicate immediate deletion (#103700) * Update delete copy to immediate deletion - David recently changed our dashboard action to invoke an index refresh, which means it should be a synchronous action now * Run node scripts/i18n_check --fix --- .../components/documents/document_detail_logic.test.ts | 4 +--- .../components/documents/document_detail_logic.ts | 10 +++------- x-pack/plugins/translations/translations/ja-JP.json | 1 - x-pack/plugins/translations/translations/zh-CN.json | 1 - 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts index 063f9aaa72e435..1608e4fb08aacb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts @@ -101,9 +101,7 @@ describe('DocumentDetailLogic', () => { expect(http.delete).toHaveBeenCalledWith('/api/app_search/engines/engine1/documents/1'); await nextTick(); - expect(flashSuccessToast).toHaveBeenCalledWith('Your document was marked for deletion', { - text: 'It will be deleted momentarily.', - }); + expect(flashSuccessToast).toHaveBeenCalledWith('Your document was deleted'); expect(navigateToUrl).toHaveBeenCalledWith('/engines/engine1/documents'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.ts index c7a68ec0f81316..2bc9155c81c7b0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.ts @@ -79,20 +79,16 @@ export const DocumentDetailLogic = kea({ 'xpack.enterpriseSearch.appSearch.documentDetail.confirmDelete', { defaultMessage: 'Are you sure you want to delete this document?' } ); - const DELETE_SUCCESS_TITLE = i18n.translate( + const DELETE_SUCCESS = i18n.translate( 'xpack.enterpriseSearch.appSearch.documentDetail.deleteSuccess', - { defaultMessage: 'Your document was marked for deletion' } - ); - const DELETE_SUCCESS_TEXT = i18n.translate( - 'xpack.enterpriseSearch.appSearch.documentDetail.deleteSuccessDescription', - { defaultMessage: 'It will be deleted momentarily.' } + { defaultMessage: 'Your document was deleted' } ); if (window.confirm(CONFIRM_DELETE)) { try { const { http } = HttpLogic.values; await http.delete(`/api/app_search/engines/${engineName}/documents/${documentId}`); - flashSuccessToast(DELETE_SUCCESS_TITLE, { text: DELETE_SUCCESS_TEXT }); + flashSuccessToast(DELETE_SUCCESS); navigateToUrl(generateEnginePath(ENGINE_DOCUMENTS_PATH)); } catch (e) { flashAPIErrors(e); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5b521ae5937817..c9957fa958b411 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7510,7 +7510,6 @@ "xpack.enterpriseSearch.appSearch.documentCreation.warningsTitle": "警告!", "xpack.enterpriseSearch.appSearch.documentDetail.confirmDelete": "このドキュメントを削除しますか?", "xpack.enterpriseSearch.appSearch.documentDetail.deleteSuccess": "正常にドキュメントが削除に設定されました。", - "xpack.enterpriseSearch.appSearch.documentDetail.deleteSuccessDescription": "すぐに削除されます。", "xpack.enterpriseSearch.appSearch.documentDetail.fieldHeader": "フィールド", "xpack.enterpriseSearch.appSearch.documentDetail.title": "ドキュメント:{documentId}", "xpack.enterpriseSearch.appSearch.documentDetail.valueHeader": "値", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 881420a1fa6c61..51fb0f6a389212 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7573,7 +7573,6 @@ "xpack.enterpriseSearch.appSearch.documentCreation.warningsTitle": "警告!", "xpack.enterpriseSearch.appSearch.documentDetail.confirmDelete": "是否确定要删除此文档?", "xpack.enterpriseSearch.appSearch.documentDetail.deleteSuccess": "成功标记要删除的文档。", - "xpack.enterpriseSearch.appSearch.documentDetail.deleteSuccessDescription": "文档将被暂时删除。", "xpack.enterpriseSearch.appSearch.documentDetail.fieldHeader": "字段", "xpack.enterpriseSearch.appSearch.documentDetail.title": "文档:{documentId}", "xpack.enterpriseSearch.appSearch.documentDetail.valueHeader": "值", From 5da5ade831da687fc900cdb3f182f3bb5697f4d2 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Tue, 29 Jun 2021 13:52:12 -0500 Subject: [PATCH 116/227] [Fleet] Freeze unenroll_timeout field for managed policies (#103710) --- .../fleet/sections/agent_policy/components/agent_policy_form.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx index 633f8a2c57409e..e9094be5344525 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_form.tsx @@ -314,6 +314,7 @@ export const AgentPolicyForm: React.FunctionComponent = ({ updateAgentPolicy({ unenroll_timeout: Number(e.target.value) })} From 0f4a48ec22573d552e32efcd611581c8aff123d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Tue, 29 Jun 2021 15:14:00 -0400 Subject: [PATCH 117/227] [APM][Fleet] getting token and url from vars (#103675) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/apm/server/routes/fleet.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/apm/server/routes/fleet.ts b/x-pack/plugins/apm/server/routes/fleet.ts index 7d2080c894ec6a..6208b42e844fa5 100644 --- a/x-pack/plugins/apm/server/routes/fleet.ts +++ b/x-pack/plugins/apm/server/routes/fleet.ts @@ -77,13 +77,12 @@ const fleetAgentsRoute = createApmServerRoute({ cloudStandaloneSetup, fleetAgents: fleetAgents.map((agent) => { const packagePolicy = policiesGroupedById[agent.id]; - const apmServerCompiledInputs = - packagePolicy.inputs[0].compiled_input['apm-server']; + const packagePolicyVars = packagePolicy.inputs[0]?.vars; return { id: agent.id, name: agent.name, - apmServerUrl: apmServerCompiledInputs?.url, - secretToken: apmServerCompiledInputs?.secret_token, + apmServerUrl: packagePolicyVars?.url?.value, + secretToken: packagePolicyVars?.secret_token?.value, }; }), }; From 7405b93f18a118cfbcbd490e6db77b1fd7ce9dc5 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Tue, 29 Jun 2021 21:17:56 +0200 Subject: [PATCH 118/227] [ML] APM Latency Correlations (#99905) * [ML] Async Search Service. * [ML] Log Log Area Charts Grid. Scatterplot with streaming data. * [ML] Remove scatterplot streaming demo. * [ML] Improved histogram bins for log scale. * [ML] Move client side code from Ml to APM plugin. * [ML] Adds correlation table. * [ML] Layout tweaks. * [ML] Move server side code from ML to APM. * [ML] Remove console.logs. * [ML] Fix types. * [ML] Chart area line type fix. Slowness %. * [ML] Comment unused vars. * Fix missing pluginsStart data in context * Add KS test value and rename table columns * Update percentiles to be correct * Make columns optional * Update fractionals/expectations to match with backend logic * Update so progress is 100% when all is completed * Make pre-processing steps smaller part of overall progress(to show charts earlier) * Add no correlations found message * Fix progress logic * Fix incorrect threshold, types * Add back APM filtering functionality to match with other table * Improve histogram equality check with random sampling * Show overall latency distribution right away * Rename demo tab to latencyCorrelationsTab * Update percentiles query to use hdr * [ML] Fix issue where apm-* might have multiple indices with different mappings where keyword is not the only type - Fix to check for keyword mapping more thoroughly - Add try catch if one of the es search fail, don't quit the entire fetch * Remove commented code * Remove kstest column, round correlation to 2 sigfig dec * Remove old latency tab, replace with ml latency correlations tab as first/default one * Set axis to start at 0 because agg may results in weird * Remove commented code for grouping duplicates * Update msg to mean significant correlations * Add i18n * Change correlations flyout back to medium size * Add name of service or transaction for clarity * Share i18n * Consolidate roundToDecimalPlace usage * Remove redundant isDuplicate * Create MAX_CORRELATIONS_TO_SHOW * Update mlCorrelationcolumns * Fix i18n quotations * Update query to include filter * Revert "Update query to include filter" This reverts commit 9a37eec0 * Rename MlCorrelations to MlLatencyCorrelations for clarity * Add pagination * Update include/exclude logic for field candidates and add ip field support * Add transactionName filter suport * Reorganize math utils * Group duplicates together * Fix typescript, better hasPrefixToInclude support check, * Remove Finished toast * Add title to y axis * Reduce number of tick labels to show * Highlight table row that is being used for graph * Add from to follow MDN guideline * Add APM style prefix * Fix i18n * [ML] Fix logic for tick format to only show power of 10 * Replace roundToDecimalPlace with asPreciseDecimal * Switch to lodash range * Clean up get_query_with_params * Prioritize candidates using field_terms * Update percentiles result type to be array instead of objects * Use observability's rangeQuery instead * Change arg format of query * Revert candidate_terms logic * Consolidate fractions, expectations, and ranges calc * Add tooltip for Correlation * Change terms size to 20 * Move env/service/transaction sticky header to top level, remove link * Add support for http.response.status_code * Replace histogram circular markers with bars * Delete unused roundToDecimalPlace * Add fractions calculation * Make notes of fractions and fix bucket correlation * Remove any, commented code, consolidate cancelFetch * Use es6 max * Align tooltip at the top * Get rid of getCoreServices, param docs, rename type, remove rangeQuery * Adjust range * Show all values without grouping duplicates * Fix pagination * Make flyout larger Co-authored-by: Quynh Nguyen Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../search_strategies/correlations/types.ts | 51 +++ .../apm/common/utils/formatters/formatters.ts | 8 + .../plugins/apm/public/application/index.tsx | 1 + .../app/correlations/correlations_chart.tsx | 221 ++++++++++ .../app/correlations/correlations_table.tsx | 62 ++- .../components/app/correlations/index.tsx | 155 ++++--- .../correlations/ml_latency_correlations.tsx | 382 ++++++++++++++++++ .../app/correlations/use_correlations.ts | 120 ++++++ .../correlations/async_search_service.ts | 225 +++++++++++ .../correlations/constants.ts | 78 ++++ .../correlations/get_query_with_params.ts | 89 ++++ .../search_strategies/correlations/index.ts | 8 + .../correlations/query_correlation.ts | 139 +++++++ .../correlations/query_field_candidates.ts | 105 +++++ .../correlations/query_field_value_pairs.ts | 89 ++++ .../correlations/query_fractions.ts | 64 +++ .../correlations/query_histogram.ts | 70 ++++ .../correlations/query_histogram_interval.ts | 52 +++ .../query_histogram_rangesteps.ts | 65 +++ .../correlations/query_percentiles.ts | 84 ++++ .../correlations/query_ranges.ts | 96 +++++ .../correlations/search_strategy.ts | 94 +++++ .../correlations/utils/aggregation_utils.ts | 53 +++ .../correlations/utils/index.ts | 9 + .../correlations/utils/math_utils.ts | 70 ++++ x-pack/plugins/apm/server/plugin.ts | 8 + x-pack/plugins/ml/server/types.ts | 7 + 27 files changed, 2353 insertions(+), 52 deletions(-) create mode 100644 x-pack/plugins/apm/common/search_strategies/correlations/types.ts create mode 100644 x-pack/plugins/apm/public/components/app/correlations/correlations_chart.tsx create mode 100644 x-pack/plugins/apm/public/components/app/correlations/ml_latency_correlations.tsx create mode 100644 x-pack/plugins/apm/public/components/app/correlations/use_correlations.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/async_search_service.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/constants.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/get_query_with_params.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/index.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_correlation.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_candidates.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_value_pairs.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_fractions.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_interval.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_rangesteps.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_percentiles.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/query_ranges.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/search_strategy.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/aggregation_utils.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/index.ts create mode 100644 x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/math_utils.ts diff --git a/x-pack/plugins/apm/common/search_strategies/correlations/types.ts b/x-pack/plugins/apm/common/search_strategies/correlations/types.ts new file mode 100644 index 00000000000000..1698708aeb77ec --- /dev/null +++ b/x-pack/plugins/apm/common/search_strategies/correlations/types.ts @@ -0,0 +1,51 @@ +/* + * 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. + */ + +export interface HistogramItem { + key: number; + doc_count: number; +} + +export interface ResponseHitSource { + [s: string]: unknown; +} + +export interface ResponseHit { + _source: ResponseHitSource; +} + +export interface SearchServiceParams { + index: string; + environment?: string; + kuery?: string; + serviceName?: string; + transactionName?: string; + transactionType?: string; + start?: string; + end?: string; + percentileThreshold?: number; + percentileThresholdValue?: number; +} + +export interface SearchServiceValue { + histogram: HistogramItem[]; + value: string; + field: string; + correlation: number; + ksTest: number; + duplicatedFields?: string[]; +} + +export interface AsyncSearchProviderProgress { + started: number; + loadedHistogramStepsize: number; + loadedOverallHistogram: number; + loadedFieldCanditates: number; + loadedFieldValuePairs: number; + loadedHistograms: number; + getOverallProgress: () => number; +} diff --git a/x-pack/plugins/apm/common/utils/formatters/formatters.ts b/x-pack/plugins/apm/common/utils/formatters/formatters.ts index 8fb593f8bab26b..4da73a6d2c29a7 100644 --- a/x-pack/plugins/apm/common/utils/formatters/formatters.ts +++ b/x-pack/plugins/apm/common/utils/formatters/formatters.ts @@ -18,6 +18,14 @@ export function asDecimal(value?: number | null) { return numeral(value).format('0,0.0'); } +export function asPreciseDecimal(value?: number | null, dp: number = 3) { + if (!isFiniteNumber(value)) { + return NOT_AVAILABLE_LABEL; + } + + return numeral(value).format(`0,0.${'0'.repeat(dp)}`); +} + export function asInteger(value?: number | null) { if (!isFiniteNumber(value)) { return NOT_AVAILABLE_LABEL; diff --git a/x-pack/plugins/apm/public/application/index.tsx b/x-pack/plugins/apm/public/application/index.tsx index 6924a8b9161b22..a6b0dc61a32607 100644 --- a/x-pack/plugins/apm/public/application/index.tsx +++ b/x-pack/plugins/apm/public/application/index.tsx @@ -47,6 +47,7 @@ export const renderApp = ({ config, core: coreStart, plugins: pluginsSetup, + data: pluginsStart.data, observability: pluginsStart.observability, observabilityRuleTypeRegistry, }; diff --git a/x-pack/plugins/apm/public/components/app/correlations/correlations_chart.tsx b/x-pack/plugins/apm/public/components/app/correlations/correlations_chart.tsx new file mode 100644 index 00000000000000..f4e39c37e289e7 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/correlations/correlations_chart.tsx @@ -0,0 +1,221 @@ +/* + * 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 { + AnnotationDomainType, + Chart, + CurveType, + Settings, + Axis, + ScaleType, + Position, + AreaSeries, + RecursivePartial, + AxisStyle, + PartialTheme, + LineAnnotation, + LineAnnotationDatum, +} from '@elastic/charts'; + +import euiVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { EuiSpacer } from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { getDurationFormatter } from '../../../../common/utils/formatters'; + +import { useTheme } from '../../../hooks/use_theme'; +import { HistogramItem } from '../../../../common/search_strategies/correlations/types'; + +const { euiColorMediumShade } = euiVars; +const axisColor = euiColorMediumShade; + +const axes: RecursivePartial = { + axisLine: { + stroke: axisColor, + }, + tickLabel: { + fontSize: 10, + fill: axisColor, + padding: 0, + }, + tickLine: { + stroke: axisColor, + size: 5, + }, + gridLine: { + horizontal: { + dash: [1, 2], + }, + vertical: { + strokeWidth: 1, + }, + }, +}; +const chartTheme: PartialTheme = { + axes, + legend: { + spacingBuffer: 100, + }, + areaSeriesStyle: { + line: { + visible: false, + }, + }, +}; + +interface CorrelationsChartProps { + field?: string; + value?: string; + histogram?: HistogramItem[]; + markerValue: number; + markerPercentile: number; + overallHistogram: HistogramItem[]; +} + +const annotationsStyle = { + line: { + strokeWidth: 1, + stroke: 'gray', + opacity: 0.8, + }, + details: { + fontSize: 8, + fontFamily: 'Arial', + fontStyle: 'normal', + fill: 'gray', + padding: 0, + }, +}; + +const CHART_PLACEHOLDER_VALUE = 0.0001; + +// Elastic charts will show any lone bin (i.e. a populated bin followed by empty bin) +// as a circular marker instead of a bar +// This provides a workaround by making the next bin not empty +export const replaceHistogramDotsWithBars = ( + originalHistogram: HistogramItem[] | undefined +) => { + if (originalHistogram === undefined) return; + const histogram = [...originalHistogram]; + { + for (let i = 0; i < histogram.length - 1; i++) { + if ( + histogram[i].doc_count > 0 && + histogram[i].doc_count !== CHART_PLACEHOLDER_VALUE && + histogram[i + 1].doc_count === 0 + ) { + histogram[i + 1].doc_count = CHART_PLACEHOLDER_VALUE; + } + } + return histogram; + } +}; + +export function CorrelationsChart({ + field, + value, + histogram: originalHistogram, + markerValue, + markerPercentile, + overallHistogram, +}: CorrelationsChartProps) { + const euiTheme = useTheme(); + + if (!Array.isArray(overallHistogram)) return
    ; + const annotationsDataValues: LineAnnotationDatum[] = [ + { dataValue: markerValue, details: `${markerPercentile}th percentile` }, + ]; + + const xMax = Math.max(...overallHistogram.map((d) => d.key)) ?? 0; + + const durationFormatter = getDurationFormatter(xMax); + + const histogram = replaceHistogramDotsWithBars(originalHistogram); + + return ( +
    + + + + durationFormatter(d).formatted} + /> + + d === 0 || Number.isInteger(Math.log10(d)) ? d : '' + } + /> + + {Array.isArray(histogram) && + field !== undefined && + value !== undefined && ( + + )} + + +
    + ); +} diff --git a/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx b/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx index 75f3cca05c5c53..62d566963699de 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { debounce } from 'lodash'; import { EuiIcon, @@ -22,12 +22,14 @@ import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { createHref, push } from '../../shared/Links/url_helpers'; import { ImpactBar } from '../../shared/ImpactBar'; import { useUiTracker } from '../../../../../observability/public'; +import { useTheme } from '../../../hooks/use_theme'; +const PAGINATION_SIZE_OPTIONS = [5, 10, 20, 50]; type CorrelationsApiResponse = | APIReturnType<'GET /api/apm/correlations/errors/failed_transactions'> | APIReturnType<'GET /api/apm/correlations/latency/slow_transactions'>; -type SignificantTerm = CorrelationsApiResponse['significantTerms'][0]; +export type SignificantTerm = CorrelationsApiResponse['significantTerms'][0]; export type SelectedSignificantTerm = Pick< SignificantTerm, @@ -37,9 +39,11 @@ export type SelectedSignificantTerm = Pick< interface Props { significantTerms?: T[]; status: FETCH_STATUS; - percentageColumnName: string; + percentageColumnName?: string; setSelectedSignificantTerm: (term: SelectedSignificantTerm | null) => void; + selectedTerm?: { fieldName: string; fieldValue: string }; onFilter: () => void; + columns?: Array>; } export function CorrelationsTable({ @@ -48,7 +52,10 @@ export function CorrelationsTable({ percentageColumnName, setSelectedSignificantTerm, onFilter, + columns, + selectedTerm, }: Props) { + const euiTheme = useTheme(); const trackApmEvent = useUiTracker({ app: 'apm' }); const trackSelectSignificantTerm = useCallback( () => @@ -59,7 +66,33 @@ export function CorrelationsTable({ [trackApmEvent] ); const history = useHistory(); - const columns: Array> = [ + + const [pageIndex, setPageIndex] = useState(0); + const [pageSize, setPageSize] = useState(10); + + const { pagination, pageOfItems } = useMemo(() => { + const pageStart = pageIndex * pageSize; + + const itemCount = significantTerms?.length ?? 0; + return { + pageOfItems: significantTerms?.slice(pageStart, pageStart + pageSize), + pagination: { + pageIndex, + pageSize, + totalItemCount: itemCount, + pageSizeOptions: PAGINATION_SIZE_OPTIONS, + }, + }; + }, [pageIndex, pageSize, significantTerms]); + + const onTableChange = useCallback(({ page }) => { + const { index, size } = page; + + setPageIndex(index); + setPageSize(size); + }, []); + + const tableColumns: Array> = columns ?? [ { width: '116px', field: 'impact', @@ -73,7 +106,12 @@ export function CorrelationsTable({ }, { field: 'percentage', - name: percentageColumnName, + name: + percentageColumnName ?? + i18n.translate( + 'xpack.apm.correlations.correlationsTable.percentageLabel', + { defaultMessage: 'Percentage' } + ), render: (_: any, term: T) => { return ( ({ return ( { return { onMouseEnter: () => { @@ -203,8 +241,18 @@ export function CorrelationsTable({ trackSelectSignificantTerm(); }, onMouseLeave: () => setSelectedSignificantTerm(null), + style: + selectedTerm && + selectedTerm.fieldValue === term.fieldValue && + selectedTerm.fieldName === term.fieldName + ? { + backgroundColor: euiTheme.eui.euiColorLightestShade, + } + : null, }; }} + pagination={pagination} + onChange={onTableChange} /> ); } diff --git a/x-pack/plugins/apm/public/components/app/correlations/index.tsx b/x-pack/plugins/apm/public/components/app/correlations/index.tsx index 62c547aa69e0d5..7b6328916d445e 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/index.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState } from 'react'; +import React, { useMemo, useState } from 'react'; import { EuiButtonEmpty, EuiFlyout, @@ -23,8 +23,8 @@ import { EuiBetaBadge, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useHistory } from 'react-router-dom'; -import { LatencyCorrelations } from './latency_correlations'; +import { useHistory, useParams } from 'react-router-dom'; +import { MlLatencyCorrelations } from './ml_latency_correlations'; import { ErrorCorrelations } from './error_correlations'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { createHref } from '../../shared/Links/url_helpers'; @@ -36,14 +36,20 @@ import { isActivePlatinumLicense } from '../../../../common/license_check'; import { useLicenseContext } from '../../../context/license/use_license_context'; import { LicensePrompt } from '../../shared/license_prompt'; import { IUrlParams } from '../../../context/url_params_context/types'; +import { + IStickyProperty, + StickyProperties, +} from '../../shared/StickyProperties'; +import { + getEnvironmentLabel, + getNextEnvironmentUrlParam, +} from '../../../../common/environment_filter_values'; +import { + SERVICE_ENVIRONMENT, + SERVICE_NAME, + TRANSACTION_NAME, +} from '../../../../common/elasticsearch_fieldnames'; -const latencyTab = { - key: 'latency', - label: i18n.translate('xpack.apm.correlations.tabs.latencyLabel', { - defaultMessage: 'Latency', - }), - component: LatencyCorrelations, -}; const errorRateTab = { key: 'errorRate', label: i18n.translate('xpack.apm.correlations.tabs.errorRateLabel', { @@ -51,17 +57,26 @@ const errorRateTab = { }), component: ErrorCorrelations, }; -const tabs = [latencyTab, errorRateTab]; +const latencyCorrelationsTab = { + key: 'latencyCorrelations', + label: i18n.translate('xpack.apm.correlations.tabs.latencyLabel', { + defaultMessage: 'Latency', + }), + component: MlLatencyCorrelations, +}; +const tabs = [latencyCorrelationsTab, errorRateTab]; export function Correlations() { const license = useLicenseContext(); const hasActivePlatinumLicense = isActivePlatinumLicense(license); const { urlParams } = useUrlParams(); + const { serviceName } = useParams<{ serviceName: string }>(); + const history = useHistory(); const [isFlyoutVisible, setIsFlyoutVisible] = useState(false); - const [currentTab, setCurrentTab] = useState(latencyTab.key); + const [currentTab, setCurrentTab] = useState(latencyCorrelationsTab.key); const { component: TabContent } = - tabs.find((tab) => tab.key === currentTab) ?? latencyTab; + tabs.find((tab) => tab.key === currentTab) ?? latencyCorrelationsTab; const metric = { app: 'apm' as const, metric: hasActivePlatinumLicense @@ -72,6 +87,47 @@ export function Correlations() { useTrackMetric(metric); useTrackMetric({ ...metric, delay: 15000 }); + const stickyProperties: IStickyProperty[] = useMemo(() => { + const nextEnvironment = getNextEnvironmentUrlParam({ + requestedEnvironment: serviceName, + currentEnvironmentUrlParam: urlParams.environment, + }); + + const properties: IStickyProperty[] = []; + if (serviceName !== undefined && nextEnvironment !== undefined) { + properties.push({ + label: i18n.translate('xpack.apm.correlations.serviceLabel', { + defaultMessage: 'Service', + }), + fieldName: SERVICE_NAME, + val: serviceName, + width: '20%', + }); + } + if (urlParams.transactionName) { + properties.push({ + label: i18n.translate('xpack.apm.correlations.transactionLabel', { + defaultMessage: 'Transaction', + }), + fieldName: TRANSACTION_NAME, + val: urlParams.transactionName, + width: '20%', + }); + } + if (urlParams.environment) { + properties.push({ + label: i18n.translate('xpack.apm.correlations.environmentLabel', { + defaultMessage: 'Environment', + }), + fieldName: SERVICE_ENVIRONMENT, + val: getEnvironmentLabel(urlParams.environment), + width: '20%', + }); + } + + return properties; + }, [serviceName, urlParams.environment, urlParams.transactionName]); + return ( <> setIsFlyoutVisible(false)} > @@ -112,25 +168,37 @@ export function Correlations() { {hasActivePlatinumLicense && ( - - {tabs.map(({ key, label }) => ( - { - setCurrentTab(key); - }} - > - {label} - - ))} - + <> + + + + {urlParams.kuery ? ( + <> + + + + ) : ( + + )} + + {tabs.map(({ key, label }) => ( + { + setCurrentTab(key); + }} + > + {label} + + ))} + + )} {hasActivePlatinumLicense ? ( <> - setIsFlyoutVisible(false)} /> ) : ( @@ -163,24 +231,21 @@ function Filters({ } return ( - <> - - - {i18n.translate('xpack.apm.correlations.filteringByLabel', { - defaultMessage: 'Filtering by', + + + {i18n.translate('xpack.apm.correlations.filteringByLabel', { + defaultMessage: 'Filtering by', + })} + + {urlParams.kuery} + + + {i18n.translate('xpack.apm.correlations.clearFiltersLabel', { + defaultMessage: 'Clear', })} - - {urlParams.kuery} - - - {i18n.translate('xpack.apm.correlations.clearFiltersLabel', { - defaultMessage: 'Clear', - })} - - - - - + + + ); } diff --git a/x-pack/plugins/apm/public/components/app/correlations/ml_latency_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/ml_latency_correlations.tsx new file mode 100644 index 00000000000000..f9536353747ee9 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/correlations/ml_latency_correlations.tsx @@ -0,0 +1,382 @@ +/* + * 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, { useEffect, useMemo, useState } from 'react'; +import { useHistory, useParams } from 'react-router-dom'; +import { + EuiIcon, + EuiBasicTableColumn, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiProgress, + EuiSpacer, + EuiText, + EuiTitle, + EuiToolTip, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { useUrlParams } from '../../../context/url_params_context/use_url_params'; +import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; +import { FETCH_STATUS } from '../../../hooks/use_fetcher'; +import { + CorrelationsChart, + replaceHistogramDotsWithBars, +} from './correlations_chart'; +import { + CorrelationsTable, + SelectedSignificantTerm, +} from './correlations_table'; +import { useCorrelations } from './use_correlations'; +import { push } from '../../shared/Links/url_helpers'; +import { useUiTracker } from '../../../../../observability/public'; +import { asPreciseDecimal } from '../../../../common/utils/formatters'; + +const DEFAULT_PERCENTILE_THRESHOLD = 95; +const isErrorMessage = (arg: unknown): arg is Error => { + return arg instanceof Error; +}; + +interface Props { + onClose: () => void; +} + +interface MlCorrelationsTerms { + correlation: number; + ksTest: number; + fieldName: string; + fieldValue: string; + duplicatedFields?: string[]; +} + +export function MlLatencyCorrelations({ onClose }: Props) { + const { + core: { notifications }, + } = useApmPluginContext(); + + const { serviceName } = useParams<{ serviceName: string }>(); + const { urlParams } = useUrlParams(); + + const fetchOptions = useMemo( + () => ({ + ...{ + serviceName, + ...urlParams, + }, + }), + [serviceName, urlParams] + ); + + const { + error, + histograms, + percentileThresholdValue, + isRunning, + progress, + startFetch, + cancelFetch, + overallHistogram: originalOverallHistogram, + } = useCorrelations({ + index: 'apm-*', + ...{ + ...fetchOptions, + percentileThreshold: DEFAULT_PERCENTILE_THRESHOLD, + }, + }); + + const overallHistogram = useMemo( + () => replaceHistogramDotsWithBars(originalOverallHistogram), + [originalOverallHistogram] + ); + + // start fetching on load + // we want this effect to execute exactly once after the component mounts + useEffect(() => { + startFetch(); + + return () => { + // cancel any running async partial request when unmounting the component + // we want this effect to execute exactly once after the component mounts + cancelFetch(); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (isErrorMessage(error)) { + notifications.toasts.addDanger({ + title: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.errorTitle', + { + defaultMessage: 'An error occurred fetching correlations', + } + ), + text: error.toString(), + }); + } + }, [error, notifications.toasts]); + + const [ + selectedSignificantTerm, + setSelectedSignificantTerm, + ] = useState(null); + + let selectedHistogram = histograms.length > 0 ? histograms[0] : undefined; + + if (histograms.length > 0 && selectedSignificantTerm !== null) { + selectedHistogram = histograms.find( + (h) => + h.field === selectedSignificantTerm.fieldName && + h.value === selectedSignificantTerm.fieldValue + ); + } + const history = useHistory(); + const trackApmEvent = useUiTracker({ app: 'apm' }); + + const mlCorrelationColumns: Array< + EuiBasicTableColumn + > = useMemo( + () => [ + { + width: '116px', + field: 'correlation', + name: ( + + <> + {i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.correlationLabel', + { + defaultMessage: 'Correlation', + } + )} + + + + ), + render: (correlation: number) => { + return
    {asPreciseDecimal(correlation, 2)}
    ; + }, + }, + { + field: 'fieldName', + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldNameLabel', + { defaultMessage: 'Field name' } + ), + }, + { + field: 'fieldValue', + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldValueLabel', + { defaultMessage: 'Field value' } + ), + render: (fieldValue: string) => String(fieldValue).slice(0, 50), + }, + { + width: '100px', + actions: [ + { + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.filterLabel', + { defaultMessage: 'Filter' } + ), + description: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.filterDescription', + { defaultMessage: 'Filter by value' } + ), + icon: 'plusInCircle', + type: 'icon', + onClick: (term: MlCorrelationsTerms) => { + push(history, { + query: { + kuery: `${term.fieldName}:"${encodeURIComponent( + term.fieldValue + )}"`, + }, + }); + onClose(); + trackApmEvent({ metric: 'correlations_term_include_filter' }); + }, + }, + { + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeLabel', + { defaultMessage: 'Exclude' } + ), + description: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeDescription', + { defaultMessage: 'Filter out value' } + ), + icon: 'minusInCircle', + type: 'icon', + onClick: (term: MlCorrelationsTerms) => { + push(history, { + query: { + kuery: `not ${term.fieldName}:"${encodeURIComponent( + term.fieldValue + )}"`, + }, + }); + onClose(); + trackApmEvent({ metric: 'correlations_term_exclude_filter' }); + }, + }, + ], + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.actionsLabel', + { defaultMessage: 'Filter' } + ), + }, + ], + [history, onClose, trackApmEvent] + ); + + const histogramTerms: MlCorrelationsTerms[] = useMemo(() => { + return histograms.map((d) => { + return { + fieldName: d.field, + fieldValue: d.value, + ksTest: d.ksTest, + correlation: d.correlation, + duplicatedFields: d.duplicatedFields, + }; + }); + }, [histograms]); + + return ( + <> + +

    + {i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.description', + { + defaultMessage: + 'What is slowing down my service? Correlations will help discover a slower performance in a particular cohort of your data.', + } + )} +

    +
    + + + + + + {!isRunning && ( + + + + )} + {isRunning && ( + + + + )} + + + + + + + + + + + + + + + + + {overallHistogram !== undefined ? ( + <> + +

    + {i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.chartTitle', + { + defaultMessage: 'Latency distribution for {name}', + values: { + name: + fetchOptions.transactionName ?? fetchOptions.serviceName, + }, + } + )} +

    +
    + + + + + + ) : null} + + {histograms.length > 0 && selectedHistogram !== undefined && ( + + )} + {histograms.length < 1 && progress > 0.99 ? ( + <> + + + + + + ) : null} + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/correlations/use_correlations.ts b/x-pack/plugins/apm/public/components/app/correlations/use_correlations.ts new file mode 100644 index 00000000000000..8c874571d23dba --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/correlations/use_correlations.ts @@ -0,0 +1,120 @@ +/* + * 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 { useRef, useState } from 'react'; +import type { Subscription } from 'rxjs'; +import { + IKibanaSearchRequest, + IKibanaSearchResponse, + isCompleteResponse, + isErrorResponse, +} from '../../../../../../../src/plugins/data/public'; +import type { + HistogramItem, + SearchServiceValue, +} from '../../../../common/search_strategies/correlations/types'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; +import { ApmPluginStartDeps } from '../../../plugin'; + +interface CorrelationsOptions { + index: string; + environment?: string; + kuery?: string; + serviceName?: string; + transactionName?: string; + transactionType?: string; + start?: string; + end?: string; +} + +interface RawResponse { + percentileThresholdValue?: number; + took: number; + values: SearchServiceValue[]; + overallHistogram: HistogramItem[]; +} + +export const useCorrelations = (params: CorrelationsOptions) => { + const { + services: { data }, + } = useKibana(); + + const [error, setError] = useState(); + const [isComplete, setIsComplete] = useState(false); + const [isRunning, setIsRunning] = useState(false); + const [loaded, setLoaded] = useState(0); + const [rawResponse, setRawResponse] = useState(); + const [timeTook, setTimeTook] = useState(); + const [total, setTotal] = useState(100); + const abortCtrl = useRef(new AbortController()); + const searchSubscription$ = useRef(); + + function setResponse(response: IKibanaSearchResponse) { + // @TODO: optimize rawResponse.overallHistogram if histogram is the same + setIsRunning(response.isRunning || false); + setRawResponse(response.rawResponse); + setLoaded(response.loaded!); + setTotal(response.total!); + setTimeTook(response.rawResponse.took); + } + + const startFetch = () => { + setError(undefined); + setIsComplete(false); + searchSubscription$.current?.unsubscribe(); + abortCtrl.current.abort(); + abortCtrl.current = new AbortController(); + + const req = { params }; + + // Submit the search request using the `data.search` service. + searchSubscription$.current = data.search + .search>(req, { + strategy: 'apmCorrelationsSearchStrategy', + abortSignal: abortCtrl.current.signal, + }) + .subscribe({ + next: (res: IKibanaSearchResponse) => { + setResponse(res); + if (isCompleteResponse(res)) { + searchSubscription$.current?.unsubscribe(); + setIsRunning(false); + setIsComplete(true); + } else if (isErrorResponse(res)) { + searchSubscription$.current?.unsubscribe(); + setError((res as unknown) as Error); + setIsRunning(false); + } + }, + error: (e: Error) => { + setError(e); + setIsRunning(false); + }, + }); + }; + + const cancelFetch = () => { + searchSubscription$.current?.unsubscribe(); + searchSubscription$.current = undefined; + abortCtrl.current.abort(); + setIsRunning(false); + }; + + return { + error, + histograms: rawResponse?.values ?? [], + percentileThresholdValue: + rawResponse?.percentileThresholdValue ?? undefined, + overallHistogram: rawResponse?.overallHistogram, + isComplete, + isRunning, + progress: loaded / total, + timeTook, + startFetch, + cancelFetch, + }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/async_search_service.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/async_search_service.ts new file mode 100644 index 00000000000000..5820fd952c4491 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/async_search_service.ts @@ -0,0 +1,225 @@ +/* + * 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 { shuffle, range } from 'lodash'; +import type { ElasticsearchClient } from 'src/core/server'; +import { fetchTransactionDurationFieldCandidates } from './query_field_candidates'; +import { fetchTransactionDurationFieldValuePairs } from './query_field_value_pairs'; +import { fetchTransactionDurationPecentiles } from './query_percentiles'; +import { fetchTransactionDurationCorrelation } from './query_correlation'; +import { fetchTransactionDurationHistogramRangesteps } from './query_histogram_rangesteps'; +import { fetchTransactionDurationRanges, HistogramItem } from './query_ranges'; +import type { + AsyncSearchProviderProgress, + SearchServiceParams, + SearchServiceValue, +} from '../../../../common/search_strategies/correlations/types'; +import { computeExpectationsAndRanges } from './utils/aggregation_utils'; +import { fetchTransactionDurationFractions } from './query_fractions'; + +const CORRELATION_THRESHOLD = 0.3; +const KS_TEST_THRESHOLD = 0.1; + +export const asyncSearchServiceProvider = ( + esClient: ElasticsearchClient, + params: SearchServiceParams +) => { + let isCancelled = false; + let isRunning = true; + let error: Error; + + const progress: AsyncSearchProviderProgress = { + started: Date.now(), + loadedHistogramStepsize: 0, + loadedOverallHistogram: 0, + loadedFieldCanditates: 0, + loadedFieldValuePairs: 0, + loadedHistograms: 0, + getOverallProgress: () => + progress.loadedHistogramStepsize * 0.025 + + progress.loadedOverallHistogram * 0.025 + + progress.loadedFieldCanditates * 0.025 + + progress.loadedFieldValuePairs * 0.025 + + progress.loadedHistograms * 0.9, + }; + + const values: SearchServiceValue[] = []; + let overallHistogram: HistogramItem[] | undefined; + + let percentileThresholdValue: number; + + const cancel = () => { + isCancelled = true; + }; + + const fetchCorrelations = async () => { + try { + // 95th percentile to be displayed as a marker in the log log chart + const percentileThreshold = await fetchTransactionDurationPecentiles( + esClient, + params, + params.percentileThreshold ? [params.percentileThreshold] : undefined + ); + percentileThresholdValue = + percentileThreshold[`${params.percentileThreshold}.0`]; + + const histogramRangeSteps = await fetchTransactionDurationHistogramRangesteps( + esClient, + params + ); + progress.loadedHistogramStepsize = 1; + + if (isCancelled) { + isRunning = false; + return; + } + + const overallLogHistogramChartData = await fetchTransactionDurationRanges( + esClient, + params, + histogramRangeSteps + ); + progress.loadedOverallHistogram = 1; + overallHistogram = overallLogHistogramChartData; + + if (isCancelled) { + isRunning = false; + return; + } + + // Create an array of ranges [2, 4, 6, ..., 98] + const percents = Array.from(range(2, 100, 2)); + const percentilesRecords = await fetchTransactionDurationPecentiles( + esClient, + params, + percents + ); + const percentiles = Object.values(percentilesRecords); + + if (isCancelled) { + isRunning = false; + return; + } + + const { fieldCandidates } = await fetchTransactionDurationFieldCandidates( + esClient, + params + ); + + progress.loadedFieldCanditates = 1; + + const fieldValuePairs = await fetchTransactionDurationFieldValuePairs( + esClient, + params, + fieldCandidates, + progress + ); + + if (isCancelled) { + isRunning = false; + return; + } + + const { expectations, ranges } = computeExpectationsAndRanges( + percentiles + ); + + const { + fractions, + totalDocCount, + } = await fetchTransactionDurationFractions(esClient, params, ranges); + + async function* fetchTransactionDurationHistograms() { + for (const item of shuffle(fieldValuePairs)) { + if (item === undefined || isCancelled) { + isRunning = false; + return; + } + + // If one of the fields have an error + // We don't want to stop the whole process + try { + const { + correlation, + ksTest, + } = await fetchTransactionDurationCorrelation( + esClient, + params, + expectations, + ranges, + fractions, + totalDocCount, + item.field, + item.value + ); + + if (isCancelled) { + isRunning = false; + return; + } + + if ( + correlation !== null && + correlation > CORRELATION_THRESHOLD && + ksTest !== null && + ksTest < KS_TEST_THRESHOLD + ) { + const logHistogram = await fetchTransactionDurationRanges( + esClient, + params, + histogramRangeSteps, + item.field, + item.value + ); + yield { + ...item, + correlation, + ksTest, + histogram: logHistogram, + }; + } else { + yield undefined; + } + } catch (e) { + error = e; + } + } + } + + let loadedHistograms = 0; + for await (const item of fetchTransactionDurationHistograms()) { + if (item !== undefined) { + values.push(item); + } + loadedHistograms++; + progress.loadedHistograms = loadedHistograms / fieldValuePairs.length; + } + + isRunning = false; + } catch (e) { + error = e; + } + }; + + fetchCorrelations(); + + return () => { + const sortedValues = values.sort((a, b) => b.correlation - a.correlation); + + return { + error, + isRunning, + loaded: Math.round(progress.getOverallProgress() * 100), + overallHistogram, + started: progress.started, + total: 100, + values: sortedValues, + percentileThresholdValue, + cancel, + }; + }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/constants.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/constants.ts new file mode 100644 index 00000000000000..5420479bfffb7f --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/constants.ts @@ -0,0 +1,78 @@ +/* + * 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. + */ + +/** + * Fields to exclude as potential field candidates + */ +export const FIELDS_TO_EXCLUDE_AS_CANDIDATE = new Set([ + // Exclude for all usage Contexts + 'parent.id', + 'trace.id', + 'transaction.id', + '@timestamp', + 'timestamp.us', + 'agent.ephemeral_id', + 'ecs.version', + 'event.ingested', + 'http.response.finished', + 'parent.id', + 'trace.id', + 'transaction.duration.us', + 'transaction.id', + 'process.pid', + 'process.ppid', + 'processor.event', + 'processor.name', + 'transaction.sampled', + 'transaction.span_count.dropped', + // Exclude for correlation on a Single Service + 'agent.name', + 'http.request.method', + 'service.framework.name', + 'service.language.name', + 'service.name', + 'service.runtime.name', + 'transaction.name', + 'transaction.type', +]); + +export const FIELD_PREFIX_TO_EXCLUDE_AS_CANDIDATE = ['observer.']; + +/** + * Fields to include/prioritize as potential field candidates + */ +export const FIELDS_TO_ADD_AS_CANDIDATE = new Set([ + 'service.version', + 'service.node.name', + 'service.framework.version', + 'service.language.version', + 'service.runtime.version', + 'kubernetes.pod.name', + 'kubernetes.pod.uid', + 'container.id', + 'source.ip', + 'client.ip', + 'host.ip', + 'service.environment', + 'process.args', + 'http.response.status_code', +]); +export const FIELD_PREFIX_TO_ADD_AS_CANDIDATE = [ + 'cloud.', + 'labels.', + 'user_agent.', +]; + +/** + * Other constants + */ +export const POPULATED_DOC_COUNT_SAMPLE_SIZE = 1000; + +export const PERCENTILES_STEP = 2; +export const TERMS_SIZE = 20; +export const SIGNIFICANT_FRACTION = 3; +export const SIGNIFICANT_VALUE_DIGITS = 3; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/get_query_with_params.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/get_query_with_params.ts new file mode 100644 index 00000000000000..e7cf8173b5bac6 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/get_query_with_params.ts @@ -0,0 +1,89 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; +import { + PROCESSOR_EVENT, + SERVICE_NAME, + TRANSACTION_DURATION, + TRANSACTION_NAME, +} from '../../../../common/elasticsearch_fieldnames'; +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; +import { environmentQuery as getEnvironmentQuery } from '../../../utils/queries'; +import { ProcessorEvent } from '../../../../common/processor_event'; + +const getPercentileThresholdValueQuery = ( + percentileThresholdValue: number | undefined +): estypes.QueryDslQueryContainer[] => { + return percentileThresholdValue + ? [ + { + range: { + [TRANSACTION_DURATION]: { + gte: percentileThresholdValue, + }, + }, + }, + ] + : []; +}; + +export const getTermsQuery = ( + fieldName: string | undefined, + fieldValue: string | undefined +) => { + return fieldName && fieldValue ? [{ term: { [fieldName]: fieldValue } }] : []; +}; + +const getRangeQuery = ( + start?: string, + end?: string +): estypes.QueryDslQueryContainer[] => { + return [ + { + range: { + '@timestamp': { + ...(start !== undefined ? { gte: start } : {}), + ...(end !== undefined ? { lte: end } : {}), + }, + }, + }, + ]; +}; + +interface QueryParams { + params: SearchServiceParams; + fieldName?: string; + fieldValue?: string; +} +export const getQueryWithParams = ({ + params, + fieldName, + fieldValue, +}: QueryParams) => { + const { + environment, + serviceName, + start, + end, + percentileThresholdValue, + transactionName, + } = params; + return { + bool: { + filter: [ + ...getTermsQuery(PROCESSOR_EVENT, ProcessorEvent.transaction), + ...getTermsQuery(SERVICE_NAME, serviceName), + ...getTermsQuery(TRANSACTION_NAME, transactionName), + ...getTermsQuery(fieldName, fieldValue), + ...getRangeQuery(start, end), + ...getEnvironmentQuery(environment), + ...getPercentileThresholdValueQuery(percentileThresholdValue), + ] as estypes.QueryDslQueryContainer[], + }, + }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/index.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/index.ts new file mode 100644 index 00000000000000..5ba7b4d7c957ac --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { apmCorrelationsSearchStrategyProvider } from './search_strategy'; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_correlation.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_correlation.ts new file mode 100644 index 00000000000000..9894ac54eccb66 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_correlation.ts @@ -0,0 +1,139 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; + +export interface HistogramItem { + key: number; + doc_count: number; +} + +interface ResponseHitSource { + [s: string]: unknown; +} +interface ResponseHit { + _source: ResponseHitSource; +} + +interface BucketCorrelation { + buckets_path: string; + function: { + count_correlation: { + indicator: { + fractions: number[]; + expectations: number[]; + doc_count: number; + }; + }; + }; +} + +export const getTransactionDurationCorrelationRequest = ( + params: SearchServiceParams, + expectations: number[], + ranges: estypes.AggregationsAggregationRange[], + fractions: number[], + totalDocCount: number, + fieldName?: string, + fieldValue?: string +): estypes.SearchRequest => { + const query = getQueryWithParams({ params, fieldName, fieldValue }); + + const bucketCorrelation: BucketCorrelation = { + buckets_path: 'latency_ranges>_count', + function: { + count_correlation: { + indicator: { + fractions, + expectations, + doc_count: totalDocCount, + }, + }, + }, + }; + + const body = { + query, + size: 0, + aggs: { + latency_ranges: { + range: { + field: TRANSACTION_DURATION, + ranges, + }, + }, + // Pearson correlation value + transaction_duration_correlation: { + bucket_correlation: bucketCorrelation, + } as estypes.AggregationsAggregationContainer, + // KS test p value = ks_test.less + ks_test: { + bucket_count_ks_test: { + // Remove 0 after https://github.com/elastic/elasticsearch/pull/74624 is merged + fractions: [0, ...fractions], + buckets_path: 'latency_ranges>_count', + alternative: ['less', 'greater', 'two_sided'], + }, + } as estypes.AggregationsAggregationContainer, + }, + }; + return { + index: params.index, + body, + }; +}; + +export const fetchTransactionDurationCorrelation = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams, + expectations: number[], + ranges: estypes.AggregationsAggregationRange[], + fractions: number[], + totalDocCount: number, + fieldName?: string, + fieldValue?: string +): Promise<{ + ranges: unknown[]; + correlation: number | null; + ksTest: number | null; +}> => { + const resp = await esClient.search( + getTransactionDurationCorrelationRequest( + params, + expectations, + ranges, + fractions, + totalDocCount, + fieldName, + fieldValue + ) + ); + + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationCorrelation failed, did not return aggregations.' + ); + } + + const result = { + ranges: (resp.body.aggregations + .latency_ranges as estypes.AggregationsMultiBucketAggregate).buckets, + correlation: (resp.body.aggregations + .transaction_duration_correlation as estypes.AggregationsValueAggregate) + .value, + // @ts-ignore + ksTest: resp.body.aggregations.ks_test.less, + }; + return result; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_candidates.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_candidates.ts new file mode 100644 index 00000000000000..4f1840971da7d2 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_candidates.ts @@ -0,0 +1,105 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; +import { Field } from './query_field_value_pairs'; +import { + FIELD_PREFIX_TO_ADD_AS_CANDIDATE, + FIELD_PREFIX_TO_EXCLUDE_AS_CANDIDATE, + FIELDS_TO_ADD_AS_CANDIDATE, + FIELDS_TO_EXCLUDE_AS_CANDIDATE, + POPULATED_DOC_COUNT_SAMPLE_SIZE, +} from './constants'; + +const shouldBeExcluded = (fieldName: string) => { + return ( + FIELDS_TO_EXCLUDE_AS_CANDIDATE.has(fieldName) || + FIELD_PREFIX_TO_EXCLUDE_AS_CANDIDATE.some((prefix) => + fieldName.startsWith(prefix) + ) + ); +}; + +const hasPrefixToInclude = (fieldName: string) => { + return FIELD_PREFIX_TO_ADD_AS_CANDIDATE.some((prefix) => + fieldName.startsWith(prefix) + ); +}; + +export const getRandomDocsRequest = ( + params: SearchServiceParams +): estypes.SearchRequest => ({ + index: params.index, + body: { + fields: ['*'], + _source: false, + query: { + function_score: { + query: getQueryWithParams({ params }), + // @ts-ignore + random_score: {}, + }, + }, + // Required value for later correlation queries + track_total_hits: true, + size: POPULATED_DOC_COUNT_SAMPLE_SIZE, + }, +}); + +export const fetchTransactionDurationFieldCandidates = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams +): Promise<{ fieldCandidates: Field[]; totalHits: number }> => { + const { index } = params; + // Get all fields with keyword mapping + const respMapping = await esClient.fieldCaps({ + index, + fields: '*', + }); + + const finalFieldCandidates = new Set(FIELDS_TO_ADD_AS_CANDIDATE); + const acceptableFields: Set = new Set(); + + Object.entries(respMapping.body.fields).forEach(([key, value]) => { + const fieldTypes = Object.keys(value); + const isSupportedType = fieldTypes.some( + (type) => type === 'keyword' || type === 'ip' + ); + // Definitely include if field name matches any of the wild card + if (hasPrefixToInclude(key) && isSupportedType) { + finalFieldCandidates.add(key); + } + + // Check if fieldName is something we can aggregate on + if (isSupportedType) { + acceptableFields.add(key); + } + }); + + const resp = await esClient.search(getRandomDocsRequest(params)); + const sampledDocs = resp.body.hits.hits.map((d) => d.fields ?? {}); + + // Get all field names for each returned doc and flatten it + // to a list of unique field names used across all docs + // and filter by list of acceptable fields and some APM specific unique fields. + [...new Set(sampledDocs.map(Object.keys).flat(1))].forEach((field) => { + if (acceptableFields.has(field) && !shouldBeExcluded(field)) { + finalFieldCandidates.add(field); + } + }); + + return { + fieldCandidates: [...finalFieldCandidates], + totalHits: (resp.body.hits.total as estypes.SearchTotalHits).value, + }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_value_pairs.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_value_pairs.ts new file mode 100644 index 00000000000000..703a203c892072 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_field_value_pairs.ts @@ -0,0 +1,89 @@ +/* + * 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 type { ElasticsearchClient } from 'src/core/server'; + +import type { estypes } from '@elastic/elasticsearch'; + +import type { + AsyncSearchProviderProgress, + SearchServiceParams, +} from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; +import { TERMS_SIZE } from './constants'; + +interface FieldValuePair { + field: string; + value: string; +} +type FieldValuePairs = FieldValuePair[]; + +export type Field = string; + +export const getTermsAggRequest = ( + params: SearchServiceParams, + fieldName: string +): estypes.SearchRequest => ({ + index: params.index, + body: { + query: getQueryWithParams({ params }), + size: 0, + aggs: { + attribute_terms: { + terms: { + field: fieldName, + size: TERMS_SIZE, + }, + }, + }, + }, +}); + +export const fetchTransactionDurationFieldValuePairs = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams, + fieldCandidates: Field[], + progress: AsyncSearchProviderProgress +): Promise => { + const fieldValuePairs: FieldValuePairs = []; + + let fieldValuePairsProgress = 0; + + for (let i = 0; i < fieldCandidates.length; i++) { + const fieldName = fieldCandidates[i]; + // mutate progress + progress.loadedFieldValuePairs = + fieldValuePairsProgress / fieldCandidates.length; + + try { + const resp = await esClient.search(getTermsAggRequest(params, fieldName)); + + if (resp.body.aggregations === undefined) { + fieldValuePairsProgress++; + continue; + } + const buckets = (resp.body.aggregations + .attribute_terms as estypes.AggregationsMultiBucketAggregate<{ + key: string; + }>)?.buckets; + if (buckets.length >= 1) { + fieldValuePairs.push( + ...buckets.map((d) => ({ + field: fieldName, + value: d.key, + })) + ); + } + + fieldValuePairsProgress++; + } catch (e) { + fieldValuePairsProgress++; + } + } + return fieldValuePairs; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_fractions.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_fractions.ts new file mode 100644 index 00000000000000..3d623a4df8c344 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_fractions.ts @@ -0,0 +1,64 @@ +/* + * 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 { ElasticsearchClient } from 'kibana/server'; +import { estypes } from '@elastic/elasticsearch'; +import { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; +import { getQueryWithParams } from './get_query_with_params'; +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; + +export const getTransactionDurationRangesRequest = ( + params: SearchServiceParams, + ranges: estypes.AggregationsAggregationRange[] +): estypes.SearchRequest => ({ + index: params.index, + body: { + query: getQueryWithParams({ params }), + size: 0, + aggs: { + latency_ranges: { + range: { + field: TRANSACTION_DURATION, + ranges, + }, + }, + }, + }, +}); + +/** + * Compute the actual percentile bucket counts and actual fractions + */ +export const fetchTransactionDurationFractions = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams, + ranges: estypes.AggregationsAggregationRange[] +): Promise<{ fractions: number[]; totalDocCount: number }> => { + const resp = await esClient.search( + getTransactionDurationRangesRequest(params, ranges) + ); + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationFractions failed, did not return aggregations.' + ); + } + + const buckets = (resp.body.aggregations + .latency_ranges as estypes.AggregationsMultiBucketAggregate<{ + doc_count: number; + }>)?.buckets; + + const totalDocCount = buckets.reduce((acc, bucket) => { + return acc + bucket.doc_count; + }, 0); + + // Compute (doc count per bucket/total doc count) + return { + fractions: buckets.map((bucket) => bucket.doc_count / totalDocCount), + totalDocCount, + }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram.ts new file mode 100644 index 00000000000000..6f61ecbfdcf081 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram.ts @@ -0,0 +1,70 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; +import type { + HistogramItem, + ResponseHit, + SearchServiceParams, +} from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; + +export const getTransactionDurationHistogramRequest = ( + params: SearchServiceParams, + interval: number, + fieldName?: string, + fieldValue?: string +): estypes.SearchRequest => { + const query = getQueryWithParams({ params, fieldName, fieldValue }); + + return { + index: params.index, + body: { + query, + size: 0, + aggs: { + transaction_duration_histogram: { + histogram: { field: TRANSACTION_DURATION, interval }, + }, + }, + }, + }; +}; + +export const fetchTransactionDurationHistogram = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams, + interval: number, + fieldName?: string, + fieldValue?: string +): Promise => { + const resp = await esClient.search( + getTransactionDurationHistogramRequest( + params, + interval, + fieldName, + fieldValue + ) + ); + + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationHistogram failed, did not return aggregations.' + ); + } + + return ( + (resp.body.aggregations + .transaction_duration_histogram as estypes.AggregationsMultiBucketAggregate) + .buckets ?? [] + ); +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_interval.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_interval.ts new file mode 100644 index 00000000000000..c4d1abf24b4d65 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_interval.ts @@ -0,0 +1,52 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; + +const HISTOGRAM_INTERVALS = 1000; + +export const getHistogramIntervalRequest = ( + params: SearchServiceParams +): estypes.SearchRequest => ({ + index: params.index, + body: { + query: getQueryWithParams({ params }), + size: 0, + aggs: { + transaction_duration_min: { min: { field: TRANSACTION_DURATION } }, + transaction_duration_max: { max: { field: TRANSACTION_DURATION } }, + }, + }, +}); + +export const fetchTransactionDurationHistogramInterval = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams +): Promise => { + const resp = await esClient.search(getHistogramIntervalRequest(params)); + + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationHistogramInterval failed, did not return aggregations.' + ); + } + + const transactionDurationDelta = + (resp.body.aggregations + .transaction_duration_max as estypes.AggregationsValueAggregate).value - + (resp.body.aggregations + .transaction_duration_min as estypes.AggregationsValueAggregate).value; + + return transactionDurationDelta / (HISTOGRAM_INTERVALS - 1); +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_rangesteps.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_rangesteps.ts new file mode 100644 index 00000000000000..e537165ca53f37 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_histogram_rangesteps.ts @@ -0,0 +1,65 @@ +/* + * 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 { scaleLog } from 'd3-scale'; + +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; + +export const getHistogramIntervalRequest = ( + params: SearchServiceParams +): estypes.SearchRequest => ({ + index: params.index, + body: { + query: getQueryWithParams({ params }), + size: 0, + aggs: { + transaction_duration_min: { min: { field: TRANSACTION_DURATION } }, + transaction_duration_max: { max: { field: TRANSACTION_DURATION } }, + }, + }, +}); + +export const fetchTransactionDurationHistogramRangesteps = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams +): Promise => { + const resp = await esClient.search(getHistogramIntervalRequest(params)); + + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationHistogramInterval failed, did not return aggregations.' + ); + } + + const steps = 100; + const min = (resp.body.aggregations + .transaction_duration_min as estypes.AggregationsValueAggregate).value; + const max = + (resp.body.aggregations + .transaction_duration_max as estypes.AggregationsValueAggregate).value * + 2; + + // A d3 based scale function as a helper to get equally distributed bins on a log scale. + const logFn = scaleLog().domain([min, max]).range([1, steps]); + return [...Array(steps).keys()] + .map(logFn.invert) + .map((d) => (isNaN(d) ? 0 : d)); +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_percentiles.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_percentiles.ts new file mode 100644 index 00000000000000..013c1ba3cbc239 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_percentiles.ts @@ -0,0 +1,84 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; +import { SIGNIFICANT_VALUE_DIGITS } from './constants'; + +export interface HistogramItem { + key: number; + doc_count: number; +} + +interface ResponseHitSource { + [s: string]: unknown; +} +interface ResponseHit { + _source: ResponseHitSource; +} + +export const getTransactionDurationPercentilesRequest = ( + params: SearchServiceParams, + percents?: number[], + fieldName?: string, + fieldValue?: string +): estypes.SearchRequest => { + const query = getQueryWithParams({ params, fieldName, fieldValue }); + + return { + index: params.index, + body: { + query, + size: 0, + aggs: { + transaction_duration_percentiles: { + percentiles: { + hdr: { + number_of_significant_value_digits: SIGNIFICANT_VALUE_DIGITS, + }, + field: TRANSACTION_DURATION, + ...(Array.isArray(percents) ? { percents } : {}), + }, + }, + }, + }, + }; +}; + +export const fetchTransactionDurationPecentiles = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams, + percents?: number[], + fieldName?: string, + fieldValue?: string +): Promise> => { + const resp = await esClient.search( + getTransactionDurationPercentilesRequest( + params, + percents, + fieldName, + fieldValue + ) + ); + + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationPecentiles failed, did not return aggregations.' + ); + } + return ( + (resp.body.aggregations + .transaction_duration_percentiles as estypes.AggregationsTDigestPercentilesAggregate) + .values ?? {} + ); +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_ranges.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_ranges.ts new file mode 100644 index 00000000000000..88256f79150fc4 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/query_ranges.ts @@ -0,0 +1,96 @@ +/* + * 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 type { estypes } from '@elastic/elasticsearch'; + +import type { ElasticsearchClient } from 'src/core/server'; + +import { TRANSACTION_DURATION } from '../../../../common/elasticsearch_fieldnames'; +import type { SearchServiceParams } from '../../../../common/search_strategies/correlations/types'; + +import { getQueryWithParams } from './get_query_with_params'; + +export interface HistogramItem { + key: number; + doc_count: number; +} + +interface ResponseHitSource { + [s: string]: unknown; +} +interface ResponseHit { + _source: ResponseHitSource; +} + +export const getTransactionDurationRangesRequest = ( + params: SearchServiceParams, + rangesSteps: number[], + fieldName?: string, + fieldValue?: string +): estypes.SearchRequest => { + const query = getQueryWithParams({ params, fieldName, fieldValue }); + + const ranges = rangesSteps.reduce( + (p, to) => { + const from = p[p.length - 1].to; + p.push({ from, to }); + return p; + }, + [{ to: 0 }] as Array<{ from?: number; to?: number }> + ); + ranges.push({ from: ranges[ranges.length - 1].to }); + + return { + index: params.index, + body: { + query, + size: 0, + aggs: { + logspace_ranges: { + range: { + field: TRANSACTION_DURATION, + ranges, + }, + }, + }, + }, + }; +}; + +export const fetchTransactionDurationRanges = async ( + esClient: ElasticsearchClient, + params: SearchServiceParams, + rangesSteps: number[], + fieldName?: string, + fieldValue?: string +): Promise> => { + const resp = await esClient.search( + getTransactionDurationRangesRequest( + params, + rangesSteps, + fieldName, + fieldValue + ) + ); + + if (resp.body.aggregations === undefined) { + throw new Error( + 'fetchTransactionDurationCorrelation failed, did not return aggregations.' + ); + } + + return (resp.body.aggregations + .logspace_ranges as estypes.AggregationsMultiBucketAggregate<{ + from: number; + doc_count: number; + }>).buckets + .map((d) => ({ + key: d.from, + doc_count: d.doc_count, + })) + .filter((d) => d.key !== undefined); +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/search_strategy.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/search_strategy.ts new file mode 100644 index 00000000000000..d6b4e0e7094b35 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/search_strategy.ts @@ -0,0 +1,94 @@ +/* + * 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 uuid from 'uuid'; +import { of } from 'rxjs'; + +import type { ISearchStrategy } from '../../../../../../../src/plugins/data/server'; +import { + IKibanaSearchRequest, + IKibanaSearchResponse, +} from '../../../../../../../src/plugins/data/common'; + +import type { + SearchServiceParams, + SearchServiceValue, +} from '../../../../common/search_strategies/correlations/types'; + +import { asyncSearchServiceProvider } from './async_search_service'; + +export type PartialSearchRequest = IKibanaSearchRequest; +export type PartialSearchResponse = IKibanaSearchResponse<{ + values: SearchServiceValue[]; +}>; + +export const apmCorrelationsSearchStrategyProvider = (): ISearchStrategy< + PartialSearchRequest, + PartialSearchResponse +> => { + const asyncSearchServiceMap = new Map< + string, + ReturnType + >(); + + return { + search: (request, options, deps) => { + if (request.params === undefined) { + throw new Error('Invalid request parameters.'); + } + + const id = request.id ?? uuid(); + + const getAsyncSearchServiceState = + asyncSearchServiceMap.get(id) ?? + asyncSearchServiceProvider(deps.esClient.asCurrentUser, request.params); + + const { + error, + isRunning, + loaded, + started, + total, + values, + percentileThresholdValue, + overallHistogram, + } = getAsyncSearchServiceState(); + + if (error instanceof Error) { + asyncSearchServiceMap.delete(id); + throw error; + } else if (isRunning) { + asyncSearchServiceMap.set(id, getAsyncSearchServiceState); + } else { + asyncSearchServiceMap.delete(id); + } + + const took = Date.now() - started; + + return of({ + id, + loaded, + total, + isRunning, + isPartial: isRunning, + rawResponse: { + took, + values, + percentileThresholdValue, + overallHistogram, + }, + }); + }, + cancel: async (id, options, deps) => { + const getAsyncSearchServiceState = asyncSearchServiceMap.get(id); + if (getAsyncSearchServiceState !== undefined) { + getAsyncSearchServiceState().cancel(); + asyncSearchServiceMap.delete(id); + } + }, + }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/aggregation_utils.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/aggregation_utils.ts new file mode 100644 index 00000000000000..34e5ae2795d589 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/aggregation_utils.ts @@ -0,0 +1,53 @@ +/* + * 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 { estypes } from '@elastic/elasticsearch'; +import { PERCENTILES_STEP } from '../constants'; + +export const computeExpectationsAndRanges = ( + percentiles: number[], + step = PERCENTILES_STEP +): { + expectations: number[]; + ranges: estypes.AggregationsAggregationRange[]; +} => { + const tempPercentiles = [percentiles[0]]; + const tempFractions = [step / 100]; + // Collapse duplicates + for (let i = 1; i < percentiles.length; i++) { + if (percentiles[i] !== percentiles[i - 1]) { + tempPercentiles.push(percentiles[i]); + tempFractions.push(2 / 100); + } else { + tempFractions[tempFractions.length - 1] = + tempFractions[tempFractions.length - 1] + step / 100; + } + } + tempFractions.push(2 / 100); + + const ranges = percentiles.reduce((p, to) => { + const from = p[p.length - 1]?.to; + if (from) { + p.push({ from, to }); + } else { + p.push({ to }); + } + return p; + }, [] as Array<{ from?: number; to?: number }>); + ranges.push({ from: ranges[ranges.length - 1].to }); + + const expectations = [tempPercentiles[0]]; + for (let i = 1; i < tempPercentiles.length; i++) { + expectations.push( + (tempFractions[i - 1] * tempPercentiles[i - 1] + + tempFractions[i] * tempPercentiles[i]) / + (tempFractions[i - 1] + tempFractions[i]) + ); + } + expectations.push(tempPercentiles[tempPercentiles.length - 1]); + return { expectations, ranges }; +}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/index.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/index.ts new file mode 100644 index 00000000000000..ab6190fb288adc --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/index.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export * from './math_utils'; +export * from './aggregation_utils'; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/math_utils.ts b/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/math_utils.ts new file mode 100644 index 00000000000000..01e856e511fc2c --- /dev/null +++ b/x-pack/plugins/apm/server/lib/search_strategies/correlations/utils/math_utils.ts @@ -0,0 +1,70 @@ +/* + * 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 { range } from 'lodash'; +import { HistogramItem } from '../query_ranges'; +import { asPreciseDecimal } from '../../../../../common/utils/formatters'; + +// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random +export function getRandomInt(min: number, max: number) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1) + min); // The maximum is inclusive and the minimum is inclusive +} + +// Roughly compare histograms by sampling random bins +// And rounding up histogram count to account for different floating points +export const isHistogramRoughlyEqual = ( + a: HistogramItem[], + b: HistogramItem[], + { numBinsToSample = 10, significantFraction = 3 } +) => { + if (a.length !== b.length) return false; + + const sampledIndices = Array.from(Array(numBinsToSample).keys()).map(() => + getRandomInt(0, a.length - 1) + ); + return !sampledIndices.some((idx) => { + return ( + asPreciseDecimal(a[idx].key, significantFraction) !== + asPreciseDecimal(b[idx].key, significantFraction) && + roundToNearest(a[idx].doc_count) !== roundToNearest(b[idx].doc_count) + ); + }); +}; + +/** Round numeric to the nearest 5 + * E.g. if roundBy = 5, results will be 11 -> 10, 14 -> 10, 16 -> 20 + */ +export const roundToNearest = (n: number, roundBy = 5) => { + return Math.ceil((n + 1) / roundBy) * roundBy; +}; + +/** + * Create a rough stringified version of the histogram + */ +export const hashHistogram = ( + histogram: HistogramItem[], + { significantFraction = 3, numBinsToSample = 10 } +) => { + // Generate bins to sample evenly + const sampledIndices = Array.from( + range( + 0, + histogram.length - 1, + Math.ceil(histogram.length / numBinsToSample) + ) + ); + return JSON.stringify( + sampledIndices.map((idx) => { + return `${asPreciseDecimal( + histogram[idx].key, + significantFraction + )}-${roundToNearest(histogram[idx].doc_count)}`; + }) + ); +}; diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index dd422e51550a20..2d3638272508e0 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -28,6 +28,7 @@ import { registerFleetPolicyCallbacks } from './lib/fleet/register_fleet_policy_ import { createApmTelemetry } from './lib/apm_telemetry'; import { createApmEventClient } from './lib/helpers/create_es_client/create_apm_event_client'; import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_objects_client'; +import { apmCorrelationsSearchStrategyProvider } from './lib/search_strategies/correlations'; import { createApmAgentConfigurationIndex } from './lib/settings/agent_configuration/create_agent_config_index'; import { getApmIndices } from './lib/settings/apm_indices/get_apm_indices'; import { createApmCustomLinkIndex } from './lib/settings/custom_link/create_custom_link_index'; @@ -236,6 +237,13 @@ export class APMPlugin logger: this.logger, }); + // search strategies for async partial search results + if (plugins.data?.search?.registerSearchStrategy !== undefined) { + plugins.data.search.registerSearchStrategy( + 'apmCorrelationsSearchStrategy', + apmCorrelationsSearchStrategyProvider() + ); + } return { config$: mergedConfig$, getApmIndices: boundGetApmIndices, diff --git a/x-pack/plugins/ml/server/types.ts b/x-pack/plugins/ml/server/types.ts index 013feb568ca53b..b04b8d86017729 100644 --- a/x-pack/plugins/ml/server/types.ts +++ b/x-pack/plugins/ml/server/types.ts @@ -12,12 +12,17 @@ import type { SecurityPluginSetup } from '../../security/server'; import type { PluginSetupContract as FeaturesPluginSetup } from '../../features/server'; import type { LicensingPluginSetup } from '../../licensing/server'; import type { SpacesPluginSetup, SpacesPluginStart } from '../../spaces/server'; + import type { MlLicense } from '../common/license'; import type { ResolveMlCapabilities } from '../common/types/capabilities'; import type { RouteGuard } from './lib/route_guard'; import type { AlertingPlugin } from '../../alerting/server'; import type { ActionsPlugin } from '../../actions/server'; import type { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/server'; +import type { + PluginSetup as DataPluginSetup, + PluginStart as DataPluginStart, +} from '../../../../src/plugins/data/server'; export interface LicenseCheckResult { isAvailable: boolean; @@ -41,6 +46,7 @@ export interface SavedObjectsRouteDeps { export interface PluginsSetup { cloud: CloudSetup; + data: DataPluginSetup; features: FeaturesPluginSetup; home: HomeServerPluginSetup; licensing: LicensingPluginSetup; @@ -52,6 +58,7 @@ export interface PluginsSetup { } export interface PluginsStart { + data: DataPluginStart; spaces?: SpacesPluginStart; } From 523cd0fbe51f1acbdf2c64a2acb8a0efc94ff7f9 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Tue, 29 Jun 2021 15:25:27 -0400 Subject: [PATCH 119/227] [KibanaPageTemplate] Adds collapsibility to `solutionNav` (#103192) Adds the ability to collapse the sidenav. This should work in all solutions. It also adds breakpoints that turn it into a flyout at lower screen widths. --- .../collapsible_nav.test.tsx.snap | 864 ++------ .../header/__snapshots__/header.test.tsx.snap | 1871 ++++++----------- .../chrome/ui/header/collapsible_nav.test.tsx | 11 +- .../chrome/ui/header/collapsible_nav.tsx | 57 +- src/core/public/chrome/ui/header/header.tsx | 69 +- .../__snapshots__/page_template.test.tsx.snap | 7 + .../public/page_template/page_template.scss | 18 +- .../public/page_template/page_template.tsx | 53 +- .../__snapshots__/solution_nav.test.tsx.snap | 255 +-- .../page_template/solution_nav/index.ts | 4 + .../solution_nav/solution_nav.scss | 34 +- .../solution_nav/solution_nav.tsx | 121 +- .../solution_nav_collapse_button.scss | 33 + .../solution_nav_collapse_button.tsx | 59 + test/functional/page_objects/home_page.ts | 21 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - x-pack/test/accessibility/apps/home.ts | 52 +- 18 files changed, 1152 insertions(+), 2379 deletions(-) create mode 100644 src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_collapse_button.scss create mode 100644 src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_collapse_button.tsx diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index 0b10209bc13e59..a653fbc5e40bda 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -61,6 +61,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` "serverBasePath": "/test", } } + button={
    @@ -1165,6 +1176,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` @@ -1261,12 +1273,12 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` className="euiFlexItem euiFlexItem--flexGrowZero" >
    @@ -1419,6 +1431,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` @@ -1515,12 +1528,12 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` className="euiFlexItem euiFlexItem--flexGrowZero" >
    @@ -1634,6 +1647,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` @@ -1730,12 +1744,12 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` className="euiFlexItem euiFlexItem--flexGrowZero" >
    @@ -1899,95 +1913,97 @@ exports[`CollapsibleNav renders links grouped by category 1`] = ` - + sizes="none" + /> + + + +
    + + +
    -
    - -
      - - - - Dock navigation - - , + "className": "euiButton__text", } } - color="subdued" - data-test-subj="collapsible-nav-lock" - iconType="lockOpen" - label="Dock navigation" - onClick={[Function]} - size="xs" > -
    • - -
    • -
      -
    -
    -
    + + Add Data + + + + + + + +
    - - +
    +
    @@ -2057,6 +2073,7 @@ exports[`CollapsibleNav renders the default nav 1`] = ` "serverBasePath": "/test", } } + button={
    - -
    - -
    -
    -
    - -
    - -
    -

    - No recently viewed items -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - -
    -
    - -
    - - -
    -
    - -
      - - - - Undock navigation - - , - } - } - color="subdued" - data-test-subj="collapsible-nav-lock" - iconType="lock" - label="Undock navigation" - onClick={[Function]} - size="xs" - > -
    • - -
    • -
      -
    -
    -
    -
    -
    -
    -
    -
    - - + , - } + - - - - - - + + } + closeNav={[Function]} + customNavLink$={ + BehaviorSubject { + "_isScalar": false, + "_value": Object { + "baseUrl": "", + "href": "", + "id": "cloud-deployment-link", + "title": "Manage cloud deployment", + "url": "", + }, + "closed": false, + "hasError": false, + "isStopped": false, + "observers": Array [ + Subscriber { + "_parentOrParents": null, + "_subscriptions": Array [ + SubjectSubscription { + "_parentOrParents": [Circular], + "_subscriptions": null, + "closed": false, + "subject": [Circular], + "subscriber": [Circular], + }, + ], "closed": false, - "subject": [Circular], - "subscriber": [Circular], + "destination": SafeSubscriber { + "_complete": undefined, + "_context": [Circular], + "_error": undefined, + "_next": [Function], + "_parentOrParents": null, + "_parentSubscriber": [Circular], + "_subscriptions": null, + "closed": false, + "destination": Object { + "closed": true, + "complete": [Function], + "error": [Function], + "next": [Function], + }, + "isStopped": false, + "syncErrorThrowable": false, + "syncErrorThrown": false, + "syncErrorValue": null, + }, + "isStopped": false, + "syncErrorThrowable": true, + "syncErrorThrown": false, + "syncErrorValue": null, }, ], - "closed": false, - "destination": SafeSubscriber { - "_complete": undefined, - "_context": [Circular], - "_error": undefined, - "_next": [Function], - "_parentOrParents": null, - "_parentSubscriber": [Circular], - "_subscriptions": null, - "closed": false, - "destination": Object { - "closed": true, - "complete": [Function], - "error": [Function], - "next": [Function], + "thrownError": null, + } + } + homeHref="/" + id="mockId" + isLocked={true} + isNavOpen={false} + navLinks$={ + BehaviorSubject { + "_isScalar": false, + "_value": Array [ + Object { + "baseUrl": "", + "href": "", + "id": "kibana", + "title": "kibana", + "url": "", }, - "isStopped": false, - "syncErrorThrowable": false, - "syncErrorThrown": false, - "syncErrorValue": null, - }, - "isStopped": false, - "syncErrorThrowable": true, - "syncErrorThrown": false, - "syncErrorValue": null, - }, - ], - "thrownError": null, - } - } - side="left" - /> - - - - - - - - - - - -
    - -
    - -
    - -
    - -
    - -
    - - - - - - + + + + + +
    -
    - -
    - -
      - -
    • - -
    • -
      -
    -
    -
    -
    -
    - - -
    -
    - -
      - - - - Undock navigation - - , - } - } - color="subdued" - data-test-subj="collapsible-nav-lock" - iconType="lock" - label="Undock navigation" - onClick={[Function]} - size="xs" - > -
    • - -
    • -
      -
    -
    -
    -
    -
    -
    -
    - - - - - + data-test-subj="headerAppActionMenu" + /> + +
    + + +
    + + + `; diff --git a/src/core/public/chrome/ui/header/collapsible_nav.test.tsx b/src/core/public/chrome/ui/header/collapsible_nav.test.tsx index 460770744d53a3..019a3c78203242 100644 --- a/src/core/public/chrome/ui/header/collapsible_nav.test.tsx +++ b/src/core/public/chrome/ui/header/collapsible_nav.test.tsx @@ -56,6 +56,7 @@ function mockProps() { navigateToApp: () => Promise.resolve(), navigateToUrl: () => Promise.resolve(), customNavLink$: new BehaviorSubject(undefined), + button:
  • 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

    8s49mPOTTg!3Kn;zS$BSBsCJjxcFOc1yD>` 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%0DPHJd`UNVD`s@thTSk9y+m2; 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